85.1.27. pepsi-stage-reencrypt

seal decrypted inbound mail to the recipient’s own key before filing it

Section du manuel:

1

85.1.27.1.1. Nom

pepsi-stage-reencrypt - l’étape de rechiffrement pour le stockage du pipeline Pepsi.

85.1.27.1.2. Synopsis

pepsi-stage-reencrypt [GLOBAL-OPTIONS] worker

85.1.27.1.3. Description

pepsi-stage-reencrypt est un programme d’étape exécuté par pepsi-dispatch(1) comme un worker persistant lisant les identifiants de message sur l’entrée standard. Il charge cette ligne pepsi.workqueue (refusant d’agir sauf si son status est running) et lit sa section [stage-<stage>].

pepsi-stage-decrypt(1) ouvre le courrier chiffré pour la clé de passerelle (MTA) d’un utilisateur, afin que les étapes de langue, de spam, de whitelist et d’apprentissage de clés puissent le lire. Le texte clair est alors ce qui serait classé dans la boîte aux lettres. Cette étape s’exécute après tous ces lecteurs et remet le message sous chiffrement — pour la clé que l’utilisateur a enregistrée pour son propre client de messagerie (une ligne custody = client dans pepsi.crypto_identity, la clé MUA, enregistrée avec pepsi-keys(1) identity import, les commandes de clés par e-mail, ou apprise de l’en-tête Autocrypt: des propres soumissions de l’utilisateur). Ce qui est classé est alors un texte chiffré que seul ce client peut ouvrir.

Elle n’agit que sur un message que l’étape de déchiffrement a ouvert : state.crypto.in doit indiquer qu’il est arrivé chiffré et qu’il a été déchiffré. Le courrier arrivé en clair n’est jamais touché (le sceller revendiquerait une confidentialité qu’il n’a jamais eue sur le réseau), et le courrier que le déchiffrement a laissé fermé parce qu’il était déjà chiffré pour la clé MUA (for_client) n’a besoin de rien. Seuls les destinataires que cet hôte sert sont pris en compte ; un destinataire vers lequel un alias a été développé chez un autre fournisseur est laissé tel quel.

Pour chaque destinataire local, la clé MUA active la plus récente capable de recevoir du chiffrement est utilisée, quel que soit son protocole (OpenPGP ou S/MIME). Un message à plusieurs destinataires dont le traitement diffère est d’abord scindé en une ligne par destinataire (state.dsn.rcpt découpé en phase), puisque chaque copie est scellée pour la clé d’une seule personne.

85.1.27.1.4. Où la placer

Immédiatement avant la remise locale (pepsi-stage-relay-to-maildir(1), pepsi-stage-relay-to-lmtp(1)), et donc :

  • après pepsi-stage-decrypt(1) — avant lui rien n’a été ouvert, de sorte que l’étape ne fait que laisser passer le courrier ;

  • après chaque étape qui lit le contenu : détection et blocage de langue, les filtres de whitelist et de pay-to-send, pepsi-stage-autocrypt-learn(1) (qui lit le gossip dans le texte clair), pepsi-stage-vacation(1) ;

  • après pepsi-stage-aliases(1) et pepsi-stage-dot-forward(1) — une copie redirigée ailleurs ne doit pas partir scellée pour la clé d’un utilisateur local, que son nouveau destinataire ne peut pas ouvrir.

pepsi-setup(1) avertit lorsqu’aucune étape de déchiffrement n’y mène, et lorsqu’elle mène à l’une des étapes ci-dessus. Notez que le script Sieve d’un serveur LMTP voit le message scellé : les règles portant sur le corps (ou, avec PROTECT_HEADERS, sur le sujet) ne correspondent plus.

85.1.27.1.5. Ce qu’elle écrit

