POSTFIX - Formation Postfix : Différence entre versions
m (a renommé Formation Postfix en POSTFIX - Formation Postfix: Unification nommage articles) |
|||
(10 révisions intermédiaires par un autre utilisateur non affichées) | |||
Ligne 6 : | Ligne 6 : | ||
* Création dans un souci de sécurité. | * Création dans un souci de sécurité. | ||
* Postfix est un MTA constitué de plusieurs programmes indépendants, "ne se faisant pas confiance mutuellement". | * Postfix est un MTA constitué de plusieurs programmes indépendants, "ne se faisant pas confiance mutuellement". | ||
− | * Postfix prêt à fonctionner quasi out of the box. | + | * Postfix prêt à fonctionner quasi "out of the box". |
* Dans un premier temps, création de boite = création de compte système. | * Dans un premier temps, création de boite = création de compte système. | ||
− | * Après, autres besoins sans utiliser de comptes systèmes, intégration de | + | * Après, autres besoins sans utiliser de comptes systèmes, intégration de MySQL par exemple => entraine besoin de recompilation de Postfix sur des plateforme style Red Hat car fonctionnalité non incluse de base dans le package. |
* Voir qemu/kvm (pour proc gérant virtualisation matérielle) pour virtualisation sous linux. | * Voir qemu/kvm (pour proc gérant virtualisation matérielle) pour virtualisation sous linux. | ||
Ligne 70 : | Ligne 70 : | ||
[[Formation Postfix - Configuration LDAP]] | [[Formation Postfix - Configuration LDAP]] | ||
+ | |||
+ | === Configuration Amavisd-new === | ||
+ | |||
+ | [[Formation Postfix - Configuration Amavisd-new]] | ||
= Vue d'ensemble d'un MTA = | = Vue d'ensemble d'un MTA = | ||
Ligne 77 : | Ligne 81 : | ||
Postfix utilise donc des comptes système ou des comptes virtuels. | Postfix utilise donc des comptes système ou des comptes virtuels. | ||
− | Comptes virtuels: | + | '''Comptes virtuels:''' |
* stockage local (mbox, maildir) OU | * stockage local (mbox, maildir) OU | ||
− | * stockage externe (fichier séquentiel indexé, | + | * stockage externe (fichier séquentiel indexé, MySQL..., non géré par défaut par le MTA) |
− | Comptes virtuels: | + | '''Comptes virtuels:''' |
* domaines partagés OU | * domaines partagés OU | ||
* domaines séparés | * domaines séparés | ||
Ligne 98 : | Ligne 102 : | ||
** 5xx: erreurs fatales | ** 5xx: erreurs fatales | ||
*Commandes SMTP: | *Commandes SMTP: | ||
− | ** ehlo <mon_hostname> '''dialogue en ESMTP''' | + | ** ehlo <mon_hostname> '''dialogue en ESMTP OU''' |
** helo '''dialogue en SMTP''' | ** helo '''dialogue en SMTP''' | ||
** vrfy '''vérification existance d'un utilisateur, habituellement désactivé pour sécurité /SPAM''' | ** vrfy '''vérification existance d'un utilisateur, habituellement désactivé pour sécurité /SPAM''' | ||
Ligne 111 : | Ligne 115 : | ||
** retr | ** retr | ||
− | = Installation de | + | = Installation de Postfix = |
== Installation du package == | == Installation du package == | ||
Ligne 119 : | Ligne 123 : | ||
Pas de configuration, on va la faire à la main. | Pas de configuration, on va la faire à la main. | ||
− | == Configuration de | + | == Configuration de Postfix == |
Conf dans ''/etc/postfix/''. | Conf dans ''/etc/postfix/''. | ||
Ligne 132 : | Ligne 136 : | ||
egrep -v "^$|^#" /etc/postfix/main.cf | egrep -v "^$|^#" /etc/postfix/main.cf | ||
− | Commande '''postconf''': pour connaitre la configuration (totale) de | + | Commande '''postconf''': pour connaitre la configuration (totale) de Postfix. |
− | '''postconf <directive>''': pour connaitre la valeur d'UNE directive: | + | * '''postconf <directive>''': pour connaitre la valeur d'UNE directive: |
root@julien:~# postconf swap_bangpath | root@julien:~# postconf swap_bangpath | ||
swap_bangpath = yes | swap_bangpath = yes | ||
− | '''postconf -d <directive>''': pour connaitre la valeur par défaut avant surcharge. | + | * '''postconf -d <directive>''': pour connaitre la valeur par défaut avant surcharge. |
− | '''postconf -n''': pour connaitre les valeurs différentes de celles par défaut (en gros, celles du main.cf) | + | * '''postconf -n''': pour connaitre les valeurs différentes de celles par défaut (en gros, celles du main.cf) |
− | '''postconf -e <directive>=valeur''': pour éditer les valeurs des directives (modif du fichier de conf). | + | * '''postconf -e <directive>=valeur''': pour éditer les valeurs des directives (modif du fichier de conf). |
− | {{Note|Texte=Attention, l'édition des paramètres par '''postconf -e''' nécessite un reload ou restart de | + | {{Note|Texte=Attention, l'édition des paramètres par '''postconf -e''' nécessite un reload ou restart de Postfix!}} |
root@julien:~# postconf -d mydestination | root@julien:~# postconf -d mydestination | ||
Ligne 156 : | Ligne 160 : | ||
myhostname = julien.localdomain | myhostname = julien.localdomain | ||
− | {{Note|Texte=Attention, $myhostname n'est pas obligatoire, | + | {{Note|Texte=Attention, $myhostname n'est pas obligatoire, Postfix prend le hostname réel du serveur, par défaut!}} |
root@julien:~# postconf -e myhostname=<FQDN du serveur> | root@julien:~# postconf -e myhostname=<FQDN du serveur> | ||
− | Si on n'a pas le FQDN du serveur dans myhostname, et que mydomain est renseigné, concaténation de myorigin et mydomain. | + | Si on n'a pas le FQDN du serveur dans ''myhostname'', et que ''mydomain'' est renseigné, concaténation de ''myorigin'' et ''mydomain''. |
− | * myhostname: si vide prend le hostname par défaut. | + | * '''myhostname''': si vide prend le hostname par défaut. |
− | * myorigin: pour completer les adresses quand on entre 1 user sans domaine. | + | * '''myorigin''': pour completer les adresses quand on entre 1 user sans domaine. |
− | * mydomain: pour faire correspondre 1 domaine de délivrance à ce serveur. | + | * '''mydomain''': pour faire correspondre 1 domaine de délivrance à ce serveur. |
− | * mydestination: contient au moins mydomain + tous les autres domaines que le serveur délivre. | + | * '''mydestination''': contient au moins mydomain + tous les autres domaines que le serveur délivre. |
Possibilité de mettre 1 ligne de conf sur plusieurs lignes, si les lignes secondaires comportent des espaces ou des tabulations en début de ligne. | Possibilité de mettre 1 ligne de conf sur plusieurs lignes, si les lignes secondaires comportent des espaces ou des tabulations en début de ligne. | ||
Ligne 173 : | Ligne 177 : | ||
{{Note|Texte=ATTENTION DE NE PAS UTILISER DE DIRECTIVE N'EXISTANT PAS, SINON POSTCONF LA CREE...)}} | {{Note|Texte=ATTENTION DE NE PAS UTILISER DE DIRECTIVE N'EXISTANT PAS, SINON POSTCONF LA CREE...)}} | ||
− | Pb au start de | + | Pb au start de Postfix: des lignes décommentées dans ''/etc/postfix/main.cf'' sans valeur associées: |
* recommenter les lignes OU | * recommenter les lignes OU | ||
* fixer des valeurs OU | * fixer des valeurs OU | ||
Ligne 190 : | Ligne 194 : | ||
==> /var/log/mail.info <== | ==> /var/log/mail.info <== | ||
− | Sep 22 13:50:03 julien postfix/smtpd[5653]: fatal: open database /etc/aliases.db: No such file or directory | + | Sep 22 13:50:03 julien postfix/smtpd[5653]: fatal: '''open database /etc/aliases.db: No such file or directory''' |
Comme ''/etc/aliases'' existe il faut regénérer le fichier .db associé | Comme ''/etc/aliases'' existe il faut regénérer le fichier .db associé | ||
Ligne 202 : | Ligne 206 : | ||
postfix reload | postfix reload | ||
− | * '''mydestination''' | + | * '''mydestination''': liste des domaines gérés par Postfix, domaines des messages pour lesquels Postfix acceptera des mails (en délivrance locale). |
{{Note|Texte=Par défaut Postfix est configuré pour NE PAS ETRE un relai ouvert (Open Relay)}} | {{Note|Texte=Par défaut Postfix est configuré pour NE PAS ETRE un relai ouvert (Open Relay)}} | ||
− | * '''relay_domains''' | + | * '''relay_domains''': liste des domaines gérés en tant que relay. |
− | * '''relayhost''' | + | * '''relayhost''': machine à qui envoyer des mails pour relay vers l'extérieur quand le Postfix ne peut pas directement contacter internet. |
{{Note|Texte=Si on veut accepter de relayer pour d'autres réseaux (au sens IP) il existe la directive mynetworks}} | {{Note|Texte=Si on veut accepter de relayer pour d'autres réseaux (au sens IP) il existe la directive mynetworks}} | ||
[[Image:schema2.png]] | [[Image:schema2.png]] | ||
− | * '''mydomain''' | + | * '''mydomain''': définit un domaine à concaténer à myhostname si le hostname n'est pas un FQDN |
{{Note|Texte=si le myhostname est déjà un FQDN, le mydomain sera la partie terminale du FQDN}} | {{Note|Texte=si le myhostname est déjà un FQDN, le mydomain sera la partie terminale du FQDN}} | ||
− | * '''myorigin''' | + | * '''myorigin''': valeur par défaut pour completer mail from ou rcpt to... |
= Configuration avancée de Postfix = | = Configuration avancée de Postfix = | ||
Ligne 231 : | Ligne 235 : | ||
root@julien:~# | root@julien:~# | ||
− | Désigne à | + | * Désigne à Postfix la manière de rechercher les boites existantes (d'abord les comptes unix puis la directive ''alias_maps''). |
root@julien:~# postconf alias_maps | root@julien:~# postconf alias_maps | ||
Ligne 240 : | Ligne 244 : | ||
root@julien:~# | root@julien:~# | ||
− | On enrichit la manière dont | + | * On enrichit la manière dont Postfix détecte les boites mail. |
root@julien:~# postconf local_recipient_maps | root@julien:~# postconf local_recipient_maps | ||
Ligne 250 : | Ligne 254 : | ||
root@julien:~# | root@julien:~# | ||
− | On associe 1 clé avec 1 valeur (pour l'instant on s'occupe surtout de la clé). | + | * On associe 1 clé avec 1 valeur (pour l'instant on s'occupe surtout de la clé). |
− | On a besoin de "compiler" cette "base de donnée": | + | * On a besoin de "compiler" cette "base de donnée": |
root@julien:~# postmap /etc/postfix/mesusers | root@julien:~# postmap /etc/postfix/mesusers | ||
Ligne 259 : | Ligne 263 : | ||
root@julien:~# | root@julien:~# | ||
− | hash pour désigner un fichier compilé de relations clé-valeur. | + | * '''hash''' pour désigner un fichier compilé de relations clé-valeur. |
− | Pour avoir la liste des formats: | + | * Pour avoir la liste des formats: |
root@julien:~# postconf -m | root@julien:~# postconf -m | ||
Ligne 277 : | Ligne 281 : | ||
root@julien:~# | root@julien:~# | ||
− | On vérifie qu'on a le user davy que dans notre nouvelle base: | + | * On vérifie qu'on a le user davy que dans notre nouvelle base: |
root@julien:~# id davy | root@julien:~# id davy | ||
Ligne 288 : | Ligne 292 : | ||
root@julien:~# | root@julien:~# | ||
− | On peut tester: | + | * On peut tester: |
root@julien:~# telnet localhost 25 | root@julien:~# telnet localhost 25 | ||
Ligne 321 : | Ligne 325 : | ||
root@julien:~# | root@julien:~# | ||
− | A cette étape, qu'est devenu le mail? | + | * A cette étape, qu'est devenu le mail? |
root@julien:~# postconf mail_spool_directory | root@julien:~# postconf mail_spool_directory | ||
mail_spool_directory = /var/mail | mail_spool_directory = /var/mail | ||
− | On voit dans les logs que ce user n'est pas reconnu... | + | * On voit dans les logs que ce user n'est pas reconnu... |
root@julien:~# ls -la /var/mail | root@julien:~# ls -la /var/mail | ||
Ligne 335 : | Ligne 339 : | ||
root@julien:~# | root@julien:~# | ||
− | Ici le fichier des mails de jules est un fichier qui appartient au user jules. Adresse reconnue par | + | * Ici le fichier des mails de jules est un fichier qui appartient au user jules. Adresse reconnue par Postfix et par le système. |
− | Pour davy, adresse reconnue par | + | * Pour davy, adresse reconnue par Postfix (via ''/etc/postfix/mesusers.db'') mais pas par le système. |
== Format des bases de mails == | == Format des bases de mails == | ||
Ligne 353 : | Ligne 357 : | ||
Différents formats utilisés en fonction des serveurs POP/IMAP: | Différents formats utilisés en fonction des serveurs POP/IMAP: | ||
− | * dovecot: mbox/maildir => d'ou le choix pour la formation | + | * '''dovecot''': mbox/maildir => d'ou le choix pour la formation |
− | * cyrus-imap: spécifique (fichier séquentiel indexé) | + | * '''cyrus-imap''': spécifique (fichier séquentiel indexé) |
− | * courrier-imap: maildir | + | * '''courrier-imap''': maildir |
− | * wu-imap: mbox | + | * '''wu-imap''': mbox |
== Masquage d'adresse == | == Masquage d'adresse == | ||
Ligne 406 : | Ligne 410 : | ||
== Autres interceptions == | == Autres interceptions == | ||
− | * Utilisation de la directive relocated_maps | + | * Utilisation de la directive ''relocated_maps'' |
root@julien:~# postconf -e relocated_maps=hash:/etc/postfix/reloc | root@julien:~# postconf -e relocated_maps=hash:/etc/postfix/reloc | ||
Ligne 453 : | Ligne 457 : | ||
root@julien:~# | root@julien:~# | ||
− | Installation de SASL: | + | * Installation de SASL: |
root@julien:~# apt-cache search sasl | root@julien:~# apt-cache search sasl | ||
Ligne 460 : | Ligne 464 : | ||
root@julien:~# useradd toto '''=> création d'un user toto pour le test''' | root@julien:~# useradd toto '''=> création d'un user toto pour le test''' | ||
root@julien:~# passwd toto | root@julien:~# passwd toto | ||
− | root@julien:~# testsaslauthd -u toto -p toto '''=> pour tester le fonctionnement de | + | root@julien:~# testsaslauthd -u toto -p toto '''=> pour tester le fonctionnement de SASL''' |
root@julien:~# /etc/init.d/saslauthd start '''=> échec''' | root@julien:~# /etc/init.d/saslauthd start '''=> échec''' | ||
root@julien:~# vi /etc/default/saslauthd '''=> passage de l'option de start à yes''' | root@julien:~# vi /etc/default/saslauthd '''=> passage de l'option de start à yes''' | ||
Ligne 466 : | Ligne 470 : | ||
root@julien:~# testsaslauthd -u toto -p toto '''=> OK''' | root@julien:~# testsaslauthd -u toto -p toto '''=> OK''' | ||
− | Modification de la configuration d'imapd: (''/etc/imapd.conf'') | + | * Modification de la configuration d'imapd: (''/etc/imapd.conf'') |
sasl_mech_list: PLAIN | sasl_mech_list: PLAIN | ||
sasl_pwcheck_method: saslauthd | sasl_pwcheck_method: saslauthd | ||
− | Configuration de | + | * Configuration de SASL: (''/etc/default/saslauthd'') |
− | Utilise déjà PAM par défaut | + | Utilise déjà PAM par défaut... |
* Pb pour telnet sur port 110, juste ouverture du socket | * Pb pour telnet sur port 110, juste ouverture du socket | ||
− | * Examen de /var/log/syslog | + | * Examen de ''/var/log/syslog'' |
* Pb pour trouver l'executable pop et nntp: | * Pb pour trouver l'executable pop et nntp: | ||
root@julien:~# apt-get install cyrus-pop3d-2.2 | root@julien:~# apt-get install cyrus-pop3d-2.2 | ||
− | + | * Intégration de SASL pour Cyrus OK, pb d'existance de boite mail pour mon utilisateur de test (toto/toto). | |
− | Utilisation de cyradm: | + | * Utilisation de cyradm: |
− | On utilise le format de boites mails | + | On utilise le format de boites mails Cyrus (fichier séquentiel indexé) pour les mailboxes, donc on utilise Cyrus afin de créer la boite d'un user |
root@julien:~# grep cyrus /etc/passwd | root@julien:~# grep cyrus /etc/passwd | ||
Ligne 513 : | Ligne 517 : | ||
localhost.localdomain> | localhost.localdomain> | ||
− | A cette étape, toto est un compte système et a une mailbox dans | + | * A cette étape, toto est un compte système et a une mailbox dans Cyrus. |
− | On continue l'exemple sur un compte système pour ne pas s'embeter avec un autre système de profil pour l'instant. | + | * On continue l'exemple sur un compte système pour ne pas s'embeter avec un autre système de profil pour l'instant. |
root@julien:~# postconf mailbox_transport | root@julien:~# postconf mailbox_transport | ||
mailbox_transport = | mailbox_transport = | ||
− | Pour l'instant le spool des mails est désigné par la | + | * Pour l'instant le spool des mails est désigné par la configuration Postfix et utilise le format mbox. |
− | On consulte ''/etc/cyrus.conf'' pour trouver les infos de socket (''/var/run/cyrus/socket/lmtp''): | + | * On consulte ''/etc/cyrus.conf'' pour trouver les infos de socket (''/var/run/cyrus/socket/lmtp''): |
root@julien:~# postconf -e mailbox_transport=lmtp:unix:/var/run/cyrus/socket/lmtp | root@julien:~# postconf -e mailbox_transport=lmtp:unix:/var/run/cyrus/socket/lmtp | ||
Ligne 530 : | Ligne 534 : | ||
root@julien:~# | root@julien:~# | ||
− | A cette étape on teste: | + | * A cette étape on teste: |
root@julien:~# telnet localhost 25 | root@julien:~# telnet localhost 25 | ||
Ligne 552 : | Ligne 556 : | ||
data | data | ||
354 End data with <CR><LF>.<CR><LF> | 354 End data with <CR><LF>.<CR><LF> | ||
− | Subject: test d'envoi de mail à toto, user | + | Subject: test d'envoi de mail à toto, user Cyrus |
Et ca fonctionne? | Et ca fonctionne? | ||
A+ | A+ | ||
Ligne 570 : | Ligne 574 : | ||
+OK Mailbox locked and ready | +OK Mailbox locked and ready | ||
− | PB: on a un pb avec la lecture/écriture du socket lmtp | + | * '''PB''': on a un pb avec la lecture/écriture du socket lmtp |
+ | |||
+ | * Après recherche, nécessité sur Debian de modifier la conf concernant le chrootage... | ||
+ | |||
+ | [http://www.postfix.org/DEBUG_README.html#no_chroot Postfix Debug Howto] | ||
− | + | lmtp unix - - '''n''' - - lmtp '''+ restart de Postfix et Cyrus, OK''' | |
− | + | * '''PB''': on souhaiterais conserver le chrootage. | |
+ | On va plutot "créer un lien" entre la cage de Postfix et le dossier du socket: | ||
− | + | * Cyrus écrit dans ''/var/run/cyrus/socket/lmtp'' | |
− | + | * ce nom de socket est passé à Postfix dans sa conf (via directive ''mailbox_transport'') | |
− | * Cyrus écrit dans /var/run/cyrus/socket/lmtp | + | * Postfix est chrooté, il considère ''/var/spool/postfix'' comme sa racine, donc il recherche ''var/run''... sous sa racine... => PB car fichier inexistant en réalité |
− | * ce nom de socket est passé à | + | * test avec construction de l'arborescence réellement + mount -o bind <arborescence de base> <arborescence chrootée> OK, mais solution plus simple: |
− | * | + | * on a ''/var/spool/postfix/private/'' avec un socket lmtp dedans => on modifie les configurations de Postfix et Cyrus pour utiliser ce socket au lieu de celui de l'arborescence de Cyrus. |
− | * test avec construction de l' | + | {{Note|Texte=il faut donner à Postfix le chemin RELATIF vers le socket (''/private/lmtp'') puisqu'il est déjà chrooté}} |
− | * on a /var/spool/postfix/private/ avec un socket lmtp dedans => on modifie les | + | '''PB''' avec cette solution, les mails ne sont pas délivrés... A VOIR en changeant les droits d'accès à ''/var/spool/postfix/private'' |
− | {{Note|Texte=il faut donner à | ||
− | PB avec cette solution, les mails ne sont pas délivrés... A VOIR en changeant les droits d'accès à /var/spool/postfix/private | ||
== Création de compte d'utilisateurs virtuels == | == Création de compte d'utilisateurs virtuels == | ||
Ligne 593 : | Ligne 600 : | ||
root@julien:/var/run/cyrus# postconf -e fallback_transport=lmtp:unix:/var/run/cyrus/socket/lmtp | root@julien:/var/run/cyrus# postconf -e fallback_transport=lmtp:unix:/var/run/cyrus/socket/lmtp | ||
− | * Avec mailbox_transport, on n'utilise plus les dossiers locaux de stockage des mails désigné par la | + | * Avec ''mailbox_transport'', on n'utilise plus les dossiers locaux de stockage des mails désigné par la configuration Postfix (''/var/spool/mail''...), on passe tout à Cyrus |
− | * Si on veut continuer à délivrer sur disque aux utilisateurs locaux et à gèrer des utilisateurs "virtuels" (n'ayant pas de comptes système), on remet à blanc la directive mailbox_transport et on instancie fallback_tranport. La sémantique est différente: on délivre en local, et si on ne peut pas on passe au fallback... | + | * Si on veut continuer à délivrer sur disque aux utilisateurs locaux et à gèrer des utilisateurs "virtuels" (n'ayant pas de comptes système), on remet à blanc la directive ''mailbox_transport'' et on instancie ''fallback_tranport''. La sémantique est différente: on délivre en local, et si on ne peut pas on passe au fallback... |
root@julien:/var/run/cyrus# /etc/init.d/postfix restart | root@julien:/var/run/cyrus# /etc/init.d/postfix restart | ||
Ligne 601 : | Ligne 608 : | ||
root@julien:/var/run/cyrus# | root@julien:/var/run/cyrus# | ||
− | * A ce moment là, root et toto recoivent sur leurs comptes système, reste à créer un moyen d'identifier l'utilisateur virtuel ( | + | * A ce moment là, root et toto recoivent sur leurs comptes système, reste à créer un moyen d'identifier l'utilisateur virtuel (LDAP, MySQL...). |
== Utilisation de LDAP == | == Utilisation de LDAP == | ||
Ligne 631 : | Ligne 638 : | ||
root@julien:/var/run/cyrus# | root@julien:/var/run/cyrus# | ||
− | * PB: pas d'interface | + | * '''PB''': pas d'interface Postfix - LDAP: |
root@julien:/var/run/cyrus# apt-get install postfix-ldap | root@julien:/var/run/cyrus# apt-get install postfix-ldap | ||
Ligne 640 : | Ligne 647 : | ||
root@julien:/var/run/cyrus# | root@julien:/var/run/cyrus# | ||
− | * PB: pb de version entre client et serveur: | + | * '''PB''': pb de version entre client et serveur: |
root@julien:/var/run/cyrus# more /etc/postfix/ldapusers.conf | root@julien:/var/run/cyrus# more /etc/postfix/ldapusers.conf | ||
Ligne 685 : | Ligne 692 : | ||
jules@julien:/var/run/cyrus$ | jules@julien:/var/run/cyrus$ | ||
− | * On vérifie que notre | + | * On vérifie que notre SASL sait s'interfacer avec LDAP: |
jules@julien:/var/run/cyrus$ saslauthd -v | jules@julien:/var/run/cyrus$ saslauthd -v | ||
Ligne 692 : | Ligne 699 : | ||
jules@julien:/var/run/cyrus$ | jules@julien:/var/run/cyrus$ | ||
− | * On va expliquer à | + | * On va expliquer à SASL comment s'interfacer avec LDAP: |
root@julien:/var/run/cyrus# more /etc/saslauthd.conf | root@julien:/var/run/cyrus# more /etc/saslauthd.conf | ||
− | ldap_servers: ldap://annuaire. | + | ldap_servers: ldap://annuaire.ploplo.fr |
− | ldap_search_base: dc= | + | ldap_search_base: dc=ploplo,dc=fr |
root@julien:/var/run/cyrus# more /etc/default/saslauthd | root@julien:/var/run/cyrus# more /etc/default/saslauthd | ||
# | # | ||
Ligne 722 : | Ligne 729 : | ||
# Example: MECHANISMS="pam" | # Example: MECHANISMS="pam" | ||
#MECHANISMS="pam" | #MECHANISMS="pam" | ||
− | MECHANISMS="ldap" | + | '''MECHANISMS="ldap"''' |
... | ... | ||
root@julien:/var/run/cyrus# /etc/init.d/saslauthd restart | root@julien:/var/run/cyrus# /etc/init.d/saslauthd restart | ||
* Restarting SASL Authentication Daemon saslauthd [ OK ] | * Restarting SASL Authentication Daemon saslauthd [ OK ] | ||
root@julien:/var/run/cyrus# | root@julien:/var/run/cyrus# | ||
− | root@julien:/var/run/cyrus# testsaslauthd -u stage01 -p | + | root@julien:/var/run/cyrus# testsaslauthd -u stage01 -p ****** |
0: OK "Success." | 0: OK "Success." | ||
root@julien:/var/run/cyrus# telnet localhost 110 | root@julien:/var/run/cyrus# telnet localhost 110 | ||
Ligne 762 : | Ligne 769 : | ||
quit | quit | ||
− | {{Note|Texte=à cette étape on ne peut plus utiliser l' | + | {{Note|Texte=à cette étape on ne peut plus utiliser l'utilisateur local Cyrus pour cyradm (puisque AUTH sur LDAP...)}} |
− | * 1 solution peut être d'utiliser un compte LDAP pour s'authentifier en admin | + | * 1 solution peut être d'utiliser un compte LDAP pour s'authentifier en admin Cyrus |
* 1 autre solution plus élégante: | * 1 autre solution plus élégante: | ||
− | ** configurer | + | ** configurer SASL (''/etc/default/saslauthd'') pour utiliser pam + redémarrer SASL |
** configurer ''/etc/pam.d/imap'' pour y ajouter "auth sufficient pam_ldap.so" et "account sufficient pam_ldap.so" | ** configurer ''/etc/pam.d/imap'' pour y ajouter "auth sufficient pam_ldap.so" et "account sufficient pam_ldap.so" | ||
** configurer ''/etc/pam.d/pop'' pour y ajouter "auth sufficient pam_ldap.so" et "account sufficient pam_ldap.so" | ** configurer ''/etc/pam.d/pop'' pour y ajouter "auth sufficient pam_ldap.so" et "account sufficient pam_ldap.so" | ||
Ligne 773 : | Ligne 780 : | ||
0: NO "authentication failed" | 0: NO "authentication failed" | ||
− | * PB: EN FAIT le fichier de | + | * '''PB''': EN FAIT le fichier de configuration LDAP pour pam est ''/etc/pam_ldap.conf''... modifier l'URI, sinon ''/etc/ldap/ldap.conf'' sert pour des clients type ldapsearch qui utilisent l'annuaire. |
root@julien:/var/run/cyrus# testsaslauthd -u stage01 -p ***** -s imap | root@julien:/var/run/cyrus# testsaslauthd -u stage01 -p ***** -s imap | ||
Ligne 885 : | Ligne 892 : | ||
334 VXNlcm5hbWU6 | 334 VXNlcm5hbWU6 | ||
− | '''INFO:''' VXN... est une chaine de caractère encodée en base64: | + | * '''INFO:''' VXN... est une chaine de caractère encodée en base64: |
# perl -MMIME::Base64 -e "print decode_base64('VXNlcm5hbWU6') | # perl -MMIME::Base64 -e "print decode_base64('VXNlcm5hbWU6') | ||
− | + | Nous renvoie Username: , donc un encodage sur 7 bits pour assurer la compatibilité arrière avec de vieux équipements. | |
root@julien:/var/run/cyrus# perl -MMIME::Base64 -e "print decode_base64('VXNlcm5hbWU6')" | root@julien:/var/run/cyrus# perl -MMIME::Base64 -e "print decode_base64('VXNlcm5hbWU6')" | ||
Username:root@julien:/var/run/cyrus# | Username:root@julien:/var/run/cyrus# | ||
− | * PB: l'authentification ne fonctionne pas. Un oubli: préciser une méthode d'authentification pour | + | * '''PB''': l'authentification ne fonctionne pas. '''Un oubli''': préciser une méthode d'authentification pour SMTP à pam: |
root@julien:/var/run/cyrus# more /etc/pam.d/smtp | root@julien:/var/run/cyrus# more /etc/pam.d/smtp | ||
Ligne 899 : | Ligne 906 : | ||
root@julien:/var/run/cyrus# | root@julien:/var/run/cyrus# | ||
− | * PB: manque des authorisations pour les connexions avec des comptes locaux | + | * '''PB''': manque des authorisations pour les connexions avec des comptes locaux |
root@julien:/var/run/cyrus# cp /etc/pam.d/imap /etc/pam.d/smtp (C'est le même contenu de fichier) | root@julien:/var/run/cyrus# cp /etc/pam.d/imap /etc/pam.d/smtp (C'est le même contenu de fichier) | ||
− | * PB: Toujours PB avec generic failure... | + | * '''PB''': Toujours PB avec generic failure... |
** Vérification des droits au niveau du socket mux, pas de pb | ** Vérification des droits au niveau du socket mux, pas de pb | ||
** Vérification des chrootages, smtpd toujours chrooté, donc ne vois pas le fichier socket | ** Vérification des chrootages, smtpd toujours chrooté, donc ne vois pas le fichier socket | ||
− | * On dé chroote smtpd dans /etc/postfix/master.cf + /etc/init.d/postfix restart, et l'authentification via telnet sur le port 25 fonctionne: | + | * On dé chroote smtpd dans ''/etc/postfix/master.cf'' + ''/etc/init.d/postfix restart'', et l'authentification via telnet sur le port 25 fonctionne: |
root@julien:/var/run/cyrus# perl -MMIME::Base64 -e 'print encode_base64("stage01\0stage01\******")' | root@julien:/var/run/cyrus# perl -MMIME::Base64 -e 'print encode_base64("stage01\0stage01\******")' | ||
Ligne 930 : | Ligne 937 : | ||
235 2.0.0 Authentication successful | 235 2.0.0 Authentication successful | ||
− | * Examen de la configuration des restrictions dans | + | * Examen de la configuration des restrictions dans Postfix: |
root@julien:/var/run/cyrus# postconf |grep restriction | root@julien:/var/run/cyrus# postconf |grep restriction | ||
Ligne 953 : | Ligne 960 : | ||
* Les règles de type REJECT renvoient soit REJET, soit DUNNO | * Les règles de type REJECT renvoient soit REJET, soit DUNNO | ||
− | Si la règle permit_mynetworks est renseigné, si le client vient d'un réseau compris dans cette directive, réponse OK et ca suffit (ou n'examine pas la suite des règles de la directive). Si réponse DUNNO, on parcours la suite des règles de la directive. | + | Si la règle ''permit_mynetworks'' est renseigné, si le client vient d'un réseau compris dans cette directive, réponse OK et ca suffit (ou n'examine pas la suite des règles de la directive). Si réponse DUNNO, on parcours la suite des règles de la directive. |
Si le récipient ne fais pas partie des ''mydestination'', ''reject_unauth_destination'' répond REJECT. | Si le récipient ne fais pas partie des ''mydestination'', ''reject_unauth_destination'' répond REJECT. | ||
Ligne 962 : | Ligne 969 : | ||
Restrictions, exemples: | Restrictions, exemples: | ||
− | * client: permit_mynetwork: OK si ds réseau, DUNNO sinon => OK!!! Donc la | + | * client: ''permit_mynetwork'': OK si ds réseau, DUNNO sinon => OK!!! Donc la configuration ne servirait à rien. On ne peux pas non plus utiliser une règle telle que reject_unauth_destination puisqu'on n'a pas encore ces infos |
− | * helo: si on ne veut que des helo "propres", ex. avec smtpd_helo_restrictions=reject_non_fqdn_helo_hostname. Avec smtpd_delay_reject=no permet de rejeter tout de suite après le ehlo, pas après le rcpt to. Cependant par défaut rejet après rcpt to pour des raisons de manière d'implémenter les clients. | + | * helo: si on ne veut que des helo "propres", ex. avec ''smtpd_helo_restrictions=reject_non_fqdn_helo_hostname''. Avec ''smtpd_delay_reject=no'' permet de rejeter tout de suite après le ehlo, pas après le rcpt to. Cependant par défaut rejet après rcpt to pour des raisons de manière d'implémenter les clients. |
* sender | * sender | ||
* recipient | * recipient | ||
Ligne 969 : | Ligne 976 : | ||
man 5 postconf '''=> pour avoir le détail des paramètres''' | man 5 postconf '''=> pour avoir le détail des paramètres''' | ||
− | * Maintenant on va forcer le | + | * Maintenant on va forcer le Postfix à nous authentifier: |
root@julien:/var/run/cyrus# postconf -e smtpd_client_restrictions=permit_sasl_authenticated,reject | root@julien:/var/run/cyrus# postconf -e smtpd_client_restrictions=permit_sasl_authenticated,reject | ||
− | On demande à l'utilisateur de se connecter et de s'authentifier. Pb si utilisé seul, en cas d'echec de l'auth, répond DUNNO et donc passe, d'ou le reject en fin de restriction. | + | On demande à l'utilisateur de se connecter et de s'authentifier. '''Pb si utilisé seul''', en cas d'echec de l'auth, répond DUNNO et donc passe, d'ou le reject en fin de restriction. |
Si on vire le reject, tout passe même en cas de non authentification ou de mauvaise authentification. | Si on vire le reject, tout passe même en cas de non authentification ou de mauvaise authentification. | ||
− | * Cette fois on veut autoriser le telnet local | + | * Cette fois on veut autoriser le telnet local SANS authentification et le telnet distant AVEC authentification: |
root@julien:/var/run/cyrus# postconf -e smtpd_client_restrictions=hash:/etc/postfix/net-ok,permit_sasl_authenticated,reject | root@julien:/var/run/cyrus# postconf -e smtpd_client_restrictions=hash:/etc/postfix/net-ok,permit_sasl_authenticated,reject | ||
Ligne 987 : | Ligne 994 : | ||
root@julien:/var/run/cyrus# | root@julien:/var/run/cyrus# | ||
− | A cette étape, on peut s'authentifier avec un compte et faire un mail from depuis 1 autre compte (s'authentifier en stage01 et faire un mail from: root par exemple) ce qui peut être une faille également. | + | * A cette étape, on peut s'authentifier avec un compte et faire un mail from depuis 1 autre compte (s'authentifier en stage01 et faire un mail from: root par exemple) ce qui peut être une faille également. |
root@julien:/var/run/cyrus# postconf -e smtpd_sender_restrictions=reject_sender_login_mismatch | root@julien:/var/run/cyrus# postconf -e smtpd_sender_restrictions=reject_sender_login_mismatch | ||
Ligne 1 032 : | Ligne 1 039 : | ||
root@julien:/var/run/cyrus# | root@julien:/var/run/cyrus# | ||
− | A ce stade cela fonctionne pour 1 compte déclaré dans ''/etc/postfix/loginsasl''. | + | * A ce stade cela fonctionne pour 1 compte déclaré dans ''/etc/postfix/loginsasl''. On a fait le lien entre 1 adresse mail et 1 login. Il est plus intéressant de générer dynamiquement ces correspondances via l'annuaire LDAP. |
− | |||
− | |||
− | Il est plus intéressant de générer dynamiquement ces correspondances via l'annuaire LDAP. | ||
man ldap_table | man ldap_table | ||
Ligne 1 061 : | Ligne 1 065 : | ||
root@julien:~# | root@julien:~# | ||
− | Test de la solution mise en place: | + | * Test de la solution mise en place: |
root@julien:~# perl -MMIME::Base64 -e 'print encode_base64("jpedrono\0jpedrono\0******")' | root@julien:~# perl -MMIME::Base64 -e 'print encode_base64("jpedrono\0jpedrono\0******")' | ||
Ligne 1 082 : | Ligne 1 086 : | ||
250 DSN | 250 DSN | ||
auth plain anBlZHJvbm8Aa******m8AUXZ2bG1zbSE= | auth plain anBlZHJvbm8Aa******m8AUXZ2bG1zbSE= | ||
− | '''ici d'après la | + | '''ici d'après la configiguration précédemment mise en place on n'a pas besoin de s'authentifier, on le fait juste pour tester notre configuration''' |
235 2.0.0 Authentication successful | 235 2.0.0 Authentication successful | ||
mail from: Julien.Pedrono | mail from: Julien.Pedrono | ||
Ligne 1 123 : | Ligne 1 127 : | ||
root@julien:~# | root@julien:~# | ||
− | On constate donc que le forcage de la correspondance login <=> adresse mail stockée dans LDAP fonctionne. | + | * On constate donc que le forcage de la correspondance login <=> adresse mail stockée dans LDAP fonctionne. On souhaite pouvoir s'authentifier et écrire quand il y a correspondance login <=> adresse mail OU login <=> login. '''Une solution''': utiliser 2 fichiers de configuration LDAP ou rajouter une condition et un OU dans la configuration LDAP actuelle: |
− | On souhaite pouvoir s'authentifier et écrire quand il y a correspondance login <=> adresse mail OU login <=> login. | ||
− | Une solution: utiliser 2 fichiers de | ||
root@julien:~# vi /etc/postfix/ldap-loginsasl.conf | root@julien:~# vi /etc/postfix/ldap-loginsasl.conf | ||
Ligne 1 136 : | Ligne 1 138 : | ||
result_attribute = uid | result_attribute = uid | ||
− | Puis on teste: | + | * Puis on teste: |
root@julien:~# telnet localhost 25 | root@julien:~# telnet localhost 25 | ||
Ligne 1 188 : | Ligne 1 190 : | ||
* On peut le rendre dispo (communication avec ou sans). | * On peut le rendre dispo (communication avec ou sans). | ||
* On peut le forcer (communication uniquement avec). | * On peut le forcer (communication uniquement avec). | ||
− | De plus, dans le cas ou un | + | De plus, dans le cas ou un Postfix discute avec un autre MTA (relayage), le Postfix est client: |
* On peut préciser si le client crypte. | * On peut préciser si le client crypte. | ||
* On peut préciser si le client ne crypte pas. | * On peut préciser si le client ne crypte pas. | ||
Ligne 1 196 : | Ligne 1 198 : | ||
root@julien:~# postconf -d|grep tls | root@julien:~# postconf -d|grep tls | ||
− | ''' | + | Cryptage symétrique à clé publique: [[Image:schema5.png]] |
+ | |||
+ | '''INCONVENIENT:''' besoin de transmettre en clair la clé publique au préalable. Comporte un risque d'interception. | ||
+ | |||
+ | Cryptage assymétrique à clé privée: [[Image:schema6.png]] | ||
+ | |||
+ | Méthode plus sure que le cryptage symétrique. Dans ce cas la clé publique sert à crypter et la clé privée à décrypter. | ||
+ | |||
+ | Cryptage symétrique à clé partagée: [[Image:schema7.png]] | ||
− | Pb avec schéma 7: on n'est pas sur malgré tout que le message viennent bien de A, rien ne le prouve. Utilisation des hash: celui qui fournit sa clé publique doit aussi fournir l'algorithme de hashage et le hash obtenu, ou utiliser des certificats d'authorités de certification (dont on peut connaitre le hashage sans partager d'infos). | + | '''Pb avec schéma 7:''' on n'est pas sur malgré tout que le message viennent bien de A, rien ne le prouve. Utilisation des hash: celui qui fournit sa clé publique doit aussi fournir l'algorithme de hashage et le hash obtenu, ou utiliser des certificats d'authorités de certification (dont on peut connaitre le hashage sans partager d'infos). |
− | + | Explication de l'utilisation des checksum pour assurer l'authenticité de l'identité de A: [[Image:schema8.png]] | |
− | + | ||
− | + | * CRC => collisions | |
− | + | * MD5 => collisions (2 messages peuvent donner la même signature) | |
− | + | * sha => pas de collisions | |
+ | |||
+ | Dans le schéma 8 on parle en quelque sorte d'authentification, du coup. | ||
Le cryptage sert à plusieurs choses: | Le cryptage sert à plusieurs choses: | ||
Ligne 1 212 : | Ligne 1 224 : | ||
* non répudiation: un expéditeur ne peut nier avoir envoyé 1 message. | * non répudiation: un expéditeur ne peut nier avoir envoyé 1 message. | ||
− | + | == Filtrage de contenu == | |
− | |||
− | On installe | + | * On installe SpamAssassin via aptitude: |
root@julien:~# apt-get update | root@julien:~# apt-get update | ||
Ligne 1 258 : | Ligne 1 269 : | ||
root@julien:~# | root@julien:~# | ||
− | On vérifie ce qui a été installé: | + | * On vérifie ce qui a été installé: |
root@julien:~# ls /usr/share/doc/spamassassin/examples/ | root@julien:~# ls /usr/share/doc/spamassassin/examples/ | ||
Ligne 1 266 : | Ligne 1 277 : | ||
root@julien:/usr/share/doc/spamassassin/examples# gunzip sample-nonspam.txt.gz | root@julien:/usr/share/doc/spamassassin/examples# gunzip sample-nonspam.txt.gz | ||
− | On teste le bon fonctionnement de | + | * On teste le bon fonctionnement de SpamAssassin sur du "non spam": |
root@julien:/usr/share/doc/spamassassin/examples# spamassassin -t sample-nonspam.txt | head | root@julien:/usr/share/doc/spamassassin/examples# spamassassin -t sample-nonspam.txt | head | ||
Return-Path: <tbtf-approval@world.std.com> | Return-Path: <tbtf-approval@world.std.com> | ||
'''X-Spam-Checker-Version: SpamAssassin 3.1.7-deb (2006-10-05) on | '''X-Spam-Checker-Version: SpamAssassin 3.1.7-deb (2006-10-05) on | ||
− | julien. | + | julien.ploplo.fr''' |
'''X-Spam-Level: *''' | '''X-Spam-Level: *''' | ||
'''X-Spam-Status: No, score=1.3 required=5.0 tests=SPF_FAIL autolearn=no | '''X-Spam-Status: No, score=1.3 required=5.0 tests=SPF_FAIL autolearn=no | ||
Ligne 1 281 : | Ligne 1 292 : | ||
root@julien:/usr/share/doc/spamassassin/examples# | root@julien:/usr/share/doc/spamassassin/examples# | ||
− | On teste le bon fonctionnement de | + | * On teste le bon fonctionnement de SpamAssassin sur du "spam": |
root@julien:/usr/share/doc/spamassassin/examples# spamassassin -t sample-spam.txt |head -n 30 | root@julien:/usr/share/doc/spamassassin/examples# spamassassin -t sample-spam.txt |head -n 30 | ||
− | Received: from localhost by julien. | + | Received: from localhost by julien.ploplo.fr |
with SpamAssassin (version 3.1.7-deb); | with SpamAssassin (version 3.1.7-deb); | ||
Wed, 24 Sep 2008 11:35:18 +0200 | Wed, 24 Sep 2008 11:35:18 +0200 | ||
Ligne 1 294 : | Ligne 1 305 : | ||
'''X-Spam-Flag: YES''' | '''X-Spam-Flag: YES''' | ||
'''X-Spam-Checker-Version: SpamAssassin 3.1.7-deb (2006-10-05) on | '''X-Spam-Checker-Version: SpamAssassin 3.1.7-deb (2006-10-05) on | ||
− | julien. | + | julien.ploplo.fr''' |
'''X-Spam-Level: **************************************************''' | '''X-Spam-Level: **************************************************''' | ||
'''X-Spam-Status: Yes, score=1000.0 required=5.0 tests=GTUBE,NO_RECEIVED, | '''X-Spam-Status: Yes, score=1000.0 required=5.0 tests=GTUBE,NO_RECEIVED, | ||
Ligne 1 313 : | Ligne 1 324 : | ||
Cette notice a été ajoutée par le système d'analyse "SpamAssassin" sur | Cette notice a été ajoutée par le système d'analyse "SpamAssassin" sur | ||
− | votre serveur de courrier "julien. | + | votre serveur de courrier "julien.ploplo.fr", pour vous |
... '''(analyse + détaillée des raisons de categorisation en spam + loin)''' | ... '''(analyse + détaillée des raisons de categorisation en spam + loin)''' | ||
root@julien:/usr/share/doc/spamassassin/examples# | root@julien:/usr/share/doc/spamassassin/examples# | ||
− | On va installer Amavis pour permettre d'interfacer | + | * On va installer Amavis pour permettre d'interfacer Postfix avec SpamAssassin... |
− | Avant cela, étude des paramètres de | + | |
+ | [[Image:schema9.png]] | ||
+ | |||
+ | Avant cela, étude des paramètres de SpamAssassin: | ||
root@julien:/usr/share/doc/spamassassin/examples# cd /usr/share/spamassassin/ | root@julien:/usr/share/doc/spamassassin/examples# cd /usr/share/spamassassin/ | ||
Ligne 1 340 : | Ligne 1 354 : | ||
23_bayes.cf 30_text_it.cf | 23_bayes.cf 30_text_it.cf | ||
− | + | {{Note|Texte=NE JAMAIS MODIFIER CES FICHIERS, ILS SONT MIS A JOUR AUTOMATIQUEMENT}} | |
− | + | ||
+ | Leur modification serait inutile, puisque les modifs seraient perdues après les mises à jour. | ||
+ | |||
On utilise sa-update pour faire ces mises à jour. | On utilise sa-update pour faire ces mises à jour. | ||
Ligne 1 348 : | Ligne 1 364 : | ||
init.pre local.cf v310.pre v312.pre | init.pre local.cf v310.pre v312.pre | ||
− | + | {{Note|Texte=C'est ICI qu'on va placer nos propres configurations, qui ne seront pas supprimées par les mises à jour}} | |
root@julien:/etc/mail/spamassassin# vi local.cf | root@julien:/etc/mail/spamassassin# vi local.cf | ||
Ligne 1 365 : | Ligne 1 381 : | ||
rewrite_header Subject [SPAM] '''Réécriture du sujet quand le mail est classé SPAM''' | rewrite_header Subject [SPAM] '''Réécriture du sujet quand le mail est classé SPAM''' | ||
− | report_safe à 2 passe le message transmis en plain text au lieu de RFCxxx... Le choix est à faire en fonction des capacités des clients de messagerie du parc. | + | ''report_safe'' à 2 passe le message transmis en plain text au lieu de RFCxxx... Le choix est à faire en fonction des capacités des clients de messagerie du parc. |
− | On modifie le fichier d'exemple non spam et on rechecke le message: cela ne change rien au score: | + | * On modifie le fichier d'exemple "non spam" et on rechecke le message: cela ne change rien au score: |
root@julien:~ # cd /usr/share/doc/spamassassin/ | root@julien:~ # cd /usr/share/doc/spamassassin/ | ||
root@julien:/usr/share/doc/spamassassin/# cd examples/ | root@julien:/usr/share/doc/spamassassin/# cd examples/ | ||
Ligne 1 374 : | Ligne 1 390 : | ||
root@julien:/usr/share/doc/spamassassin/# spamassassin -t test-spam.txt '''=> même note à 2.9''' | root@julien:/usr/share/doc/spamassassin/# spamassassin -t test-spam.txt '''=> même note à 2.9''' | ||
− | Création d'une nouvelle règle: | + | * Création d'une nouvelle règle: |
root@julien:/usr/share/doc/spamassassin/# cd /etc/mail/spamassassin | root@julien:/usr/share/doc/spamassassin/# cd /etc/mail/spamassassin | ||
Ligne 1 399 : | Ligne 1 415 : | ||
Chaque règle comporte un type (ici, header), un score associé, et éventuellement une description. | Chaque règle comporte un type (ici, header), un score associé, et éventuellement une description. | ||
− | Pour header =~ indique qu'on va utiliser une expression régulière à la mode | + | Pour ''header =~'' indique qu'on va utiliser une expression régulière à la mode PERL (entourée de / ). Le i sert à ignorer la casse (INSA, insa, InSA...). |
− | Test de la règle: | + | * Test de la règle: |
root@julien:/etc/mail/spamassassin# spamassassin -t /usr/share/doc/spamassassin/examples/test-spam.txt | root@julien:/etc/mail/spamassassin# spamassassin -t /usr/share/doc/spamassassin/examples/test-spam.txt | ||
Ligne 1 407 : | Ligne 1 423 : | ||
X-Spam-Flag: YES | X-Spam-Flag: YES | ||
X-Spam-Checker-Version: SpamAssassin 3.1.7-deb (2006-10-05) on | X-Spam-Checker-Version: SpamAssassin 3.1.7-deb (2006-10-05) on | ||
− | julien. | + | julien.ploplo.fr |
X-Spam-Level: ****** | X-Spam-Level: ****** | ||
'''X-Spam-Status: Yes, score=6.3 required=5.0 tests=AWL,SPF_FAIL,TEST_N1''' | '''X-Spam-Status: Yes, score=6.3 required=5.0 tests=AWL,SPF_FAIL,TEST_N1''' | ||
Ligne 1 416 : | Ligne 1 432 : | ||
OK, la note a monté. Elle n'a pas monté jusqu'à 10 car notre règle est utilisée en même temps que plusieurs règles par défaut (qui ont donc fait baisser la note à 6.3...). | OK, la note a monté. Elle n'a pas monté jusqu'à 10 car notre règle est utilisée en même temps que plusieurs règles par défaut (qui ont donc fait baisser la note à 6.3...). | ||
− | Consultation du manuel: | + | * Consultation du manuel: |
root@julien:/etc/mail/spamassassin# man Mail::SpamAssassin | root@julien:/etc/mail/spamassassin# man Mail::SpamAssassin | ||
Ligne 1 423 : | Ligne 1 439 : | ||
Reformatting Mail::SpamAssassin::Conf(3pm), please wait... | Reformatting Mail::SpamAssassin::Conf(3pm), please wait... | ||
− | On passe à l'installation d' | + | * On passe à l'installation d'Amavisd-new: |
root@julien:/etc/mail/spamassassin# apt-cache search amavis | root@julien:/etc/mail/spamassassin# apt-cache search amavis | ||
Ligne 1 448 : | Ligne 1 464 : | ||
uid=107(amavis) gid=114(amavis) groups=114(amavis) | uid=107(amavis) gid=114(amavis) groups=114(amavis) | ||
− | Paramètres du fichier amavisd.conf: | + | * Paramètres du fichier ''amavisd.conf'': |
− | + | ||
− | + | $daemon_user = amavis; | |
− | + | $daemon_group = amavis; | |
− | + | $max_servers = 2; '''=> Le nombre de server en attente, comme pour apache, sert à décrire le nombre de process simultanés. A augmenter si bcp de mails traités, mais attention à la charge globale de la machine.''' | |
− | + | $MYHOME = '/var/lib/amavis'; | |
− | + | $TEMPBASE = "$MYHOME/tmp"; | |
+ | $log_level = 0; '''=> granularité encore + fine que les niveaux de log habituels''' | ||
root@julien:~# touch /var/log/amavis.log;chown amavis: /var/log/amavis.log | root@julien:~# touch /var/log/amavis.log;chown amavis: /var/log/amavis.log | ||
Ligne 1 461 : | Ligne 1 478 : | ||
root@julien:~# | root@julien:~# | ||
− | + | $QUARANTINEDIR = "/var/lib/amavis/virusmails"; | |
− | + | $inet_socket_port '''pour s'accrocher à un port TCP, 10024 par défaut''' | |
root@julien:~# netstat -tpln|grep amavis | root@julien:~# netstat -tpln|grep amavis | ||
Ligne 1 468 : | Ligne 1 485 : | ||
root@julien:~# | root@julien:~# | ||
− | + | $myhostname = julien.ploplo.fr | |
− | + | $forward_method = 'smtp:[127.0.0.1]:10025'; '''=> port de retour des mails vers Postfix (Nécessitera une reconfiguration de Postfix)''' | |
− | ''' | + | * Quelques problèmes de différences d'arborescence de configuration entre RedHat et Ubuntu... Pour l'instant on laisse ''/etc/amavis/conf.d'' en l'état car sinon bloque le démarrage de Amavisd-new |
− | + | * Pour l'instant on ne configure que ca, et on reviendra sur d'autres paramètres plus tard. | |
− | + | * A l'heure actuelle, on a juste installé et débuté la configuration d'Amavisd-new. | |
− | |||
− | A l'heure actuelle, on a juste installé et débuté la configuration d' | ||
Le MTA qui reçoit son mail faut ses vérifications habituelles (authentification, vérification du mail from, du rcpt to, etc) et au lieu de délivrer si tout OK passe à Amavis, qui examine et lui répond DELIVER, BOUNCE, REJECT... | Le MTA qui reçoit son mail faut ses vérifications habituelles (authentification, vérification du mail from, du rcpt to, etc) et au lieu de délivrer si tout OK passe à Amavis, qui examine et lui répond DELIVER, BOUNCE, REJECT... | ||
− | Aucun lien définit avec Postfix, donc on configure Postfix: | + | * Aucun lien définit avec Postfix, donc on configure Postfix: |
root@julien:/etc# postconf content_filter | root@julien:/etc# postconf content_filter | ||
Ligne 1 488 : | Ligne 1 503 : | ||
root@julien:/etc# | root@julien:/etc# | ||
− | On a donné à | + | On a donné à Postfix 1 IP et 1 port pour qu'il sache communiquer avec Amavisd-new. |
− | + | [[Image:schema10.png]] | |
− | + | * Vérifier la syntaxe de la configuration de Postfix: | |
− | |||
− | Vérifier la syntaxe de la configuration de | ||
root@julien:/etc# postfix check | root@julien:/etc# postfix check | ||
root@julien:/etc# | root@julien:/etc# | ||
− | Vérification de la bonne prise en compte du paramétrage: | + | * Vérification de la bonne prise en compte du paramétrage: |
root@julien:/etc# netstat -tpln | root@julien:/etc# netstat -tpln | ||
Active Internet connections (only servers) | Active Internet connections (only servers) | ||
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name | Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name | ||
− | tcp 0 0 127.0.0.1:10024 0.0.0.0:* LISTEN 16847/amavisd (mast | + | tcp 0 0 '''127.0.0.1:10024''' 0.0.0.0:* LISTEN 16847/'''amavisd''' (mast |
− | tcp 0 0 '''127.0.0.1:10025''' 0.0.0.0:* LISTEN 14726/master | + | tcp 0 0 '''127.0.0.1:10025''' 0.0.0.0:* LISTEN 14726/'''master''' |
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 3648/mysqld | tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 3648/mysqld | ||
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 12596/cyrmaster | tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 12596/cyrmaster | ||
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 12596/cyrmaster | tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 12596/cyrmaster | ||
− | A cette étape, on s'envoie en telnet un message de root à root. On se loggue ensuite en jules (cf aliases) et on vérifie l'arrivée du mail: OK. On ouvre le fichier mbox de jules (vi /var/mail/jules) et on recherche amavis: OK, on voit bien que le mail est arrivé dans le | + | * A cette étape, on s'envoie en telnet un message de root à root. On se loggue ensuite en jules (cf aliases) et on vérifie l'arrivée du mail: OK. On ouvre le fichier mbox de jules (vi ''/var/mail/jules'') et on recherche amavis: OK, on voit bien que le mail est arrivé dans le Postfix. |
root@julien:/etc# telnet localhost 25 | root@julien:/etc# telnet localhost 25 | ||
Ligne 1 548 : | Ligne 1 561 : | ||
N 7 stage01@ploplo.fr mar sep 23 16:39 12/385 stage01@ploplo.fr | N 7 stage01@ploplo.fr mar sep 23 16:39 12/385 stage01@ploplo.fr | ||
N 42 rot@ploplo.fr mer sep 24 09:49 12/380 rot@ploplo.fr | N 42 rot@ploplo.fr mer sep 24 09:49 12/380 rot@ploplo.fr | ||
− | N 43 Julien.Pedrono@ins mer sep 24 09:50 12/411 Julien.Pedrono@ | + | N 43 Julien.Pedrono@ins mer sep 24 09:50 12/411 Julien.Pedrono@ploplo.fr |
N 46 jpedrono@ploplo.fr mer sep 24 10:41 12/389 jpedrono@ploplo.fr | N 46 jpedrono@ploplo.fr mer sep 24 10:41 12/389 jpedrono@ploplo.fr | ||
− | N 47 Julien.Pedrono@ins mer sep 24 10:41 12/411 Julien.Pedrono@ | + | N 47 Julien.Pedrono@ins mer sep 24 10:41 12/411 Julien.Pedrono@ploplo.fr |
N 57 root@ploplo.fr mer sep 24 15:25 22/808 test 1 amavis | N 57 root@ploplo.fr mer sep 24 15:25 22/808 test 1 amavis | ||
& 57 | & 57 | ||
Ligne 1 573 : | Ligne 1 586 : | ||
for <root@ploplo.fr>; Wed, 24 Sep 2008 15:25:20 +0200 (CEST) | for <root@ploplo.fr>; Wed, 24 Sep 2008 15:25:20 +0200 (CEST) | ||
Received: from smtp ([127.0.0.1]) | Received: from smtp ([127.0.0.1]) | ||
− | '''by localhost (julien. | + | '''by localhost (julien.ploplo.fr [127.0.0.1]) (amavisd-new, port 10024)''' |
with ESMTP id yk3g66M4XprS for <root@ploplo.fr>; | with ESMTP id yk3g66M4XprS for <root@ploplo.fr>; | ||
Wed, 24 Sep 2008 15:25:20 +0200 (CEST) | Wed, 24 Sep 2008 15:25:20 +0200 (CEST) | ||
Ligne 1 590 : | Ligne 1 603 : | ||
A+ | A+ | ||
− | A ce stade on voit donc que le message est bien passé par | + | * A ce stade on voit donc que le message est bien passé par Amavisd-new, par contre au vu des headers il semblerait que SpamAssassin n'ait fait aucun travail sur ce mail. |
− | |||
− | Quand on voit les logs d' | + | On doit réexaminer la configuration d'Amavisd-new pour utiliser SpamAssassin. |
+ | |||
+ | Quand on voit les logs d'Amavisd-new (modification du logage pour utiliser le syslog, le fichier désigné par moi ne fonctionne pas, il manque une configuration syslog peut être): | ||
==> /var/log/mail.log <== | ==> /var/log/mail.log <== | ||
− | Sep 24 15:48:32 julien amavis[17159]: starting. /usr/sbin/amavisd-new at julien. | + | Sep 24 15:48:32 julien amavis[17159]: starting. /usr/sbin/amavisd-new at julien.ploplo.fr amavisd-new-2.4.2 (20060627), Unicode aware, LANG=fr_FR.UTF-8 |
Sep 24 15:48:32 julien amavis[17159]: Perl version 5.008008 | Sep 24 15:48:32 julien amavis[17159]: Perl version 5.008008 | ||
Sep 24 15:48:32 julien amavis[17166]: Module Amavis::Conf 2.068 | Sep 24 15:48:32 julien amavis[17166]: Module Amavis::Conf 2.068 | ||
Ligne 1 639 : | Ligne 1 653 : | ||
Sep 24 15:48:32 julien amavis[17166]: Internal decoder for .mail | Sep 24 15:48:32 julien amavis[17166]: Internal decoder for .mail | ||
− | Modification de paramètres dans /etc/amavisd.conf: | + | * Modification de paramètres dans ''/etc/amavisd.conf'': |
+ | $final_spam_destiny = D_PASS; '''=> on laisse passer les spams en les marquant''' | ||
+ | $sa_tag_level_deflt = undef; '''=> pour rajouter TOUS les tags dans les headers''' | ||
+ | $sa_tag2_level_deflt = 5.0; '''=> définit le seuil de catégorisation spam''' | ||
+ | $sa_spam_subject_tag = '[SPAM]'; '''=> ce qu'on rajoute au sujet des mails classés en spam''' | ||
+ | @local_domains_maps = (['.$mydomain']); | ||
+ | @bypass_virus_checks_maps = (1); '''=> on désactive la vérification des virus puisqu'on n'a pas encore installé d'AV''' | ||
+ | @bypass_spam_checks_maps = (0); '''=> doit activer le filtrage antispam. !!!! ATTENTION: ancienne syntaxe''' | ||
− | * | + | * Après redémarrage de Amavisd-new, même problème, mêmes observations dans les logs. |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Examen de la nouvelle arborescence de configuration d'Amavisd-new (''/etc/amavis/conf.d''): on trouve un ficier ''15-content_filter_mode''. Ce fichier contient les configurations nécessaires décrites dans ''/etc/amavisd.conf'' dans: | |
− | |||
− | Examen de la nouvelle arborescence de | ||
jules@julien:/etc$ grep bypass_spam /etc/amavisd.conf | jules@julien:/etc$ grep bypass_spam /etc/amavisd.conf | ||
Ligne 1 660 : | Ligne 1 673 : | ||
jules@julien:/etc$ | jules@julien:/etc$ | ||
− | On teste alors en s'envoyant un mail avec un sujet normal, et un avec INSA dans le sujet. | + | * On teste alors en s'envoyant un mail avec un sujet normal, et un avec INSA dans le sujet. |
− | En se logguant en tant que jules, on voit bien le mail au sujet normal arriver normallement et le mail contenant INSA dans le sujet est "reporté" par le | + | |
+ | En se logguant en tant que jules, on voit bien le mail au sujet normal arriver normallement et le mail contenant INSA dans le sujet est "reporté" par le ''content_filter'' subsystem... | ||
root@julien:/etc# telnet localhost 25 | root@julien:/etc# telnet localhost 25 | ||
Ligne 1 704 : | Ligne 1 718 : | ||
'''root@julien:/etc# su jules''' | '''root@julien:/etc# su jules''' | ||
jules@julien:/etc$ '''mail''' | jules@julien:/etc$ '''mail''' | ||
− | R 1 toto@ploplo.fr mar sep 23 11:31 16/489 et root recoit toujours dans l' | + | R 1 toto@ploplo.fr mar sep 23 11:31 16/489 et root recoit toujours dans l'arborescence locale? |
R 2 Mail Delivery Syst mar sep 23 13:11 75/2381 Undelivered Mail Returned to Sender | R 2 Mail Delivery Syst mar sep 23 13:11 75/2381 Undelivered Mail Returned to Sender | ||
U 3 stage01@ploplo.fr mar sep 23 16:13 15/467 U 4 tutu@ploplo.fr mar sep 23 16:16 15/418 U 5 Cron Daemon mar sep 23 16:30 19/649 Cron <jules@julien> /usr/sbin/ntpdate ntp.obspm.fr | U 3 stage01@ploplo.fr mar sep 23 16:13 15/467 U 4 tutu@ploplo.fr mar sep 23 16:16 15/418 U 5 Cron Daemon mar sep 23 16:30 19/649 Cron <jules@julien> /usr/sbin/ntpdate ntp.obspm.fr | ||
Ligne 1 710 : | Ligne 1 724 : | ||
U 7 stage01@ploplo.fr mar sep 23 16:39 14/405 stage01@ploplo.fr | U 7 stage01@ploplo.fr mar sep 23 16:39 14/405 stage01@ploplo.fr | ||
U 8 rot@ploplo.fr mer sep 24 09:49 14/401 rot@ploplo.fr | U 8 rot@ploplo.fr mer sep 24 09:49 14/401 rot@ploplo.fr | ||
− | U 9 Julien.Pedrono@ins mer sep 24 09:50 14/432 Julien.Pedrono@ | + | U 9 Julien.Pedrono@ins mer sep 24 09:50 14/432 Julien.Pedrono@ploplo.fr |
U 10 jpedrono@ploplo.fr mer sep 24 10:41 14/410 jpedrono@ploplo.fr | U 10 jpedrono@ploplo.fr mer sep 24 10:41 14/410 jpedrono@ploplo.fr | ||
− | U 11 Julien.Pedrono@ins mer sep 24 10:41 14/432 Julien.Pedrono@ | + | U 11 Julien.Pedrono@ins mer sep 24 10:41 14/432 Julien.Pedrono@ploplo.fr |
R 12 root@ploplo.fr mer sep 24 15:25 24/830 test 1 amavis | R 12 root@ploplo.fr mer sep 24 15:25 24/830 test 1 amavis | ||
U 15 root@ploplo.fr mer sep 24 16:13 22/829 test d'amavis 2 | U 15 root@ploplo.fr mer sep 24 16:13 22/829 test d'amavis 2 | ||
Ligne 1 720 : | Ligne 1 734 : | ||
& 19 | & 19 | ||
'''Subject: Considered UNSOLICITED BULK EMAIL, apparently from you''' | '''Subject: Considered UNSOLICITED BULK EMAIL, apparently from you''' | ||
− | From: "Content-filter at julien. | + | From: "Content-filter at julien.ploplo.fr" <postmaster@julien.ploplo.fr> |
To: <root@ploplo.fr> | To: <root@ploplo.fr> | ||
Date: Wed, 24 Sep 2008 16:41:37 +0200 (CEST) | Date: Wed, 24 Sep 2008 16:41:37 +0200 (CEST) | ||
Ligne 1 761 : | Ligne 1 775 : | ||
Content-Description: Delivery error report | Content-Description: Delivery error report | ||
− | Reporting-MTA: dns; julien. | + | Reporting-MTA: dns; julien.ploplo.fr |
Received-From-MTA: smtp; smtp ([127.0.0.1]) | Received-From-MTA: smtp; smtp ([127.0.0.1]) | ||
Arrival-Date: Wed, 24 Sep 2008 16:41:26 +0200 (CEST) | Arrival-Date: Wed, 24 Sep 2008 16:41:26 +0200 (CEST) | ||
Ligne 1 796 : | Ligne 1 810 : | ||
UNDISC_RECIPS=0.883] | UNDISC_RECIPS=0.883] | ||
Received: from smtp ([127.0.0.1]) | Received: from smtp ([127.0.0.1]) | ||
− | by localhost (julien. | + | by localhost (julien.ploplo.fr [127.0.0.1]) (amavisd-new, port 10024) |
with ESMTP id pulmMdFRE9cs for <root@ploplo.fr>; | with ESMTP id pulmMdFRE9cs for <root@ploplo.fr>; | ||
Wed, 24 Sep 2008 16:41:07 +0200 (CEST) | Wed, 24 Sep 2008 16:41:07 +0200 (CEST) | ||
Ligne 1 803 : | Ligne 1 817 : | ||
for <root>; Wed, 24 Sep 2008 16:40:48 +0200 (CEST) | for <root>; Wed, 24 Sep 2008 16:40:48 +0200 (CEST) | ||
− | Reste à résoudre le problème de configuration d' | + | * Reste à résoudre le problème de configuration d'Amavisd-new, pour dire à SpamAssassin de ne pas bloquer les spams, mais simplement de modifier le sujet du mail et de le passer au destinataire. |
− | |||
− | |||
[[Category:Configuration]] | [[Category:Configuration]] | ||
[[Category:Howto]] | [[Category:Howto]] | ||
[[Category:Postfix]] | [[Category:Postfix]] | ||
[[Category:Cyrus]] | [[Category:Cyrus]] |
Version actuelle datée du 5 mars 2009 à 15:49
Sommaire
- 1 Introduction
- 2 Vue d'ensemble d'un MTA
- 3 Installation de Postfix
- 4 Configuration avancée de Postfix
- 4.1 Plan
- 4.2 Vérification des boites
- 4.3 Format des bases de mails
- 4.4 Masquage d'adresse
- 4.5 Utilisation des alias
- 4.6 Réécriture d'adresse
- 4.7 Autres interceptions
- 4.8 Utilisation de cyrus-imap
- 4.9 Création de compte d'utilisateurs virtuels
- 4.10 Utilisation de LDAP
- 4.11 Authentification SMTP en envoi
- 4.12 Cryptage des transferts par TLS
- 4.13 Filtrage de contenu
Introduction
Historique Postfix
- Postfix créé sur une rumeur de faille de sécu de sendmail, par Wietse Venema.
- Création dans un souci de sécurité.
- Postfix est un MTA constitué de plusieurs programmes indépendants, "ne se faisant pas confiance mutuellement".
- Postfix prêt à fonctionner quasi "out of the box".
- Dans un premier temps, création de boite = création de compte système.
- Après, autres besoins sans utiliser de comptes systèmes, intégration de MySQL par exemple => entraine besoin de recompilation de Postfix sur des plateforme style Red Hat car fonctionnalité non incluse de base dans le package.
- Voir qemu/kvm (pour proc gérant virtualisation matérielle) pour virtualisation sous linux.
Cadre de la formation
La formation décrite dans cet article a lieu dans le cadre de mon contrat au sein de l'INSA de Rennes.
Cette formation est dispensée par B. Guerin de ENI Consulting.
Site web de la société ENI Consulting
Configuration du serveur de test
Serveur
- Serveur virtuel sur VMWare ESX 3.5 .
- OS: Ubuntu 7.10 LTS upgradé en début de formation.
- Machine raccordée à un VLAN du réseau, ayant accès à Internet.
Configuration réseau
Formation Postfix - Configuration réseau Ubuntu
Configuration Imapd
Formation Postfix - Configuration Imapd
Configuration Cyrus
Formation Postfix - Configuration Cyrus
Configuration PAM
Formation Postfix - Configuration PAM
Configuration SASL
Formation Postfix - Configuration SASL
Configuration Postfix
Configuration de Postfix
Configuration des alias
Formation Postfix - Configuration des alias
Configuration des fichiers canonical
Formation Postfix - Configuration des canonical
Configurations personnelles
Formation Postfix - Configurations personnelles
Configuration accès annuaire LDAP
Formation Postfix - Configuration LDAP
Configuration Amavisd-new
Formation Postfix - Configuration Amavisd-new
Vue d'ensemble d'un MTA
Comptes utilisateurs
Postfix utilise donc des comptes système ou des comptes virtuels.
Comptes virtuels:
- stockage local (mbox, maildir) OU
- stockage externe (fichier séquentiel indexé, MySQL..., non géré par défaut par le MTA)
Comptes virtuels:
- domaines partagés OU
- domaines séparés
- stockage local OU
- stockage externe
Introduction aux commandes de protocole
- Exemple d'utilisation de la commande telnet
- Toujours un code de retour aux commandes SMTP:
- 2xx: OK
- 3xx: informations
- 4xx: erreurs temporaires
- 5xx: erreurs fatales
- Commandes SMTP:
- ehlo <mon_hostname> dialogue en ESMTP OU
- helo dialogue en SMTP
- vrfy vérification existance d'un utilisateur, habituellement désactivé pour sécurité /SPAM
- mail from ENVELOPPE
- rcpt to ENVELOPPE (possibilité de répéter mail from et rcpt to dans le corps)
- data CORPS DU MESSAGE
- Subject
- Commandes POP:
- user
- pass
- list
- retr
Installation de Postfix
Installation du package
apt-get install postfix
Pas de configuration, on va la faire à la main.
Configuration de Postfix
Conf dans /etc/postfix/.
Comme on n'a rien configuré lors de l'installation, besoin de récupérer un fichier de conf vierge (ou de le créer):
cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf vi /etc/postfix/main.cf
Pour éliminer les lignes vides et les lignes de commentaires pour ne récupèrer que les directives de conf:
egrep -v "^$|^#" /etc/postfix/main.cf
Commande postconf: pour connaitre la configuration (totale) de Postfix.
- postconf <directive>: pour connaitre la valeur d'UNE directive:
root@julien:~# postconf swap_bangpath swap_bangpath = yes
- postconf -d <directive>: pour connaitre la valeur par défaut avant surcharge.
- postconf -n: pour connaitre les valeurs différentes de celles par défaut (en gros, celles du main.cf)
- postconf -e <directive>=valeur: pour éditer les valeurs des directives (modif du fichier de conf).
NB : Attention, l'édition des paramètres par postconf -e nécessite un reload ou restart de Postfix! |
---|
root@julien:~# postconf -d mydestination mydestination = $myhostname, localhost.$mydomain, localhost root@julien:~# postconf -e mydestination=ploplo.fr ==> ON CHOISIT UN DOMAINE POUR LA FORMATION root@julien:~# postconf -d myorigin myorigin = $myhostname root@julien:~# postconf -e myorigin=ploplo.fr root@julien:~# postconf myhostname myhostname = julien.localdomain
NB : Attention, $myhostname n'est pas obligatoire, Postfix prend le hostname réel du serveur, par défaut! |
---|
root@julien:~# postconf -e myhostname=<FQDN du serveur>
Si on n'a pas le FQDN du serveur dans myhostname, et que mydomain est renseigné, concaténation de myorigin et mydomain.
- myhostname: si vide prend le hostname par défaut.
- myorigin: pour completer les adresses quand on entre 1 user sans domaine.
- mydomain: pour faire correspondre 1 domaine de délivrance à ce serveur.
- mydestination: contient au moins mydomain + tous les autres domaines que le serveur délivre.
Possibilité de mettre 1 ligne de conf sur plusieurs lignes, si les lignes secondaires comportent des espaces ou des tabulations en début de ligne.
NB : ATTENTION DE NE PAS PLACER D'ESPACES OU DE TABULATION EN DEBUT DE LIGNE (QUAND ON DECOMMENTE PAR EXEMPLE) |
---|
NB : ATTENTION DE NE PAS UTILISER DE DIRECTIVE N'EXISTANT PAS, SINON POSTCONF LA CREE...) |
---|
Pb au start de Postfix: des lignes décommentées dans /etc/postfix/main.cf sans valeur associées:
- recommenter les lignes OU
- fixer des valeurs OU
root@julien:~# postconf -n|grep -v "= *$" > /etc/postfix/main.cf ==> on récupère la configuration actuelle, on en élimine les lignes ou les paramètres ne sont pas renseignés et on les réécrit dans le main.cf
NB : ATTENTION POSTFIX ECOUTE SUR L'INTERFACE PUBLIQUE) |
---|
root@julien:~# postconf -d inet_interfaces inet_interfaces = all => à changer en localhost pour ne relayer que les mails locaux
NB : ATTENTION PB POUR ATTAQUER LE PORT 25) |
---|
Nous n'avons pas de pb réseau, après examen des logs:
==> /var/log/mail.info <== Sep 22 13:50:03 julien postfix/smtpd[5653]: fatal: open database /etc/aliases.db: No such file or directory
Comme /etc/aliases existe il faut regénérer le fichier .db associé
root@julien:~# newaliases
postconf -e mydomain=ploplo.fr postconf -e myhostname=smtp => ce qui est affiché dans la bannière postconf -e myorigin=\$myhostname.\$mydomain postconf -e myorigin=\$mydomain postfix reload
- mydestination: liste des domaines gérés par Postfix, domaines des messages pour lesquels Postfix acceptera des mails (en délivrance locale).
NB : Par défaut Postfix est configuré pour NE PAS ETRE un relai ouvert (Open Relay) |
---|
- relay_domains: liste des domaines gérés en tant que relay.
- relayhost: machine à qui envoyer des mails pour relay vers l'extérieur quand le Postfix ne peut pas directement contacter internet.
NB : Si on veut accepter de relayer pour d'autres réseaux (au sens IP) il existe la directive mynetworks |
---|
- mydomain: définit un domaine à concaténer à myhostname si le hostname n'est pas un FQDN
NB : si le myhostname est déjà un FQDN, le mydomain sera la partie terminale du FQDN |
---|
- myorigin: valeur par défaut pour completer mail from ou rcpt to...
Configuration avancée de Postfix
Plan
- Vérification des boites
- Distribution du courrier (sans pop)
- Gestion des adresses (alias)
- Multi domaines
- Filtrage de contenu
- Relayage/Authentification
Vérification des boites
root@julien:~# postconf local_recipient_maps local_recipient_maps = proxy:unix:passwd.byname $alias_maps root@julien:~#
- Désigne à Postfix la manière de rechercher les boites existantes (d'abord les comptes unix puis la directive alias_maps).
root@julien:~# postconf alias_maps alias_maps = hash:/etc/aliases, nis:mail.aliases root@julien:~#
root@julien:~# postconf -e local_recipient_maps='proxy:unix:passwd.byname $alias_maps hash:/etc/postfix/mesusers' root@julien:~#
- On enrichit la manière dont Postfix détecte les boites mail.
root@julien:~# postconf local_recipient_maps local_recipient_maps = proxy:unix:passwd.byname $alias_maps hash:/etc/postfix/mesusers root@julien:~# more /etc/postfix/mesusers julien ok davy ok roderick ok root@julien:~#
- On associe 1 clé avec 1 valeur (pour l'instant on s'occupe surtout de la clé).
- On a besoin de "compiler" cette "base de donnée":
root@julien:~# postmap /etc/postfix/mesusers root@julien:~# ls -la /etc/postfix/mesusers* -rw-r--r-- 1 root root 30 2008-09-22 15:54 /etc/postfix/mesusers -rw-r--r-- 1 root root 12288 2008-09-22 15:55 /etc/postfix/mesusers.db root@julien:~#
- hash pour désigner un fichier compilé de relations clé-valeur.
- Pour avoir la liste des formats:
root@julien:~# postconf -m btree cidr environ hash nis proxy regexp sdbm static tcp unix root@julien:~#
- On vérifie qu'on a le user davy que dans notre nouvelle base:
root@julien:~# id davy id: davy: No such user root@julien:~# grep davy /etc/aliases root@julien:~# grep davy /etc/postfix/mesusers davy ok root@julien:~# postfix reload postfix/postfix-script: refreshing the Postfix mail system root@julien:~#
- On peut tester:
root@julien:~# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN mail from: toto@titi.fr 250 2.1.0 Ok rcpt to: davy 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> Subject: teststststst liheugh hezkfugze ihzef . 250 2.0.0 Ok: queued as 70FA3BA4E quit 221 2.0.0 Bye Connection closed by foreign host. root@julien:~#
- A cette étape, qu'est devenu le mail?
root@julien:~# postconf mail_spool_directory mail_spool_directory = /var/mail
- On voit dans les logs que ce user n'est pas reconnu...
root@julien:~# ls -la /var/mail total 16 drwxrwsr-x 2 root mail 4096 2008-09-22 16:00 . drwxr-xr-x 15 root root 4096 2008-05-05 16:58 .. -rw------- 1 jules mail 4940 2008-09-22 16:03 jules root@julien:~#
- Ici le fichier des mails de jules est un fichier qui appartient au user jules. Adresse reconnue par Postfix et par le système.
- Pour davy, adresse reconnue par Postfix (via /etc/postfix/mesusers.db) mais pas par le système.
Format des bases de mails
- Format mbox: vient de sendmail à l'origine. 1 fichier par utilisateur/b.a.l.
- Format Maildir: vient de qmail. 1 répertoire par utilisateur, dans lequel on aura 1 fichier par message.
NB : ATTENTION: on ne change pas SIMPLEMENT d'un format à l'autre, nécessite des conversions, etc |
---|
Comment bien choisir son format de stockage? (Pb d'accès concurrents à 1 fichier, pb de taille max d'un fichier, etc)
root@julien:~# postconf mail_spool_directory mail_spool_directory = /var/mail/ => le dernier / après mail indique à Postfix qu'on souhaite utiliser un format Maildir au lieu du format mbox root@julien:~# postconf home_mailbox home_mailbox = => si on renseigne cette directive, les mails n'iront plus dans un dossier centralisé mais dans un dossier du même nom dans le homedir de l'utilisateur
Différents formats utilisés en fonction des serveurs POP/IMAP:
- dovecot: mbox/maildir => d'ou le choix pour la formation
- cyrus-imap: spécifique (fichier séquentiel indexé)
- courrier-imap: maildir
- wu-imap: mbox
Masquage d'adresse
root@julien:~# postconf myorigin myorigin = $mydomain root@julien:~# postconf mydomain mydomain = ploplo.fr root@julien:~# postconf -e myorigin=\$myhostname root@julien:~# postconf myorigin myorigin = $myhostname root@julien:~# postconf mydomain mydomain = ploplo.fr root@julien:~# postconf masquerade_domains masquerade_domains = root@julien:~# postconf -e masquerade_domains=\$mydomain root@julien:~# postfix reload postfix/postfix-script: refreshing the Postfix mail system root@julien:~#
- sans masquerade, quand on écrit l'expéditeur est <utilisateur>@<hostname>.<myorigin>
- avec, on n'aura que <utilisateur>@<masquerade domains>
- on peut appliquer le masque à tout sauf certaines adresses: masquerade_domains=!info.ploplo.fr,!compta.ploplo.fr,$mydomain
Exemple pour les réécritures: de jpedrono@ploplo.fr on passe à Julien.Pedrono@ploplo.fr
Utilisation des alias
On modifie le fichier /etc/aliases et on le recompile avec newaliases.
Réécriture d'adresse
root@julien:~# postconf canonical_maps canonical_maps = root@julien:~# postconf sender_canonical_maps sender_canonical_maps = root@julien:~# postconf recipient_canonical_maps recipient_canonical_maps = root@julien:~#
- Les canonical_maps gèrent à la fois les réécriture en entrée et en sortie du MTA
- La sender_map gère les réécriture pour la sortie du MTA
- La recipient_map gère les réécriture en entrée du MTA
Mettre des exemples des fichiers
Autres interceptions
- Utilisation de la directive relocated_maps
root@julien:~# postconf -e relocated_maps=hash:/etc/postfix/reloc root@julien:~# postfix reload postfix/postfix-script: refreshing the Postfix mail system root@julien:~# vi /etc/postfix/reloc root@julien:~# postmap /etc/postfix/reloc root@julien:~# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN mail from: root 250 2.1.0 Ok rcpt to: maurice 550 5.1.1 <maurice>: Recipient address rejected: User has moved to maurice@orange.fr
Utilisation de cyrus-imap
root@julien:~# apt-get update root@julien:~# apt-cache search cyrus root@julien:~# apt-get install cyrus-common-2.2 cyrus-imapd-2.2 root@julien:~# netstat -tpln Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 3648/mysqld tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 8127/cyrmaster tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 8127/cyrmaster tcp 0 0 127.0.0.1:2000 0.0.0.0:* LISTEN 8127/cyrmaster tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3779/apache2 tcp 0 0 0.0.0.0:119 0.0.0.0:* LISTEN 8127/cyrmaster tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 6408/master tcp6 0 0 :::110 :::* LISTEN 8127/cyrmaster tcp6 0 0 :::143 :::* LISTEN 8127/cyrmaster tcp6 0 0 :::22 :::* LISTEN 3726/sshd tcp6 0 0 :::119 :::* LISTEN 8127/cyrmaster root@julien:~#
- Installation de SASL:
root@julien:~# apt-cache search sasl root@julien:~# apt-get install libsasl2 root@julien:~# apt-get install sasl2-bin root@julien:~# useradd toto => création d'un user toto pour le test root@julien:~# passwd toto root@julien:~# testsaslauthd -u toto -p toto => pour tester le fonctionnement de SASL root@julien:~# /etc/init.d/saslauthd start => échec root@julien:~# vi /etc/default/saslauthd => passage de l'option de start à yes root@julien:~# /etc/init.d/saslauthd start => OK root@julien:~# testsaslauthd -u toto -p toto => OK
- Modification de la configuration d'imapd: (/etc/imapd.conf)
sasl_mech_list: PLAIN sasl_pwcheck_method: saslauthd
- Configuration de SASL: (/etc/default/saslauthd)
Utilise déjà PAM par défaut...
- Pb pour telnet sur port 110, juste ouverture du socket
- Examen de /var/log/syslog
- Pb pour trouver l'executable pop et nntp:
root@julien:~# apt-get install cyrus-pop3d-2.2
- Intégration de SASL pour Cyrus OK, pb d'existance de boite mail pour mon utilisateur de test (toto/toto).
- Utilisation de cyradm:
On utilise le format de boites mails Cyrus (fichier séquentiel indexé) pour les mailboxes, donc on utilise Cyrus afin de créer la boite d'un user
root@julien:~# grep cyrus /etc/passwd cyrus:x:106:8:Cyrus Mailsystem User,,,:/var/spool/cyrus:/bin/sh root@julien:~# passwd cyrus Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully root@julien:~# ps faux|grep cyrus root 10670 0.0 0.1 2884 752 pts/0 S+ 09:34 0:00 | \_ grep cyrus cyrus 8569 0.0 0.4 7752 2448 ? Ss Sep22 0:00 /usr/sbin/cyrmaster -d cyrus 8574 0.0 0.2 24260 1456 ? S Sep22 0:00 \_ notifyd root@julien:~# man cyradm Reformatting cyradm(1p), please wait... root@julien:~# cyradm --user cyrus localhost IMAP Password: localhost.localdomain> cm user.toto => cm pour Create Mailbox createmailbox: Permission denied localhost.localdomain> quit root@julien:~# vi /etc/imapd.conf => on décommente admin=cyrus dans la conf et on recommence root@julien:~# /etc/init.d/cyrus2.2 restart Stopping Cyrus IMAPd: cyrmaster. Waiting for complete shutdown... Starting Cyrus IMAPd: cyrmaster. root@julien:~# cyradm --user cyrus localhost IMAP Password: localhost.localdomain> cm user.toto localhost.localdomain>
- A cette étape, toto est un compte système et a une mailbox dans Cyrus.
- On continue l'exemple sur un compte système pour ne pas s'embeter avec un autre système de profil pour l'instant.
root@julien:~# postconf mailbox_transport mailbox_transport =
- Pour l'instant le spool des mails est désigné par la configuration Postfix et utilise le format mbox.
- On consulte /etc/cyrus.conf pour trouver les infos de socket (/var/run/cyrus/socket/lmtp):
root@julien:~# postconf -e mailbox_transport=lmtp:unix:/var/run/cyrus/socket/lmtp root@julien:~# /etc/init.d/cyrus2.2 restart Stopping Cyrus IMAPd: cyrmaster. Waiting for complete shutdown... Starting Cyrus IMAPd: cyrmaster. root@julien:~#
- A cette étape on teste:
root@julien:~# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN mail from: root 250 2.1.0 Ok rcpt to: toto 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> Subject: test d'envoi de mail à toto, user Cyrus Et ca fonctionne? A+ . 250 2.0.0 Ok: queued as 037D9BAB6 quit 221 2.0.0 Bye Connection closed by foreign host. root@julien:~# telnet localhost 110 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. +OK julien Cyrus POP3 v2.2.13-Debian-2.2.13-10ubuntu2 server ready <1550635526.1222156316@julien> user toto +OK Name is a valid mailbox pass toto +OK Mailbox locked and ready
- PB: on a un pb avec la lecture/écriture du socket lmtp
- Après recherche, nécessité sur Debian de modifier la conf concernant le chrootage...
lmtp unix - - n - - lmtp + restart de Postfix et Cyrus, OK
- PB: on souhaiterais conserver le chrootage.
On va plutot "créer un lien" entre la cage de Postfix et le dossier du socket:
- Cyrus écrit dans /var/run/cyrus/socket/lmtp
- ce nom de socket est passé à Postfix dans sa conf (via directive mailbox_transport)
- Postfix est chrooté, il considère /var/spool/postfix comme sa racine, donc il recherche var/run... sous sa racine... => PB car fichier inexistant en réalité
- test avec construction de l'arborescence réellement + mount -o bind <arborescence de base> <arborescence chrootée> OK, mais solution plus simple:
- on a /var/spool/postfix/private/ avec un socket lmtp dedans => on modifie les configurations de Postfix et Cyrus pour utiliser ce socket au lieu de celui de l'arborescence de Cyrus.
NB : il faut donner à Postfix le chemin RELATIF vers le socket (/private/lmtp) puisqu'il est déjà chrooté |
---|
PB avec cette solution, les mails ne sont pas délivrés... A VOIR en changeant les droits d'accès à /var/spool/postfix/private
Création de compte d'utilisateurs virtuels
- Utilisation de la directive fallback_transport:
root@julien:/var/run/cyrus# postconf -e mailbox_transport= root@julien:/var/run/cyrus# postconf -e fallback_transport=lmtp:unix:/var/run/cyrus/socket/lmtp
- Avec mailbox_transport, on n'utilise plus les dossiers locaux de stockage des mails désigné par la configuration Postfix (/var/spool/mail...), on passe tout à Cyrus
- Si on veut continuer à délivrer sur disque aux utilisateurs locaux et à gèrer des utilisateurs "virtuels" (n'ayant pas de comptes système), on remet à blanc la directive mailbox_transport et on instancie fallback_tranport. La sémantique est différente: on délivre en local, et si on ne peut pas on passe au fallback...
root@julien:/var/run/cyrus# /etc/init.d/postfix restart * Stopping Postfix Mail Transport Agent postfix [ OK ] * Starting Postfix Mail Transport Agent postfix [ OK ] root@julien:/var/run/cyrus#
- A ce moment là, root et toto recoivent sur leurs comptes système, reste à créer un moyen d'identifier l'utilisateur virtuel (LDAP, MySQL...).
Utilisation de LDAP
- Utilisation de l'annuaire local:
root@julien:/var/run/cyrus# id david id: david: No such user root@julien:/var/run/cyrus# apt-get install ldap-utils ... root@julien:/var/run/cyrus# postconf local_recipient_maps local_recipient_maps = proxy:unix:passwd.byname $alias_maps hash:/etc/postfix/mesusers root@julien:/var/run/cyrus# postconf -e local_recipient_maps='proxy:unix:passwd.byname $alias_maps ldap:/etc/postfix/ldapusers.conf' root@julien:/var/run/cyrus# postfix reload postfix/postfix-script: refreshing the Postfix mail system root@julien:/var/run/cyrus# root@julien:/var/run/cyrus# vi /etc/postfix/ldapusers.conf root@julien:/var/run/cyrus# more /etc/postfix/ldapusers.conf server_host = annuaire.ploplo.fr server_port = 389 search_base = dc=ploplo,dc=fr query_filter = uid=%s root@julien:/var/run/cyrus# id david id: david: No such user root@julien:/var/run/cyrus# grep david /etc/aliases root@julien:/var/run/cyrus# grep david /etc/postfix/recipientcanonical root@julien:/var/run/cyrus# grep david /etc/postfix/sendercanonical root@julien:/var/run/cyrus# grep david /etc/postfix/canonicalmap root@julien:/var/run/cyrus#
- PB: pas d'interface Postfix - LDAP:
root@julien:/var/run/cyrus# apt-get install postfix-ldap ... root@julien:/var/run/cyrus# /etc/init.d/postfix restart * Stopping Postfix Mail Transport Agent postfix [ OK ] * Starting Postfix Mail Transport Agent postfix [ OK ] root@julien:/var/run/cyrus#
- PB: pb de version entre client et serveur:
root@julien:/var/run/cyrus# more /etc/postfix/ldapusers.conf server_host = annuaire.ploplo.fr server_port = 389 search_base = dc=ploplo,dc=fr query_filter = uid=%s result_attribute = uid version = 3 root@julien:/var/run/cyrus# root@julien:/var/run/cyrus# /etc/init.d/postfix restart * Stopping Postfix Mail Transport Agent postfix [ OK ] * Starting Postfix Mail Transport Agent postfix [ OK ] root@julien:/var/run/cyrus# root@julien:/var/run/cyrus# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN mail from: root 250 2.1.0 Ok rcpt to: stage01 250 2.1.5 Ok quit 221 2.0.0 Bye Connection closed by foreign host. root@julien:/var/run/cyrus#
- A cette étape on reconnait aussi des utilisateurs LDAP en plus de ceux déclarés sur le système et dans les maps ==> On crée 1 boite dans Cyrus pour l'utilisateur LDAP:
jules@julien:/var/run/cyrus$ cyradm -u cyrus localhost IMAP Password: localhost.localdomain> cm user.stage01 localhost.localdomain> quit jules@julien:/var/run/cyrus$
- On vérifie que notre SASL sait s'interfacer avec LDAP:
jules@julien:/var/run/cyrus$ saslauthd -v saslauthd 2.1.22 authentication mechanisms: sasldb getpwent kerberos5 pam rimap shadow ldap jules@julien:/var/run/cyrus$
- On va expliquer à SASL comment s'interfacer avec LDAP:
root@julien:/var/run/cyrus# more /etc/saslauthd.conf ldap_servers: ldap://annuaire.ploplo.fr ldap_search_base: dc=ploplo,dc=fr root@julien:/var/run/cyrus# more /etc/default/saslauthd # # Settings for saslauthd daemon #
# Should saslauthd run automatically on startup? (default: no) #START=no START=yes # Which authentication mechanisms should saslauthd use? (default: pam) # # Available options in this Debian package: # getpwent -- use the getpwent() library function # kerberos5 -- use Kerberos 5 # pam -- use PAM # rimap -- use a remote IMAP server # shadow -- use the local shadow password file # sasldb -- use the local sasldb database file # ldap -- use LDAP (configuration is in /etc/saslauthd.conf) # # Only one option may be used at a time. See the saslauthd man page # for more information. # # Example: MECHANISMS="pam" #MECHANISMS="pam" MECHANISMS="ldap" ... root@julien:/var/run/cyrus# /etc/init.d/saslauthd restart * Restarting SASL Authentication Daemon saslauthd [ OK ] root@julien:/var/run/cyrus# root@julien:/var/run/cyrus# testsaslauthd -u stage01 -p ****** 0: OK "Success." root@julien:/var/run/cyrus# telnet localhost 110 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. +OK julien Cyrus POP3 v2.2.13-Debian-2.2.13-10ubuntu2 server ready <1462388999.1222169808@julien> user stage01 +OK Name is a valid mailbox pass ****** +OK Mailbox locked and ready list +OK scan listing follows 1 528 . retr 1 +OK Message follows Return-Path: <root@ploplo.fr> Received: from smtp ([unix socket]) by julien (Cyrus v2.2.13-Debian-2.2.13-10ubuntu2) with LMTPA; Tue, 23 Sep 2008 13:13:55 +0200 X-Sieve: CMU Sieve 2.2 Received: from julien (localhost.localdomain [127.0.0.1]) by smtp (Postfix) with ESMTP id D41A0BA56 for <stage01>; Tue, 23 Sep 2008 13:13:36 +0200 (CEST) Subject: test Jules 2 Message-Id: <20080923111340.D41A0BA56@smtp> Date: Tue, 23 Sep 2008 13:13:36 +0200 (CEST) From: root@ploplo.fr To: undisclosed-recipients:; bla bla . quit
NB : à cette étape on ne peut plus utiliser l'utilisateur local Cyrus pour cyradm (puisque AUTH sur LDAP...) |
---|
- 1 solution peut être d'utiliser un compte LDAP pour s'authentifier en admin Cyrus
- 1 autre solution plus élégante:
- configurer SASL (/etc/default/saslauthd) pour utiliser pam + redémarrer SASL
- configurer /etc/pam.d/imap pour y ajouter "auth sufficient pam_ldap.so" et "account sufficient pam_ldap.so"
- configurer /etc/pam.d/pop pour y ajouter "auth sufficient pam_ldap.so" et "account sufficient pam_ldap.so"
- configurer /etc/ldap/ldap.conf (modifier la partie host annuaire.ploplo.fr et base dc=ploplo,dc=fr)
root@julien:/var/run/cyrus# testsaslauthd -u stage01 -p ****** 0: NO "authentication failed"
- PB: EN FAIT le fichier de configuration LDAP pour pam est /etc/pam_ldap.conf... modifier l'URI, sinon /etc/ldap/ldap.conf sert pour des clients type ldapsearch qui utilisent l'annuaire.
root@julien:/var/run/cyrus# testsaslauthd -u stage01 -p ***** -s imap 0: OK "Success." root@julien:/var/run/cyrus# telnet localhost 110 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. +OK julien Cyrus POP3 v2.2.13-Debian-2.2.13-10ubuntu2 server ready <4165735499.1222172952@julien> user stage01 +OK Name is a valid mailbox pass ****** +OK Mailbox locked and ready list +OK scan listing follows 1 528 . retr 1 +OK Message follows Return-Path: <root@ploplo.fr> Received: from smtp ([unix socket]) by julien (Cyrus v2.2.13-Debian-2.2.13-10ubuntu2) with LMTPA; Tue, 23 Sep 2008 13:13:55 +0200 X-Sieve: CMU Sieve 2.2 Received: from julien (localhost.localdomain [127.0.0.1]) by smtp (Postfix) with ESMTP id D41A0BA56 for <stage01>; Tue, 23 Sep 2008 13:13:36 +0200 (CEST) Subject: test Jules 2 Message-Id: <20080923111340.D41A0BA56@smtp> Date: Tue, 23 Sep 2008 13:13:36 +0200 (CEST) From: root@ploplo.fr To: undisclosed-recipients:; bla bla . quit +OK Connection closed by foreign host. root@julien:/var/run/cyrus#
Authentification SMTP en envoi
- Utilisation directive smtpd_sasl_auth_enable:
root@julien:/var/run/cyrus# postconf -e smtpd_sasl_auth_enable=yes root@julien:/var/run/cyrus# postfix reload root@julien:/var/run/cyrus# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
- Utilisation directive broken_sasl_auth_clients:
root@julien:/var/run/cyrus# postconf -e broken_sasl_auth_clients=yes root@julien:/var/run/cyrus# postfix reload postfix/postfix-script: refreshing the Postfix mail system root@julien:/var/run/cyrus# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-AUTH=CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
Permet aux clients non respectueux de la RFC (ex. clients microsoft) de s'authentifier
- Il faut dire à Postfix sur quelle méthode se baser pour l'authentification:
root@julien:/var/run/cyrus# postconf smtpd_sasl_path smtpd_sasl_path = smtpd root@julien:/var/run/cyrus# vi /usr/lib/sasl2/smtpd.conf root@julien:/var/run/cyrus# more /usr/lib/sasl2/smtpd.conf pwcheck_method: saslauthd root@julien:/var/run/cyrus# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-AUTH=CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth login 334 VXNlcm5hbWU6
- INFO: VXN... est une chaine de caractère encodée en base64:
# perl -MMIME::Base64 -e "print decode_base64('VXNlcm5hbWU6')
Nous renvoie Username: , donc un encodage sur 7 bits pour assurer la compatibilité arrière avec de vieux équipements.
root@julien:/var/run/cyrus# perl -MMIME::Base64 -e "print decode_base64('VXNlcm5hbWU6')" Username:root@julien:/var/run/cyrus#
- PB: l'authentification ne fonctionne pas. Un oubli: préciser une méthode d'authentification pour SMTP à pam:
root@julien:/var/run/cyrus# more /etc/pam.d/smtp auth sufficient pam_ldap.so account sufficient pam_ldap.so root@julien:/var/run/cyrus#
- PB: manque des authorisations pour les connexions avec des comptes locaux
root@julien:/var/run/cyrus# cp /etc/pam.d/imap /etc/pam.d/smtp (C'est le même contenu de fichier)
- PB: Toujours PB avec generic failure...
- Vérification des droits au niveau du socket mux, pas de pb
- Vérification des chrootages, smtpd toujours chrooté, donc ne vois pas le fichier socket
- On dé chroote smtpd dans /etc/postfix/master.cf + /etc/init.d/postfix restart, et l'authentification via telnet sur le port 25 fonctionne:
root@julien:/var/run/cyrus# perl -MMIME::Base64 -e 'print encode_base64("stage01\0stage01\******")' c3RhZ2Uw*****FnZTAxAHByMDFzdGc= root@julien:/var/run/cyrus# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-AUTH=CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth plain c3RhZ2Uw*****FnZTAxAHByMDFzdGc= 235 2.0.0 Authentication successful
- Examen de la configuration des restrictions dans Postfix:
root@julien:/var/run/cyrus# postconf |grep restriction smtpd_client_restrictions = smtpd_data_restrictions = smtpd_end_of_data_restrictions = smtpd_etrn_restrictions = smtpd_helo_restrictions = smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination smtpd_restriction_classes = smtpd_sender_restrictions = root@julien:/var/run/cyrus#
Juste après le telnet (après l'ouverture du socket), vérification des restrictions au niveau du client (smtpd_client_restrictions), ensuite restrictions de type ehlo, puis sender, puis recipient.
Chaque restriction (comme dans l'exemple du smtpd_recipient_restrictions) peut être constitué de plusieurs règles.
C'est grâce à cette directive, telle quelle, que Postfix ne fonctionne pas comme un relai ouvert. Les règles répondent OK, REJECT ou DUNNO (je ne sais pas).
- Les règles de type PERMIT renvoient soit OK, soit DUNNO
- Les règles de type REJECT renvoient soit REJET, soit DUNNO
Si la règle permit_mynetworks est renseigné, si le client vient d'un réseau compris dans cette directive, réponse OK et ca suffit (ou n'examine pas la suite des règles de la directive). Si réponse DUNNO, on parcours la suite des règles de la directive.
Si le récipient ne fais pas partie des mydestination, reject_unauth_destination répond REJECT.
Si on souhaite modifier le comportement par défaut des règles et restictions, on peut rajouter à la fin des règles des OK(PERMIT) ou des REJECT.
Restrictions, exemples:
- client: permit_mynetwork: OK si ds réseau, DUNNO sinon => OK!!! Donc la configuration ne servirait à rien. On ne peux pas non plus utiliser une règle telle que reject_unauth_destination puisqu'on n'a pas encore ces infos
- helo: si on ne veut que des helo "propres", ex. avec smtpd_helo_restrictions=reject_non_fqdn_helo_hostname. Avec smtpd_delay_reject=no permet de rejeter tout de suite après le ehlo, pas après le rcpt to. Cependant par défaut rejet après rcpt to pour des raisons de manière d'implémenter les clients.
- sender
- recipient
man 5 postconf => pour avoir le détail des paramètres
- Maintenant on va forcer le Postfix à nous authentifier:
root@julien:/var/run/cyrus# postconf -e smtpd_client_restrictions=permit_sasl_authenticated,reject
On demande à l'utilisateur de se connecter et de s'authentifier. Pb si utilisé seul, en cas d'echec de l'auth, répond DUNNO et donc passe, d'ou le reject en fin de restriction. Si on vire le reject, tout passe même en cas de non authentification ou de mauvaise authentification.
- Cette fois on veut autoriser le telnet local SANS authentification et le telnet distant AVEC authentification:
root@julien:/var/run/cyrus# postconf -e smtpd_client_restrictions=hash:/etc/postfix/net-ok,permit_sasl_authenticated,reject root@julien:/var/run/cyrus# postfix reload postfix/postfix-script: refreshing the Postfix mail system root@julien:/var/run/cyrus# vi /etc/postfix/net-ok root@julien:/var/run/cyrus# postmap /etc/postfix/net-ok root@julien:/var/run/cyrus# more /etc/postfix/net-ok 127.0.0.1 OK root@julien:/var/run/cyrus#
- A cette étape, on peut s'authentifier avec un compte et faire un mail from depuis 1 autre compte (s'authentifier en stage01 et faire un mail from: root par exemple) ce qui peut être une faille également.
root@julien:/var/run/cyrus# postconf -e smtpd_sender_restrictions=reject_sender_login_mismatch root@julien:/var/run/cyrus# postconf -e smtpd_sender_login_maps=hash:/etc/postfix/loginsasl root@julien:/var/run/cyrus# postconf -e smtpd_sender_restrictions=reject_sender_login_mismatch root@julien:/var/run/cyrus# postfix reload postfix/postfix-script: refreshing the Postfix mail system root@julien:/var/run/cyrus# vi /etc/postfix/loginsasl root@julien:/var/run/cyrus# more /etc/postfix/loginsasl stage01@ploplo.fr stage01 root@julien:/var/run/cyrus# postmap /etc/postfix/loginsasl root@julien:/var/run/cyrus# postmap -q stage01@ploplo.fr /etc/postfix/loginsasl stage01 root@julien:/var/run/cyrus# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-AUTH=CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth plain c3RhZ2Uw******GFnZTAxAHByMDFzdGc= 235 2.0.0 Authentication successful mail from: stage01 250 2.1.0 Ok rcpt to: root 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> coucou . 250 2.0.0 Ok: queued as 39AB3BA56 quit 221 2.0.0 Bye Connection closed by foreign host. root@julien:/var/run/cyrus#
- A ce stade cela fonctionne pour 1 compte déclaré dans /etc/postfix/loginsasl. On a fait le lien entre 1 adresse mail et 1 login. Il est plus intéressant de générer dynamiquement ces correspondances via l'annuaire LDAP.
man ldap_table
=> pour vérifier les paramètres d'un accès LDAP
root@julien:~# postconf smtpd_sender_login_maps smtpd_sender_login_maps = hash:/etc/postfix/loginsasl root@julien:~# more /etc/postfix/loginsasl stage01@ploplo.fr stage01 root@julien:~# postconf -e smtpd_sender_login_maps=ldap:/etc/postfix/ldap-loginsasl.conf root@julien:~# postfix reload postfix/postfix-script: refreshing the Postfix mail system root@julien:~# vi /etc/postfix/ldap-loginsasl.conf root@julien:~# more /etc/postfix/ldap-loginsasl.conf version = 3 server_host = ldap://annuaire.ploplo.fr server_port = 389 search_base = dc=ploplo,dc=fr query_filter = mail=%s result_attribute = uid root@julien:~# postmap -q stage01@ploplo.fr ldap:/etc/postfix/ldap-loginsasl.conf root@julien:~# postmap -q jpedrono@ploplo.fr ldap:/etc/postfix/ldap-loginsasl.conf root@julien:~# postmap -q Julien.Pedrono@ploplo.fr ldap:/etc/postfix/ldap-loginsasl.conf jpedrono root@julien:~#
- Test de la solution mise en place:
root@julien:~# perl -MMIME::Base64 -e 'print encode_base64("jpedrono\0jpedrono\0******")' anBlZHJvbm8Aa******m8AUXZ2bG1zbSE= root@julien:~# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-AUTH=CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth plain anBlZHJvbm8Aa******m8AUXZ2bG1zbSE= ici d'après la configiguration précédemment mise en place on n'a pas besoin de s'authentifier, on le fait juste pour tester notre configuration 235 2.0.0 Authentication successful mail from: Julien.Pedrono 250 2.1.0 Ok rcpt to: jules 553 5.7.1 <Julien.Pedrono>: Sender address rejected: not owned by user jpedrono quit 221 2.0.0 Bye Connection closed by foreign host. root@julien:~# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-AUTH=CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth plain anBlZHJvbm8Aa******m8AUXZ2bG1zbSE= 235 2.0.0 Authentication successful mail from: Julien.Pedrono@ploplo.fr 250 2.1.0 Ok rcpt to: root 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> coucou 2 . 250 2.0.0 Ok: queued as 6DBB2BA56 quit 221 2.0.0 Bye Connection closed by foreign host. root@julien:~#
- On constate donc que le forcage de la correspondance login <=> adresse mail stockée dans LDAP fonctionne. On souhaite pouvoir s'authentifier et écrire quand il y a correspondance login <=> adresse mail OU login <=> login. Une solution: utiliser 2 fichiers de configuration LDAP ou rajouter une condition et un OU dans la configuration LDAP actuelle:
root@julien:~# vi /etc/postfix/ldap-loginsasl.conf root@julien:~# more /etc/postfix/ldap-loginsasl.conf version = 3 server_host = ldap://annuaire.ploplo.fr server_port = 389 search_base = dc=ploplo,dc=fr query_filter = (|(mail=%s)(uid=%u)) result_attribute = uid
- Puis on teste:
root@julien:~# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-AUTH=CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth plain anBlZHJvbm8Aa******m8AUXZ2bG1zbSE= 235 2.0.0 Authentication successful mail from: jpedrono 250 2.1.0 Ok rcpt to: root 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> coucou 3 . 250 2.0.0 Ok: queued as 73F41BA56 => avec un login valide ca fonctionne mail from: Julien.Pedrono@ploplo.fr 250 2.1.0 Ok rcpt to: root 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> coucou 4 . 250 2.0.0 Ok: queued as B3E78BA56 => avec une adresse mail valide ca fonctionne mail from: Julien.Pedrono 250 2.1.0 Ok rcpt to: root 553 5.7.1 <Julien.Pedrono>: Sender address rejected: not owned by user jpedrono => avec qq chose ne correspondant pas au login ou au mail lié à l'authentification, ca droppe quit 221 2.0.0 Bye Connection closed by foreign host. root@julien:~#
Cryptage des transferts par TLS
Coté Postfix, on peut configurer le TLS de plusieurs manières:
- On peut le rendre dispo (communication avec ou sans).
- On peut le forcer (communication uniquement avec).
De plus, dans le cas ou un Postfix discute avec un autre MTA (relayage), le Postfix est client:
- On peut préciser si le client crypte.
- On peut préciser si le client ne crypte pas.
Pour connaitre les directives pour la mise en place et la configuration de SSL3/TLS1:
root@julien:~# postconf -d|grep tls
Cryptage symétrique à clé publique:
INCONVENIENT: besoin de transmettre en clair la clé publique au préalable. Comporte un risque d'interception.
Cryptage assymétrique à clé privée:
Méthode plus sure que le cryptage symétrique. Dans ce cas la clé publique sert à crypter et la clé privée à décrypter.
Cryptage symétrique à clé partagée:
Pb avec schéma 7: on n'est pas sur malgré tout que le message viennent bien de A, rien ne le prouve. Utilisation des hash: celui qui fournit sa clé publique doit aussi fournir l'algorithme de hashage et le hash obtenu, ou utiliser des certificats d'authorités de certification (dont on peut connaitre le hashage sans partager d'infos).
Explication de l'utilisation des checksum pour assurer l'authenticité de l'identité de A:
- CRC => collisions
- MD5 => collisions (2 messages peuvent donner la même signature)
- sha => pas de collisions
Dans le schéma 8 on parle en quelque sorte d'authentification, du coup.
Le cryptage sert à plusieurs choses:
- vérifier l'intégrité des données
- assurer la confidentialité du transfert
- assurer l'authenticité de l'expéditeur
- non répudiation: un expéditeur ne peut nier avoir envoyé 1 message.
Filtrage de contenu
- On installe SpamAssassin via aptitude:
root@julien:~# apt-get update root@julien:~# apt-cache search spamassassin exim4-daemon-heavy - exim MTA (v4) daemon with extended features, including exiscan-acl amavisd-new - Interface between MTA and virus scanner/content filters amavisd-new-milter - Interface between sendmail-milter and amavisd-new clamassassin - email virus filter wrapper for ClamAV crm114 - The Controllable Regex Mutilator and Spam Filter horde-sam - spam module for Horde Framework listadmin - command line mailman moderator queue manipulation qsf - small and fast Bayesian spam filter sa-exim - Use spamAssassin at SMTP time with the Exim v4 MTA spamass-milter - milter for filtering mail through spamassassin spamassassin - Perl-based spam filter using text analysis spamassassin-rules-ja - Japanese filter rules for spamassassin spamc - Client for SpamAssassin spam filtering daemon spampd - spamassassin based SMTP/LMTP proxy daemon sylpheed-claws-gtk2-spamassassin - SpamAssassin plugin for Sylpheed-Claws GTK2 sylpheed-claws-spamassassin - SpamAssassin plugin for Sylpheed Claws root@julien:~# root@julien:~# apt-get install spamassassin ... root@julien:~# ls /usr/share/spamassassin/ 10_misc.cf 25_accessdb.cf 30_text_nl.cf 20_advance_fee.cf 25_antivirus.cf 30_text_pl.cf 20_anti_ratware.cf 25_body_tests_es.cf 30_text_pt_br.cf 20_body_tests.cf 25_body_tests_pl.cf 50_scores.cf 20_compensate.cf 25_dcc.cf 60_awl.cf 20_dnsbl_tests.cf 25_dkim.cf 60_whitelist.cf 20_drugs.cf 25_domainkeys.cf 60_whitelist_dk.cf 20_fake_helo_tests.cf 25_hashcash.cf 60_whitelist_dkim.cf 20_head_tests.cf 25_pyzor.cf 60_whitelist_spf.cf 20_html_tests.cf 25_razor2.cf 60_whitelist_subject.cf 20_meta_tests.cf 25_replace.cf 65_debian.cf 20_net_tests.cf 25_spf.cf languages 20_phrases.cf 25_textcat.cf sa-update-pubkey.txt 20_porn.cf 25_uribl.cf triplets.txt 20_ratware.cf 30_text_de.cf user_prefs.template 20_uri_tests.cf 30_text_fr.cf 23_bayes.cf 30_text_it.cf root@julien:~#
- On vérifie ce qui a été installé:
root@julien:~# ls /usr/share/doc/spamassassin/examples/ courier gnus procmailrc.example sample-spam.txt filter.sh muttrc sample-nonspam.txt.gz root@julien:~# cd /usr/share/doc/spamassassin/examples/ root@julien:/usr/share/doc/spamassassin/examples# gunzip sample-nonspam.txt.gz
- On teste le bon fonctionnement de SpamAssassin sur du "non spam":
root@julien:/usr/share/doc/spamassassin/examples# spamassassin -t sample-nonspam.txt | head Return-Path: <tbtf-approval@world.std.com> X-Spam-Checker-Version: SpamAssassin 3.1.7-deb (2006-10-05) on julien.ploplo.fr X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=SPF_FAIL autolearn=no version=3.1.7-deb Delivered-To: foo@foo.com Received: from europe.std.com (europe.std.com [199.172.62.20]) by mail.netnoteinc.com (Postfix) with ESMTP id 392E1114061 for <foo@foo.com>; Fri, 20 Apr 2001 21:34:46 +0000 (Eire) root@julien:/usr/share/doc/spamassassin/examples#
- On teste le bon fonctionnement de SpamAssassin sur du "spam":
root@julien:/usr/share/doc/spamassassin/examples# spamassassin -t sample-spam.txt |head -n 30 Received: from localhost by julien.ploplo.fr with SpamAssassin (version 3.1.7-deb); Wed, 24 Sep 2008 11:35:18 +0200 From: Sender <sender@example.net> To: Recipient <recipient@example.net> Subject: Test spam mail (GTUBE) Date: Wed, 23 Jul 2003 23:30:00 +0200 Message-Id: <GTUBE1.1010101@example.net> X-Spam-Flag: YES X-Spam-Checker-Version: SpamAssassin 3.1.7-deb (2006-10-05) on julien.ploplo.fr X-Spam-Level: ************************************************** X-Spam-Status: Yes, score=1000.0 required=5.0 tests=GTUBE,NO_RECEIVED, NO_RELAYS autolearn=no version=3.1.7-deb MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----------=_48DA09D6.9C31D491" This is a multi-part message in MIME format. ------------=_48DA09D6.9C31D491 Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 8bit ------------------ Début de Rapport SpamAssassin --------------------- Ce message est probablement du SPAM (message non sollicité envoyé en masse, publicité, escroquerie...). Cette notice a été ajoutée par le système d'analyse "SpamAssassin" sur votre serveur de courrier "julien.ploplo.fr", pour vous ... (analyse + détaillée des raisons de categorisation en spam + loin) root@julien:/usr/share/doc/spamassassin/examples#
- On va installer Amavis pour permettre d'interfacer Postfix avec SpamAssassin...
Avant cela, étude des paramètres de SpamAssassin:
root@julien:/usr/share/doc/spamassassin/examples# cd /usr/share/spamassassin/ root@julien:/usr/share/spamassassin# ls 10_misc.cf 25_accessdb.cf 30_text_nl.cf 20_advance_fee.cf 25_antivirus.cf 30_text_pl.cf 20_anti_ratware.cf 25_body_tests_es.cf 30_text_pt_br.cf 20_body_tests.cf 25_body_tests_pl.cf 50_scores.cf 20_compensate.cf 25_dcc.cf 60_awl.cf 20_dnsbl_tests.cf 25_dkim.cf 60_whitelist.cf 20_drugs.cf 25_domainkeys.cf 60_whitelist_dk.cf 20_fake_helo_tests.cf 25_hashcash.cf 60_whitelist_dkim.cf 20_head_tests.cf 25_pyzor.cf 60_whitelist_spf.cf 20_html_tests.cf 25_razor2.cf 60_whitelist_subject.cf 20_meta_tests.cf 25_replace.cf 65_debian.cf 20_net_tests.cf 25_spf.cf languages 20_phrases.cf 25_textcat.cf sa-update-pubkey.txt 20_porn.cf 25_uribl.cf triplets.txt 20_ratware.cf 30_text_de.cf user_prefs.template 20_uri_tests.cf 30_text_fr.cf 23_bayes.cf 30_text_it.cf
NB : NE JAMAIS MODIFIER CES FICHIERS, ILS SONT MIS A JOUR AUTOMATIQUEMENT |
---|
Leur modification serait inutile, puisque les modifs seraient perdues après les mises à jour.
On utilise sa-update pour faire ces mises à jour.
root@julien:/usr/share/spamassassin# cd /etc/mail/spamassassin root@julien:/etc/mail/spamassassin# ls init.pre local.cf v310.pre v312.pre
NB : C'est ICI qu'on va placer nos propres configurations, qui ne seront pas supprimées par les mises à jour |
---|
root@julien:/etc/mail/spamassassin# vi local.cf root@julien:/etc/mail/spamassassin# more local.cf # This is the right place to customize your installation of SpamAssassin. # # See 'perldoc Mail::SpamAssassin::Conf' for details of what can be # tweaked. # # Only a small subset of options are listed below # ########################################################################### required_hists 5 => On fixe le seuil au dessus duquel on classe en spam report_safe 0 => laisse le message intact, excepté l'ajout des entêtes. Si à 1, le msg original sera transmis sous la forme d'une pièce jointe en plain text, si à 2 l'encodage de la pièce jointe doit changer rewrite_header Subject [SPAM] Réécriture du sujet quand le mail est classé SPAM
report_safe à 2 passe le message transmis en plain text au lieu de RFCxxx... Le choix est à faire en fonction des capacités des clients de messagerie du parc.
- On modifie le fichier d'exemple "non spam" et on rechecke le message: cela ne change rien au score:
root@julien:~ # cd /usr/share/doc/spamassassin/ root@julien:/usr/share/doc/spamassassin/# cd examples/ root@julien:/usr/share/doc/spamassassin/# cp sample-nonspam.txt test-spam.txt root@julien:/usr/share/doc/spamassassin/# vi test-spam.txt on rajoute INSA au sujet root@julien:/usr/share/doc/spamassassin/# spamassassin -t test-spam.txt => même note à 2.9
- Création d'une nouvelle règle:
root@julien:/usr/share/doc/spamassassin/# cd /etc/mail/spamassassin root@julien:/etc/mail/spamassassin# vi local.cf root@julien:/etc/mail/spamassassin# head -n 20 local.cf # This is the right place to customize your installation of SpamAssassin. # # See 'perldoc Mail::SpamAssassin::Conf' for details of what can be # tweaked. # # Only a small subset of options are listed below # ########################################################################### required_hists 5 report_safe 0 rewrite_header Subject [SPAM] #regles perso header TEST_N1 Subject =~ /INSA/i score TEST_N1 10 describe TEST_N1 Pas de gros mots SVP...
Chaque règle comporte un type (ici, header), un score associé, et éventuellement une description.
Pour header =~ indique qu'on va utiliser une expression régulière à la mode PERL (entourée de / ). Le i sert à ignorer la casse (INSA, insa, InSA...).
- Test de la règle:
root@julien:/etc/mail/spamassassin# spamassassin -t /usr/share/doc/spamassassin/examples/test-spam.txt Return-Path: <tbtf-approval@world.std.com> X-Spam-Flag: YES X-Spam-Checker-Version: SpamAssassin 3.1.7-deb (2006-10-05) on julien.ploplo.fr X-Spam-Level: ****** X-Spam-Status: Yes, score=6.3 required=5.0 tests=AWL,SPF_FAIL,TEST_N1 autolearn=no version=3.1.7-deb X-Spam-Report: * 10 TEST_N1 Pas de gros mots SVP...
OK, la note a monté. Elle n'a pas monté jusqu'à 10 car notre règle est utilisée en même temps que plusieurs règles par défaut (qui ont donc fait baisser la note à 6.3...).
- Consultation du manuel:
root@julien:/etc/mail/spamassassin# man Mail::SpamAssassin Reformatting Mail::SpamAssassin(3pm), please wait... root@julien:/etc/mail/spamassassin# man Mail::SpamAssassin::Conf Reformatting Mail::SpamAssassin::Conf(3pm), please wait...
- On passe à l'installation d'Amavisd-new:
root@julien:/etc/mail/spamassassin# apt-cache search amavis altermime - utility used to alter mime-encoded mailpacks amavis-ng - AMaViS "Next Generation" amavis-ng-milter-helper - AMaViS "Next Generation" helper program for Milter amavis-stats - Virus statistics RRDtool frontend for Amavis amavisd-new - Interface between MTA and virus scanner/content filters amavisd-new-milter - Interface between sendmail-milter and amavisd-new horde-sam - spam module for Horde Framework spampd - spamassassin based SMTP/LMTP proxy daemon f-prot-installer - F-Prot(tm) Antivirus installer package clamcour - courier filter for clamav to virus scan incoming mail root@julien:/etc/mail/spamassassin# apt-get install amavisd-new root@julien:/etc/mail/spamassassin# updatedb root@julien:/etc/mail/spamassassin# locate amavisd.conf /usr/share/doc/amavisd-new/examples/amavisd.conf-default.gz /usr/share/doc/amavisd-new/examples/amavisd.conf-sample.gz root@julien:/etc/mail/spamassassin# cp /usr/share/doc/amavisd-new/examples/amavisd.conf-default.gz /etc root@julien:/etc/mail/spamassassin# cd /etc root@julien:/etc# gunzip amavisd.conf-default.gz root@julien:/etc# mv amavisd.conf-default amavisd.conf root@julien:~# id amavis uid=107(amavis) gid=114(amavis) groups=114(amavis)
- Paramètres du fichier amavisd.conf:
$daemon_user = amavis; $daemon_group = amavis; $max_servers = 2; => Le nombre de server en attente, comme pour apache, sert à décrire le nombre de process simultanés. A augmenter si bcp de mails traités, mais attention à la charge globale de la machine. $MYHOME = '/var/lib/amavis'; $TEMPBASE = "$MYHOME/tmp"; $log_level = 0; => granularité encore + fine que les niveaux de log habituels
root@julien:~# touch /var/log/amavis.log;chown amavis: /var/log/amavis.log root@julien:~# ls -la /var/log/amavis.log -rw-r--r-- 1 amavis amavis 0 2008-09-24 14:24 /var/log/amavis.log root@julien:~#
$QUARANTINEDIR = "/var/lib/amavis/virusmails"; $inet_socket_port pour s'accrocher à un port TCP, 10024 par défaut
root@julien:~# netstat -tpln|grep amavis tcp 0 0 127.0.0.1:10024 0.0.0.0:* LISTEN 16654/amavisd (mast root@julien:~#
$myhostname = julien.ploplo.fr $forward_method = 'smtp:[127.0.0.1]:10025'; => port de retour des mails vers Postfix (Nécessitera une reconfiguration de Postfix)
- Quelques problèmes de différences d'arborescence de configuration entre RedHat et Ubuntu... Pour l'instant on laisse /etc/amavis/conf.d en l'état car sinon bloque le démarrage de Amavisd-new
- Pour l'instant on ne configure que ca, et on reviendra sur d'autres paramètres plus tard.
- A l'heure actuelle, on a juste installé et débuté la configuration d'Amavisd-new.
Le MTA qui reçoit son mail faut ses vérifications habituelles (authentification, vérification du mail from, du rcpt to, etc) et au lieu de délivrer si tout OK passe à Amavis, qui examine et lui répond DELIVER, BOUNCE, REJECT...
- Aucun lien définit avec Postfix, donc on configure Postfix:
root@julien:/etc# postconf content_filter content_filter = root@julien:/etc# postconf -e content_filter=mon_transport_pour_filtrage:[127.0.0.1]:10024 root@julien:/etc#
On a donné à Postfix 1 IP et 1 port pour qu'il sache communiquer avec Amavisd-new.
- Vérifier la syntaxe de la configuration de Postfix:
root@julien:/etc# postfix check root@julien:/etc#
- Vérification de la bonne prise en compte du paramétrage:
root@julien:/etc# netstat -tpln Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:10024 0.0.0.0:* LISTEN 16847/amavisd (mast tcp 0 0 127.0.0.1:10025 0.0.0.0:* LISTEN 14726/master tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 3648/mysqld tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 12596/cyrmaster tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 12596/cyrmaster
- A cette étape, on s'envoie en telnet un message de root à root. On se loggue ensuite en jules (cf aliases) et on vérifie l'arrivée du mail: OK. On ouvre le fichier mbox de jules (vi /var/mail/jules) et on recherche amavis: OK, on voit bien que le mail est arrivé dans le Postfix.
root@julien:/etc# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-AUTH=CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN mail from: root 250 2.1.0 Ok rcpt to: root 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> Subject: test 1 amavis Est-ce que je passe dans amavis? A+ . 250 2.0.0 Ok: queued as E329CBABE quit 221 2.0.0 Bye Connection closed by foreign host. root@julien:/etc# su jules jules@julien:/etc$ mail N 6 root@ploplo.fr mar sep 23 16:32 12/379 root@ploplo.fr N 7 stage01@ploplo.fr mar sep 23 16:39 12/385 stage01@ploplo.fr N 42 rot@ploplo.fr mer sep 24 09:49 12/380 rot@ploplo.fr N 43 Julien.Pedrono@ins mer sep 24 09:50 12/411 Julien.Pedrono@ploplo.fr N 46 jpedrono@ploplo.fr mer sep 24 10:41 12/389 jpedrono@ploplo.fr N 47 Julien.Pedrono@ins mer sep 24 10:41 12/411 Julien.Pedrono@ploplo.fr N 57 root@ploplo.fr mer sep 24 15:25 22/808 test 1 amavis & 57 Subject: test 1 amavis Date: Wed, 24 Sep 2008 15:25:01 +0200 (CEST) From: root@ploplo.fr To: undisclosed-recipients:; Est-ce que je passe dans amavis? A+ & quit 12 messages retenus dans /var/mail/jules jules@julien:/etc$ vi /var/mail/jules ... From root@ploplo.fr Wed Sep 24 15:25:21 2008 Return-Path: <root@ploplo.fr> X-Original-To: root@ploplo.fr Delivered-To: root@ploplo.fr Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp (Postfix) with ESMTP id F3EA6BAC4 for <root@ploplo.fr>; Wed, 24 Sep 2008 15:25:20 +0200 (CEST) Received: from smtp ([127.0.0.1]) by localhost (julien.ploplo.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id yk3g66M4XprS for <root@ploplo.fr>; Wed, 24 Sep 2008 15:25:20 +0200 (CEST) Received: from julien (localhost.localdomain [127.0.0.1]) => le message est bien passé par amavis by smtp (Postfix) with ESMTP id E329CBABE for <root>; Wed, 24 Sep 2008 15:25:01 +0200 (CEST) Subject: test 1 amavis Message-Id: <20080924132504.E329CBABE@smtp> Date: Wed, 24 Sep 2008 15:25:01 +0200 (CEST) From: root@ploplo.fr To: undisclosed-recipients:; Status: OR X-UID: 129 Est-ce que je passe dans amavis? A+
- A ce stade on voit donc que le message est bien passé par Amavisd-new, par contre au vu des headers il semblerait que SpamAssassin n'ait fait aucun travail sur ce mail.
On doit réexaminer la configuration d'Amavisd-new pour utiliser SpamAssassin.
Quand on voit les logs d'Amavisd-new (modification du logage pour utiliser le syslog, le fichier désigné par moi ne fonctionne pas, il manque une configuration syslog peut être):
==> /var/log/mail.log <== Sep 24 15:48:32 julien amavis[17159]: starting. /usr/sbin/amavisd-new at julien.ploplo.fr amavisd-new-2.4.2 (20060627), Unicode aware, LANG=fr_FR.UTF-8 Sep 24 15:48:32 julien amavis[17159]: Perl version 5.008008 Sep 24 15:48:32 julien amavis[17166]: Module Amavis::Conf 2.068 Sep 24 15:48:32 julien amavis[17166]: Module Archive::Tar 1.30 Sep 24 15:48:32 julien amavis[17166]: Module Archive::Zip 1.16 Sep 24 15:48:32 julien amavis[17166]: Module BerkeleyDB 0.31 Sep 24 15:48:32 julien amavis[17166]: Module Compress::Zlib 1.42 Sep 24 15:48:32 julien amavis[17166]: Module Convert::TNEF 0.17 Sep 24 15:48:32 julien amavis[17166]: Module Convert::UUlib 1.06 Sep 24 15:48:32 julien amavis[17166]: Module Digest::MD5 2.36 Sep 24 15:48:32 julien amavis[17166]: Module MIME::Entity 5.420 Sep 24 15:48:32 julien amavis[17166]: Module MIME::Parser 5.420 Sep 24 15:48:32 julien amavis[17166]: Module MIME::Tools 5.420 Sep 24 15:48:32 julien amavis[17166]: Module Mail::Header 1.74 Sep 24 15:48:32 julien amavis[17166]: Module Mail::Internet 1.74 Sep 24 15:48:32 julien amavis[17166]: Module Net::Cmd 2.26 Sep 24 15:48:32 julien amavis[17166]: Module Net::SMTP 2.29 Sep 24 15:48:32 julien amavis[17166]: Module Net::Server 0.94 Sep 24 15:48:32 julien amavis[17166]: Module Time::HiRes 1.86 Sep 24 15:48:32 julien amavis[17166]: Module Unix::Syslog 0.100 Sep 24 15:48:32 julien amavis[17166]: Amavis::DB code loaded Sep 24 15:48:32 julien amavis[17166]: Amavis::Cache code loaded Sep 24 15:48:32 julien amavis[17166]: SQL base code NOT loaded Sep 24 15:48:32 julien amavis[17166]: SQL::Log code NOT loaded Sep 24 15:48:32 julien amavis[17166]: SQL::Quarantine NOT loaded Sep 24 15:48:32 julien amavis[17166]: Lookup::SQL code NOT loaded Sep 24 15:48:32 julien amavis[17166]: Lookup::LDAP code NOT loaded Sep 24 15:48:32 julien amavis[17166]: AM.PDP-in proto code loaded Sep 24 15:48:32 julien amavis[17166]: SMTP-in proto code loaded Sep 24 15:48:32 julien amavis[17166]: Courier proto code NOT loaded Sep 24 15:48:32 julien amavis[17166]: SMTP-out proto code loaded Sep 24 15:48:32 julien amavis[17166]: Pipe-out proto code NOT loaded Sep 24 15:48:32 julien amavis[17166]: BSMTP-out proto code NOT loaded Sep 24 15:48:32 julien amavis[17166]: Local-out proto code loaded Sep 24 15:48:32 julien amavis[17166]: OS_Fingerprint code NOT loaded Sep 24 15:48:32 julien amavis[17166]: ANTI-VIRUS code NOT loaded Sep 24 15:48:32 julien amavis[17166]: ANTI-SPAM code NOT loaded Sep 24 15:48:32 julien amavis[17166]: ANTI-SPAM-SA code NOT loaded Sep 24 15:48:32 julien amavis[17166]: Unpackers code loaded Sep 24 15:48:32 julien amavis[17166]: Found $file at /usr/bin/file Sep 24 15:48:32 julien amavis[17166]: No $dspam, not using it Sep 24 15:48:32 julien amavis[17166]: Internal decoder for .mail
- Modification de paramètres dans /etc/amavisd.conf:
$final_spam_destiny = D_PASS; => on laisse passer les spams en les marquant $sa_tag_level_deflt = undef; => pour rajouter TOUS les tags dans les headers $sa_tag2_level_deflt = 5.0; => définit le seuil de catégorisation spam $sa_spam_subject_tag = '[SPAM]'; => ce qu'on rajoute au sujet des mails classés en spam @local_domains_maps = (['.$mydomain']); @bypass_virus_checks_maps = (1); => on désactive la vérification des virus puisqu'on n'a pas encore installé d'AV @bypass_spam_checks_maps = (0); => doit activer le filtrage antispam. !!!! ATTENTION: ancienne syntaxe
- Après redémarrage de Amavisd-new, même problème, mêmes observations dans les logs.
Examen de la nouvelle arborescence de configuration d'Amavisd-new (/etc/amavis/conf.d): on trouve un ficier 15-content_filter_mode. Ce fichier contient les configurations nécessaires décrites dans /etc/amavisd.conf dans:
jules@julien:/etc$ grep bypass_spam /etc/amavisd.conf @bypass_spam_checks_maps = (\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re); # @bypass_spam_checks_maps = (0); ## @bypass_virus_checks_maps @bypass_spam_checks_maps jules@julien:/etc$
- On teste alors en s'envoyant un mail avec un sujet normal, et un avec INSA dans le sujet.
En se logguant en tant que jules, on voit bien le mail au sujet normal arriver normallement et le mail contenant INSA dans le sujet est "reporté" par le content_filter subsystem...
root@julien:/etc# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-AUTH=CRAM-MD5 PLAIN LOGIN NTLM DIGEST-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN mail from: root 250 2.1.0 Ok rcpt to: root 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> Subject: test amavis 3 => on met un sujet ne passant pas par la règle définie dans local.cf de spamassassin. ayé l'antispam doit fonctionner . 250 2.0.0 Ok: queued as E00F1BABE mail from: root 250 2.1.0 Ok rcpt to: root 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> Subject: INSA => on met un sujet passant par la règle: message considéré comme du spam. et là ca passe? ca modifie le sujet? . 250 2.0.0 Ok: queued as CBF01BAC4 quit 221 2.0.0 Bye Connection closed by foreign host. root@julien:/etc# su jules jules@julien:/etc$ mail R 1 toto@ploplo.fr mar sep 23 11:31 16/489 et root recoit toujours dans l'arborescence locale? R 2 Mail Delivery Syst mar sep 23 13:11 75/2381 Undelivered Mail Returned to Sender U 3 stage01@ploplo.fr mar sep 23 16:13 15/467 U 4 tutu@ploplo.fr mar sep 23 16:16 15/418 U 5 Cron Daemon mar sep 23 16:30 19/649 Cron <jules@julien> /usr/sbin/ntpdate ntp.obspm.fr U 6 root@ploplo.fr mar sep 23 16:32 14/399 root@ploplo.fr U 7 stage01@ploplo.fr mar sep 23 16:39 14/405 stage01@ploplo.fr U 8 rot@ploplo.fr mer sep 24 09:49 14/401 rot@ploplo.fr U 9 Julien.Pedrono@ins mer sep 24 09:50 14/432 Julien.Pedrono@ploplo.fr U 10 jpedrono@ploplo.fr mer sep 24 10:41 14/410 jpedrono@ploplo.fr U 11 Julien.Pedrono@ins mer sep 24 10:41 14/432 Julien.Pedrono@ploplo.fr R 12 root@ploplo.fr mer sep 24 15:25 24/830 test 1 amavis U 15 root@ploplo.fr mer sep 24 16:13 22/829 test d'amavis 2 U 16 root@ploplo.fr mer sep 24 16:16 23/799 INSA N 18 root@ploplo.fr mer sep 24 16:41 25/991 test amavis 3 >N 19 Content-filter at mer sep 24 16:41 83/2942 Considered UNSOLICITED BULK EMAIL, apparently from you & 19 Subject: Considered UNSOLICITED BULK EMAIL, apparently from you From: "Content-filter at julien.ploplo.fr" <postmaster@julien.ploplo.fr> To: <root@ploplo.fr> Date: Wed, 24 Sep 2008 16:41:37 +0200 (CEST) This is a multi-part message in MIME format... ------------=_1222267298-17426-0 Content-Type: text/plain; charset="iso-8859-1" Content-Disposition: inline Content-Transfer-Encoding: 7bit A message from <root@ploplo.fr> to: -> root@ploplo.fr was considered unsolicited bulk e-mail (UBE). Our internal reference code for your message is 17426-01/HYCOpfHuf+Ls The message carried your return address, so it was either a genuine mail from you, or a sender address was faked and your e-mail address abused by third party, in which case we apologize for undesired notification. We do try to minimize backscatter for more prominent cases of UBE and for infected mail, but for less obvious cases of UBE some balance between losing genuine mail and sending undesired backscatter is sought, and there can be some collateral damage on both sides. According to a 'Received:' trace, the message originated at: [127.0.0.1], julien (localhost.localdomain [127.0.0.1]) Return-Path: <root@ploplo.fr> Message-ID: <20080924144112.CBF01BAC4@smtp> Subject: INSA Delivery of the email was stopped! ------------=_1222267298-17426-0 Content-Type: message/delivery-status; name="dsn_status" Content-Disposition: inline; filename="dsn_status" Content-Transfer-Encoding: 7bit Content-Description: Delivery error report Reporting-MTA: dns; julien.ploplo.fr Received-From-MTA: smtp; smtp ([127.0.0.1]) Arrival-Date: Wed, 24 Sep 2008 16:41:26 +0200 (CEST) Original-Recipient: rfc822;root Final-Recipient: rfc822;root@ploplo.fr Action: failed Status: 5.7.1 Diagnostic-Code: smtp; 554 5.7.1 Rejected, id=17426-01 - SPAM Last-Attempt-Date: Wed, 24 Sep 2008 16:41:37 +0200 (CEST) ------------=_1222267298-17426-0 Content-Type: text/rfc822-headers; name="header" Content-Disposition: inline; filename="header" Content-Transfer-Encoding: 7bit Content-Description: Message headers Return-Path: <root@ploplo.fr> Received: from julien (localhost.localdomain [127.0.0.1])
Dans les messages correctement transmis, si on vérifie le fichier mbox pour jules, on trouve bien:
From root@ploplo.fr Wed Sep 24 16:41:16 2008 Return-Path: <root@ploplo.fr> X-Original-To: root@ploplo.fr Delivered-To: root@ploplo.fr Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp (Postfix) with ESMTP id 7C957BAC5 for <root@ploplo.fr>; Wed, 24 Sep 2008 16:41:15 +0200 (CEST) X-Spam-Score: 2.596 X-Spam-Level: ** X-Spam-Status: No, score=2.596 tagged_above=2 required=6.31 tests=[ALL_TRUSTED=-1.44, NO_DNS_FOR_FROM=2.603, NO_REAL_NAME=0.55, UNDISC_RECIPS=0.883] Received: from smtp ([127.0.0.1]) by localhost (julien.ploplo.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id pulmMdFRE9cs for <root@ploplo.fr>; Wed, 24 Sep 2008 16:41:07 +0200 (CEST) Received: from julien (localhost.localdomain [127.0.0.1]) by smtp (Postfix) with ESMTP id E00F1BABE for <root>; Wed, 24 Sep 2008 16:40:48 +0200 (CEST)
- Reste à résoudre le problème de configuration d'Amavisd-new, pour dire à SpamAssassin de ne pas bloquer les spams, mais simplement de modifier le sujet du mail et de le passer au destinataire.