85.1.12. pepsi-stage-relay-to-maildir¶
deliver a message to local users” Maildirs
- Section du manuel:
1
85.1.12.1.1. Nom¶
pepsi-stage-relay-to-maildir - l’étape de remise locale du pipeline Pepsi.
85.1.12.1.2. Synopsis¶
pepsi-stage-relay-to-maildir [GLOBAL-OPTIONS] worker
85.1.12.1.3. Description¶
pepsi-stage-relay-to-maildir est un programme d’étape exécuté par pepsi-dispatch(1). Il charge la ligne pepsi.workqueue (refusant d’agir si son status n’est pas running), lit sa section [stage-<stage>], et remet le message aux utilisateurs système locaux en l’écrivant dans leur Maildir/new/. Les destinataires qui ne sont pas locaux sont acheminés plus loin.
Pour chaque destinataire d’enveloppe, l’étape décide s’il est local : son domaine doit être listé dans LOCAL_DOMAINS, son nom de boîte aux lettres (le local-part, avec toute sous-adresse après RECIPIENT_DELIMITER retirée, mis en minuscules) doit se résoudre en une entrée passwd, et l’uid de cet utilisateur doit être autorisé par TARGETS. Un destinataire local est remis dans son Maildir. Une recherche passwd qui échoue (un backend LDAP ou sssd hors service) ne signifie pas « utilisateur inexistant » : le message entier est réessayé avant que quoi que ce soit ne soit remis (une minute, doublant jusqu’à une heure, jusqu’à MAX_LIFETIME ; voir pepsi-dispatch(1)), plutôt que de renvoyer en rebond des utilisateurs locaux comme boîtes aux lettres inconnues.
Tout autre destinataire est acheminé plus loin, et vers où dépend de pourquoi il n’est pas local :
Un destinataire sur le domaine de quelqu’un d’autre est une redirection — typiquement un alias qui se développe hors du site (
alice@example.org→alice@example.net). Il part vers NEXT_STAGE, qui devrait atteindre un relais. Faites-le passer d’abord par pepsi-stage-srs(1), afin que l’expéditeur d’enveloppe redirigé passe encore la vérification SPF du saut suivant.Un destinataire sur l’un de nos propres LOCAL_DOMAINS qui ne se résout vers aucun compte autorisé est une boîte aux lettres inconnue. Il part vers UNKNOWN_MAILBOX_STAGE, qui devrait atteindre une étape de rebond.
Les distinguer a son importance : envoyer une boîte aux lettres locale inconnue vers un relais reviendrait à rechercher le MX de notre propre domaine, à trouver cet hôte même, et à nous réexpédier le message directement — une boucle qui ne s’arrête que lorsque le MAX_HOP_COUNT du relais la coupe, soit une douzaine de passages inutiles dans tout le pipeline alors que le message aurait simplement dû être rejeté.
Un seul message peut donc être partiellement remis : les destinataires locaux sont écrits dans leurs Maildirs et les destinataires restants sont scindés sur une ou plusieurs nouvelles lignes pending à leur destination. Deux adresses qui se résolvent vers le même utilisateur local ne donnent lieu qu’à une seule remise.
Tout ce qu’une passe décide est écrit en une seule instruction après les remises : les destinataires non locaux détachés, les notifications de succès et d’échec créées, et le message soit supprimé, soit réduit aux destinataires restant à réessayer. La remise est au moins une fois : lorsque cette instruction ne peut être écrite (la base de données est injoignable), ou que le worker meurt entre une écriture Maildir et elle, le réessai remet à nouveau aux destinataires déjà écrits, et l’utilisateur voit le message deux fois. Le format Maildir n’offre aucun moyen de reprendre une remise, et un doublon est préférable à un message perdu.
La remise elle-même est effectuée par le helper privilégié pepsi-helper-maildir-writer(1) : l’étape le lance une fois par destinataire local avec l’uid cible comme argument et le message envoyé par tube sur l’entrée standard, et le helper — s’exécutant setuid-root — abandonne ses privilèges vers cet utilisateur pour créer le fichier. Le message remis au helper a un Return-Path:, un Delivered-To: (protection contre les boucles) et un en-tête de trace Received: ajoutés en tête.
Ce qui se passe lorsque le helper signale un échec pour un destinataire dépend de si réessayer peut servir à quelque chose, ce que le helper indique dans son code de sortie (voir pepsi-helper-maildir-writer(1)) :
Les échecs transitoires (code 1 — un disque plein, une erreur d’E/S, un helper pas encore installé setuid-root ou dont le noyau a refusé le passage à l’utilisateur, une recherche passwd qui échoue ou ne trouve aucune entrée pour l’uid) sont mis en pause et réessayés avec un backoff exponentiel (remis en file par pepsi-dispatch(1) lorsque le timeout s’écoule) jusqu’à MAX_LIFETIME, et seulement alors acheminés vers BOUNCE_STAGE : un administrateur peut réparer un tel défaut sous le message en file d’attente, le message attend donc.
Les échecs permanents (code 2 — la boîte aux lettres elle-même est inutilisable : un Maildir qui n’est pas un répertoire, une propriété ou un mode qui en exclut l’utilisateur, un répertoire personnel absent) sont acheminés vers BOUNCE_STAGE
immédiatement, et journalisés en ERROR en nommant le destinataire et le diagnostic du helper. Aucune nouvelle tentative ne pourrait remettre un tel message, et le garder en file pendant MAX_LIFETIME (des jours) masquerait une boîte aux lettres cassée à l’expéditeur et au postmaster. Le rebond porte le diagnostic propre au helper, de sorte que le DSN indique ce qui ne va vraiment pas avec le compte.
Au-delà du quota (code 3) n’est ni l’un ni l’autre, et relève de la politique du site plutôt que du jugement de cette étape : voir ci-dessous.
Dans les deux cas le DSN honore le NOTIFY de l’expéditeur, et un message qui est lui-même un rebond (expéditeur nul) n’est jamais rebondi à nouveau. Lorsque le [pepsi] ORIGINATE_SUCCESS_DSN global est activé et qu’un destinataire a demandé NOTIFY=SUCCESS, un DSN positif est généré à la remise locale réussie.
85.1.12.1.4. Quota de boîte aux lettres¶
Lorsqu’un quota s’applique à un destinataire — depuis [pepsi] MAILBOX_QUOTA, ou depuis la ligne pepsi.mailbox_quota propre à ce compte —, l’étape décide, par message et par destinataire, si le helper doit mesurer la boîte aux lettres avant d’y écrire. Elle le fait à partir de l’estimation courante de la même table : la dernière mesure plus tout ce que Pepsi a remis depuis. Comme rien ne soustrait jamais de cette estimation (on n’indique pas à Pepsi qu’un utilisateur supprime du courrier par IMAP), c’est une borne supérieure — de sorte qu’une estimation disant qu’il reste de la place est une preuve qu’il en reste, et ce n’est que lorsqu’elle dit que le compte pourrait être proche que le helper parcourt l’arborescence. Une boîte aux lettres loin de sa limite coûte un petit ajout par remise.
Un helper qui signale la boîte aux lettres pleine (code 3) laisse le sort du destinataire à [pepsi] MAILBOX_OVER_QUOTA :
defer(la valeur par défaut)Le message reste en file et est réessayé exactement comme un échec transitoire, jusqu’à MAX_LIFETIME, et ne rebondit qu’alors. Un
EDQUOTdu noyau est traité de la même façon. Différer laisse au compte le temps de faire de la place — une boîte aux lettres brièvement pleine est bien plus fréquente qu’une boîte qui le reste.bounceLe destinataire est acheminé aussitôt vers QUOTA_LIMIT_STAGE avec un
5.2.2RFC 3463 (boîte pleine), de sorte que l’expéditeur l’apprend immédiatement plutôt que des jours plus tard.
Chaque mesure signalée par le helper est réécrite, et c’est ce qui permet à pepsi-ingress(1) de refuser au RCPT un destinataire au-delà de son quota — le MTA émetteur y est encore en ligne, il prévient donc son propre utilisateur, et Pepsi ne génère aucun backscatter. Voir pepsi-quota(1) pour la vue de l’opérateur et pour le balayage de réconciliation qui garde ces mesures fraîches.
Un message qui est lui-même un rebond n’est pas exempté : il est refusé comme tout autre et, parce qu’un rebond n’est jamais rebondi à nouveau, abandonné avec un avertissement. C’est correct — l’alternative est une boucle — mais c’est du courrier qui disparaît : la ligne de journal qui le nomme est celle à surveiller.
85.1.12.1.5. Arguments et sous-commandes¶
- worker
Exécuté comme un worker persistant de pepsi-dispatch(1), lisant les identifiants de message sur l’entrée standard et écrivant une ligne de statut pour chacun. C’est ainsi que le dispatcher exécute l’étape en production.
85.1.12.1.6. Configuration¶
Lu depuis la section [stage-<stage>] du message :
- PROGRAM
Doit être
pepsi-stage-relay-to-maildir.- SERVER_NAME (obligatoire)
Le nom d’hôte enregistré dans l’en-tête de trace
Received:ajouté en tête.- TARGETS
Quels comptes locaux peuvent recevoir du courrier, sous forme d’une liste séparée par virgules/espaces de : un nom d’utilisateur (
alice) ; un uid (452) ; une plage d’uid inclusive (1000-1100) ; ou une plage d’uid ouverte (10000-, tout uid égal ou supérieur à la borne). Un jeton n’est lu comme une plage que lorsque les deux parties séparées par un trait d’union sont numériques, de sorte qu’un nom d’utilisateur avec trait d’union (pepsi-maildir) est sans ambiguïté. Lorsqu’il n’est pas défini, il vaut par défaut la plage d’uid ordinaires (non système) de/etc/login.defs(UID_MIN..``UID_MAX``), avec un repli sur1000-60000. Indépendamment de TARGETS, pepsi-helper-maildir-writer(1) refuse tout uid inférieur àUID_MIN: un jeton nommant un compte système (comme le452ci-dessus, sur un hôte oùUID_MINvaut 1000) fait donc échouer définitivement la remise vers ce compte ; pepsi-setup(1) avertit d’un tel jeton.- LOCAL_DOMAINS
Domaines séparés par espaces/virgules dont les destinataires sont éligibles à la remise locale. Par défaut
[pepsi-ingress] ACCEPTED_DOMAINS.- RECIPIENT_DELIMITER
Le séparateur de sous-adresse (
alice+listsremet dans la boîte aux lettresalice). Vaut par défaut[pepsi] RECIPIENT_DELIMITERet, à défaut,+; mettez-le ànonepour désactiver le retrait des sous-adresses. Préférez régler celui de[pepsi]: pepsi-ingress(1) utilise cette valeur pour déterminer à quel quota de boîte aux lettres appartient un destinataire, et n’a pas de section d’étape à lire. pepsi-setup(1) avertit lorsqu’une étape le redéfinit, car le courrier sous-adressé échappe alors au refus au moment duRCPT.- HELPER
Le helper de remise privilégié à exécuter. Vaut par défaut
pepsi-helper-maildir-writer(résolu sur le$PATH) ; indiquez un chemin absolu pour le redéfinir.- NEXT_STAGE
Où les destinataires sur d”autres domaines sont redirigés. Obligatoire chaque fois qu’un message peut avoir de tels destinataires. L’assistant le câble vers la fin de chaîne du relais SRS (
srs→ le smarthost, ousrs→ la remise directe vers les MX d’Internet lorsqu’aucun smarthost n’est configuré), de sorte qu’un alias qui se développe hors du site soit réellement remis.- UNKNOWN_MAILBOX_STAGE
Où part un destinataire sur l’un de nos propres LOCAL_DOMAINS lorsqu’il ne se résout vers aucun compte autorisé. Vaut NEXT_STAGE par défaut, ce qui est correct lorsque NEXT_STAGE est lui-même une étape de rebond ou un smarthost qui détient les comptes du domaine. Réglez-le explicitement (l’assistant le règle sur l’étape de rebond) dès que NEXT_STAGE atteint un relais, faute de quoi le courrier destiné à un utilisateur local inconnu est relayé vers le propre MX de cet hôte et boucle jusqu’à MAX_HOP_COUNT.
- BOUNCE_STAGE
L’étape de génération de DSN vers laquelle un destinataire est acheminé lorsque sa boîte aux lettres est définitivement inutilisable, ou une fois qu’un échec transitoire a été réessayé au-delà de MAX_LIFETIME.
- QUOTA_LIMIT_STAGE
Où va un destinataire lorsque sa boîte aux lettres est pleine et que
[pepsi] MAILBOX_OVER_QUOTAvautbounce. Vaut BOUNCE_STAGE par défaut. Nommée et utilisée exactement comme l’option homonyme de pepsi-stage-relay-to-lmtp(1), qui achemine lex.2.2qu’un MDA signale pour la même condition : quel que soit le chemin de remise locale qu’un site emploie, l’opérateur configure une seule chose.- RETRY_INITIAL, RETRY_MAX_INTERVAL, RETRY_FACTOR, MAX_LIFETIME
Le cadençage de réessai et d’abandon pour une écriture locale échouée de manière transitoire (même signification que dans les étapes de relais) ; une boîte aux lettres définitivement inutilisable rebondit aussitôt et n’attend jamais ces délais. Les durées utilisent les unités
h/m/s. Valeurs par défaut :5 m,2 h,2et120 h.
85.1.12.1.7. Installation et privilèges¶
Pour atteindre le helper setuid-root, pepsi-stage-relay-to-maildir doit lui-même être installé set-group-id au groupe pepsi-maildir (mode 2550, propriétaire pepsi:pepsi-maildir — exécutable par le propriétaire et non par tout le monde, car le bit setgid est la barrière devant le helper setuid-root ; le droit d’exécution ne peut pas non plus venir des bits de groupe, pepsi n’étant délibérément pas membre du groupe, il vient donc du propriétaire). pepsi-dispatch(1) exécute l’étape en tant qu’utilisateur de service pepsi non privilégié ; le bit setgid donne au worker un gid effectif de pepsi-maildir, ce qui est exactement ce qui lui permet d’exécuter le pepsi-helper-maildir-writer(1) restreint au groupe — et rien d’autre sur l’hôte n’obtient cette capacité. make install met cela en place (son étape install-maildir-stage), à condition d’être exécuté en tant que root et que le groupe pepsi-maildir existe ; sinon il imprime les commandes exactes à exécuter à la main.
Le bit setgid étant cette barrière, le programme énonce lui-même la même règle : à moins que l’utilisateur réel ne soit root ou le compte de service pepsi, il sort en erreur avant qu’aucune configuration ne soit lue et — comme les étapes de cryptographie setuid — il retire les variables d’environnement qui pilotent le chargement de la configuration (HOME, XDG_CONFIG_HOME, PG*, TALER_*, PEPSI_*) et fixe PATH à une valeur par défaut sûre. Un mode de fichier est un fait de déploiement et ceci est un fait de programme ; ni l’un ni l’autre n’est censé tenir seul.
85.1.12.1.8. Voir aussi¶
pepsi-helper-maildir-writer(1), pepsi-quota(1), pepsi-stage-relay-to-smarthost(1), pepsi-stage-relay-to-internet(1), pepsi-stage-bounce(1), pepsi-dispatch(1), pepsi.conf(5), pepsi.state(7), maildir(5)
85.1.12.1.9. Bogues¶
Signalez les bogues au gestionnaire de tickets de Pepsi.