Le découpage de l’enveloppe est celui qu’utilise pepsi-stage-encrypt(1). Les champs Content-* et Autocrypt-Gossip: (Autocrypt Level 1 §5.3) vont à l’intérieur du texte chiffré ; tout le reste demeure dans le bloc extérieur — Received:, From:/To:/Date:/Message-ID:, l’en-tête Autocrypt: propre à l’expéditeur (un client doit le lire avant de pouvoir déchiffrer quoi que ce soit), les champs DKIM/ARC, et X-Pepsi-Crypto, le verdict de la passerelle sur la manière dont le message est arrivé. Avec PROTECT_HEADERS, les champs RFC 5322 sont aussi copiés à l’intérieur et le Subject extérieur devient ....

Aucune signature n’est ajoutée. Le verdict sur la signature de l’expéditeur a été établi par l’étape de déchiffrement et est enregistré dans state.crypto.in et dans X-Pepsi-Crypto ; une signature de la passerelle dirait seulement « la passerelle a scellé ceci », ce qu’un client de messagerie ne peut pas distinguer d’une paternité. Une signature de l’expéditeur qui a survécu au déchiffrement sous forme de couche MIME (S/MIME, ou multipart/signed PGP/MIME à l’intérieur du texte chiffré) se trouve dans le texte clair : elle est donc scellée avec lui et se vérifie toujours dans le client ; une signature OpenPGP empaquetée dans le même flux que le chiffrement a été consommée par le déchiffrement et ne peut pas être reconstruite, de sorte que le client affiche alors un message non signé et l’en-tête de verdict de la passerelle.

Le conteneur suit [pepsi] CRYPTO_ALLOW_DOWNGRADE exactement comme pour le chiffrement sortant (voir pepsi.conf(5)).

85.1.27.1.6. Sans clé

ON_NO_CLIENT_KEY décide de ce qui arrive à un destinataire local sans clé MUA utilisable — aucune enregistrée, ou une pour laquelle on ne peut pas sceller (un certificat expiré, un conteneur que la politique refuse ; ce cas est aussi journalisé comme avertissement) :

plaintext (par défaut)

Classer le texte clair, exactement comme sans cette étape.

bounce

Refuser le message : l’acheminer vers BOUNCE_STAGE avec le statut étendu 5.7.5 (RFC 3463, échec cryptographique). La DSN renvoyée ne porte ni le corps ni aucun en-tête que l’expéditeur aurait pu protéger — le bloc d’en-têtes est réduit à From, Sender, To, Cc, Date et Message-ID, le corps est vidé et RET=HDRS est imposé quoi que l’expéditeur ait demandé — parce que l’expéditeur a chiffré le message et qu’une DSN voyage en clair. Sans BOUNCE_STAGE, la ligne passe à failed à la place (et pepsi-setup(1) refuse cette combinaison).

Un refus génère un bounce plutôt que de différer, à dessein : un report garderait le texte clair dans la file d’attente pendant toute la durée de vie du message — une exposition plus longue, non plus courte — et rien ne le réveillerait lorsqu’une clé serait enregistrée.

L’option est lue à travers la couche de surcharge par adresse, de sorte que la valeur par défaut du site dans la section peut être changée pour un destinataire avec pepsi-settings(1)

pepsi-settings set bob@example.org reencrypt ON_NO_CLIENT_KEY bounce

85.1.27.1.7. Configuration

Les options résident dans la propre section [stage-<name>] de l’étape (voir pepsi.conf(5)) :

NEXT_STAGE (obligatoire)

Remise locale.

BOUNCE_STAGE

Où va un refus ; requis lorsque ON_NO_CLIENT_KEY vaut bounce dans la section, et conseillé dès qu’une surcharge par adresse pourrait le dire.

ON_NO_CLIENT_KEY = plaintext | bounce

Voir Sans clé. Par défaut plaintext.

PROTECT_HEADERS = yes | no

Copie les champs RFC 5322 à l’intérieur du texte chiffré et remplace le Subject extérieur par ... (par défaut no, comme pepsi-stage-encrypt(1) : la prise en charge par les clients est inégale, et un client qui ne sait pas regarder à l’intérieur affiche chaque sujet comme ...).

ENABLED = yes | no

