85.1.57. pepsi-helper-mailbox-scan¶
list the addresses a mailbox’s owner has written to
- Section du manuel:
1
85.1.57.1.1. Nom¶
pepsi-helper-mailbox-scan - extrait les adresses des correspondants d’une boîte aux lettres.
85.1.57.1.2. Synopsis¶
pepsi-helper-mailbox-scan (–local-domain DOMAIN | –own-address ADDRESS)… [OPTIONS] PATH…
pepsi-helper-mailbox-scan (–local-domain DOMAIN | –own-address ADDRESS)… –imap URL –imap-password-stdin
pepsi-helper-mailbox-scan (–local-domain DOMAIN | –own-address ADDRESS)… –doveadm-stdin
85.1.57.1.3. Description¶
pepsi-helper-mailbox-scan lit une boîte aux lettres et affiche, une par ligne, les adresses auxquelles son propriétaire a envoyé du courrier. C’est la moitié « analyse » de la sous-commande import de pepsi-whitelist(1), qui le lance et transforme sa sortie en lignes pepsi.whitelist ; il peut aussi être exécuté à la main, puisque sa sortie est un protocole de lignes étiquetées trivialement analysable (voir Sortie ci-dessous) et lisible tel quel.
Un message compte comme « envoyé par nous » lorsque les deux conditions suivantes sont réunies.
Son From: — ou son Sender:, pour le courrier soumis pour le compte de quelqu’un d’autre — est à l’un des domaines –local-domain ; ou, lorsque –own-address est fourni, il est exactement l’une de ces adresses. (Les deux sont des alternatives, pas une union : nommer une seule own-address bascule entièrement le test d’expéditeur sur cette liste, et les domaines ne servent alors qu’à décider quels destinataires sont écartés comme locaux.) Et son bloc d’en-têtes ne porte aucun champ Received:, Return-Path:, Delivered-To: ni X-Original-To:.
La seconde condition est ce qui donne un sens à la première. From: n’est pas authentifié : n’importe qui peut y mettre votre adresse, et un tel message se trouve dans votre INBOX en ressemblant exactement à du courrier que vous auriez envoyé ; analyser une boîte de réception sur le seul test du From: laisse donc un inconnu choisir les adresses qui finissent dans votre liste blanche. Ces quatre champs sont écrits par un MTA ou un MDA de réception et jamais par un client de messagerie qui compose un message : leur présence prouve donc que le message est arrivé ici, quoi que dise son From:. Ce qui reste est la copie que votre client a classée après l’avoir composée, ce qu’une analyse est censée lire. L’endroit où cette copie réside n’a pas d’importance : une analyse Maildir parcourt toute l’arborescence, de sorte que ~/Maildir couvre .Sent et tous les dossiers d’archives. Un simple spool /var/mail/, qui ne contient que du courrier reçu, ne donne rien.
Les adresses To:, Cc: et Bcc: de tels messages sont les correspondants ; les adresses à un domaine local sont omises, car un expéditeur local ne passe jamais par la barrière de liste blanche entrante. Les adresses sont dédupliquées, mises en minuscules et vérifiées syntaxiquement, et chacune n’est affichée qu’une fois au plus.
Seul le bloc d’en-têtes de chaque message est lu : chaque lecteur s’arrête à la ligne vide qui termine les en-têtes, et les corps des messages ne sont jamais touchés. Le bloc entier comme chacune de ses lignes sont plafonnés à –max-header-bytes, de sorte qu’un seul message absurde ne peut pas amener l’analyse à allouer sans limite.
Deux choses croissent bien avec le travail au lieu d’être constantes. L’ensemble des adresses de correspondants distinctes est gardé en mémoire (c’est ce que signifie la déduplication) : il est donc proportionnel au nombre de personnes à qui l’on a écrit — pas à la taille de la boîte aux lettres. Et –doveadm-stdin est la seule entrée qui peut mettre en tampon la totalité de sa source : Dovecot peut émettre son résultat comme un unique tableau JSON de premier niveau, qui est analysé comme une seule valeur.
85.1.57.1.3.1. Pourquoi il s’agit d’un programme séparé et non privilégié¶
C’est le seul programme pepsi-helper-* autonome qui ne porte aucun bit setuid ni setgid (mode 0755). Les trois autres programmes autonomes — pepsi-helper-maildir-writer(1), pepsi-helper-dot-forward(1) et pepsi-helper-auto-pay(1) — sont installés setuid-root et restreints par groupe (mode 4750). (pepsi-helper-token-refresh(1) ne détient aucun privilège non plus, mais il est plié dans le binaire unifié pepsi au lieu d’être installé comme un programme à part entière.)
La raison est le sens du privilège. pepsi-whitelist(1) est setuid parce qu’il a besoin d’une identité de base de données, et un processus setuid conserve son propriétaire dans le set-user-id sauvegardé et peut le regagner à tout moment. Analyser une boîte aux lettres est le type de travail inverse : cela traite des mégaoctets de RFC 5322 contrôlés par un attaquant — chaque message que quiconque a jamais envoyé à l’utilisateur — et cela ne demande aucun privilège au-delà de celui de l’utilisateur lui-même. L’analyse s’exécute donc ici, dans un processus que pepsi-whitelist lance avec setresuid réglant les ids réel, effectif et sauvegardé sur l’utilisateur cible. Ne gardant plus aucun id privilégié dans ses identifiants, ce programme ne peut pas devenir le compte de liste blanche, ne peut pas atteindre la base de données, et ne peut rien lire que l’utilisateur ne puisse de toute façon lire lui-même.
85.1.57.1.4. Options¶
- –local-domain DOMAIN
Un domaine dont les expéditeurs comptent comme « nous ». Répétable. Au moins un –local-domain ou –own-address est requis — sans cela, aucun message ne peut être reconnu comme envoyé par nous.
- –own-address ADDRESS
Ne compte comme nôtre que le courrier provenant de cette adresse exacte, plutôt que de n’importe quel expéditeur à un domaine local. Répétable.
- –include-delivered
Abandonne le test de trace de remise et compte un message comme nôtre sur son seul
From:.Cela n’est pas sûr sur une boîte aux lettres qui contient du courrier reçu : un
From:falsifié suffit alors à faire passer un message entrant pour un message envoyé, et ses adressesTo:deviennent des entrées de liste blanche. L’option existe pour le stockage inhabituel dont les copies envoyées sont réellement passées par la remise — un fournisseur qui classe dansSentsa propre copie porteuse d’unReceived:— et ne doit être pointée que sur ce dossier, jamais sur une boîte de réception.- –format
auto|mbox|maildir Format des chemins donnés.
auto(la valeur par défaut) traite un répertoire comme une arborescence Maildir et un fichier comme un mbox.Un mbox est découpé sur les lignes
From `` qui se trouvent au début du fichier ou directement après une ligne vide. Un Maildir est lu depuis ``cur/etnew/(jamaistmp/, dont les fichiers peuvent n’être écrits qu’à moitié), et tout répertoire situé sous celui indiqué qui contient lui-mêmecur/ounew/est également analysé — ainsi la disposition Maildir++ (.Sent,.Archive.2025) est couverte sans nommer chaque dossier.- –imap URL
Analyse un stockage distant au lieu de fichiers.
imaps://user@host[:port]/[PATTERN]utilise TLS implicite (port 993),imap://utiliseSTARTTLS(port 143), etimap+plain://désactive complètement TLS (ce qui envoie le mot de passe en clair, et n’a de sens que contre un serveur de test en loopback). PATTERN est un motif de boîte aux lettres IMAP,*par défaut.Le certificat du serveur est toujours vérifié contre le magasin de confiance système. Les boîtes aux lettres sont ouvertes avec
EXAMINE(lecture seule) et seulBODY.PEEK[HEADER]est récupéré, de sorte qu’une analyse ne marque pas les messages\Seenet ne change rien d’autre.- –imap-user NAME
Le login IMAP, s’il n’est pas dans l’URL.
- –imap-password-file FILE
Lit le mot de passe depuis la première ligne de FILE, qui ne doit accorder aucun accès à son groupe ni aux autres utilisateurs (par exemple le mode
0600).- –imap-password-stdin
Lit le mot de passe depuis la première ligne de l’entrée standard. C’est ainsi que pepsi-whitelist(1) le transmet, de sorte qu’il n’apparaît jamais dans une ligne de commande où d’autres utilisateurs pourraient le lire dans
ps.- –doveadm-stdin
Lit un flux
doveadm -f json fetch -uLOGINhdr mailbox '*' alldepuis l’entrée standard au lieu d’ouvrir des fichiers. Utilisé pour les formats de courrier propres à Dovecot (mdbox/sdbox) : l’appelant exécute ledoveadmprivilégié, et seule sa sortie franchit la frontière vers ce processus non privilégié. Le JSON est nécessaire parce qu’un bloc d’en-têtes contient lui-même des lignes vides et des deux-points, que les formats lisibles par un humain de doveadm n’échappent pas.- –max-header-bytes BYTES
Plafond sur les octets d’en-tête retenus par message (par défaut 65536).
- –max-messages N
Examine au plus N messages (0, la valeur par défaut, signifie aucune limite).
C’est un plafond sur le nombre de messages analysés et classés, la partie coûteuse par message — il n’interrompt pas le parcours. Le fichier mbox est toujours lu jusqu’à sa fin, l’arborescence Maildir est toujours parcourue, et une session IMAP récupère toujours les en-têtes de chaque boîte aux lettres. Utilisez-le pour borner le travail d’une analyse, pas le temps qu’elle prend sur un très grand stockage.
- -h, –help
Affiche un résumé d’utilisation et quitte.
- -V, –version
Affiche la version et quitte.
85.1.57.1.5. Sortie¶
Un enregistrement par ligne, à champs séparés par des tabulations, sur la sortie standard :
a<TAB>ADDRESSUne adresse de correspondant, émise au plus une fois.
m<TAB>COUNTCombien de messages ont été examinés.
s<TAB>COUNTCombien d’entre eux ont été envoyés par nous.
w<TAB>MESSAGEUn problème non fatal : un dossier illisible, un enregistrement ignoré, une boîte aux lettres sans
cur/new. Les avertissements sont émis après les adresses et sont plafonnés.
Un lecteur ignore les types d’enregistrement qu’il ne connaît pas, de sorte que des versions ultérieures peuvent en ajouter.
85.1.57.1.6. Code de sortie¶
- 0
L’analyse s’est terminée. Les éventuels enregistrements
wsont non fatals.- 1
Une erreur fatale : de mauvais arguments, un chemin de boîte aux lettres illisible, un login IMAP refusé. Le diagnostic est sur l’erreur standard.
85.1.57.1.7. Exemples¶
Analyser votre propre courrier
pepsi-helper-mailbox-scan --local-domain example.com ~/Maildir /var/mail/alice
Seulement le courrier que vous avez envoyé depuis une adresse précise
pepsi-helper-mailbox-scan --own-address alice@example.com ~/Maildir
Un compte distant via IMAP, avec le mot de passe dans un fichier
pepsi-helper-mailbox-scan --local-domain example.com \
--imap imaps://alice@mail.example.com/ --imap-password-file ~/.imap-pw
Un stockage Dovecot, en tant que root
doveadm -f json fetch -u alice hdr mailbox '*' all \
| pepsi-helper-mailbox-scan --local-domain example.com --doveadm-stdin
85.1.57.1.8. Voir aussi¶
pepsi-whitelist(1), pepsi-stage-check-whitelist(1), pepsi-stage-auto-whitelist(1), pepsi.conf(5)
85.1.57.1.9. Bogues¶
Signalez les bogues au gestionnaire de tickets de Pepsi.