Désactivée, chaque message est transmis inchangé. Par défaut yes.

LOCAL_DOMAINS, TARGETS, RECIPIENT_DELIMITER, REQUIRE_ACCOUNT

Quels destinataires cet hôte sert, avec la signification et les valeurs par défaut de pepsi-stage-decrypt(1) (LOCAL_DOMAINS se rabat sur [pepsi-ingress] ACCEPTED_DOMAINS).

L’étape est non privilégiée et intégrée au binaire multi-appel pepsi : sceller pour une clé publique ne nécessite aucun matériel privé, et elle ne lit que les colonnes publiques de pepsi.crypto_identity, que le rôle de pipeline ordinaire pepsi peut lire.

85.1.27.1.8. État

Entrées : state.crypto.in.encrypted, state.crypto.in.decrypted et state.crypto.in.for_client, écrits par pepsi-stage-decrypt(1).

Sorties : state.crypto.store, dont la présence empêche aussi l’étape de sceller une ligne deux fois :

outcome

reencrypted, plaintext ou bounced.

protocol, fingerprint, container, downgraded

Pour reencrypted : quelle clé MUA a été utilisée et le conteneur émis.

reason

Pour plaintext/bounced : no-client-key, not-local ou l’erreur de scellement.

La disposition de l’état est décrite dans pepsi.state(7).

Transitions : avance vers NEXT_STAGE ; réachemine vers BOUNCE_STAGE (ou échoue en son absence) sous ON_NO_CLIENT_KEY = bounce ; rend une ligne à plusieurs destinataires à la file d’attente après l’avoir scindée.

85.1.27.1.9. Commandes

worker

Exécuté comme un worker persistant de pepsi-dispatch(1), lisant les identifiants de message sur l’entrée standard.

85.1.27.1.10. Options globales

-c FILE, –config FILE

Lit la configuration depuis FILE au lieu de parcourir les emplacements par défaut.

-L LOGLEVEL, –log LOGLEVEL

Règle la verbosité de journalisation (par défaut info).

-v, –verbose

Affiche les messages de journal de toutes les sources.

-h, –help ; -V, –version

Affiche un résumé d’utilisation / la version et quitte.

85.1.27.1.11. Code de sortie

0

Le message a été traité et transmis.

1

Une erreur s’est produite (message introuvable ou non running, étape mal configurée, erreur de base de données). La raison est écrite dans le journal.

78

Le worker a refusé de démarrer : sa section ou la politique cryptographique de [pepsi] ne s’analyse pas. Le dispatcher remet en file ce qu’il lui avait confié et réessaie l’étape plus tard. Une erreur de base de données pendant le traitement d’un message est réessayée comme toute autre défaillance de cet hôte (voir pepsi-dispatch(1)).

85.1.27.1.12. Exemples

Rechiffrer le message 42 (il doit être running)

echo 42 | pepsi-stage-reencrypt -c /etc/pepsi/pepsi.conf worker

La fin d’un pipeline entrant

[stage-dot-forward]
PROGRAM = pepsi-stage-dot-forward
NEXT_STAGE = reencrypt

[stage-reencrypt]
PROGRAM = pepsi-stage-reencrypt
NEXT_STAGE = local
BOUNCE_STAGE = bounce

Ne jamais classer de courrier lisible pour personne, et masquer aussi les sujets

[stage-reencrypt]
PROGRAM = pepsi-stage-reencrypt
NEXT_STAGE = local
BOUNCE_STAGE = bounce
ON_NO_CLIENT_KEY = bounce
PROTECT_HEADERS = yes

85.1.27.1.13. Voir aussi

pepsi-stage-decrypt(1), pepsi-stage-encrypt(1), pepsi-keys(1), pepsi-settings(1), pepsi-stage-relay-to-maildir(1), pepsi-stage-relay-to-lmtp(1), pepsi-dispatch(1), pepsi.conf(5), pepsi.state(7), pepsi-setup(1)

85.1.27.1.14. Bogues

Signalez les bogues au gestionnaire de tickets de Pepsi.