POSTFIX - Formation Postfix
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
Introduction
- Postfix créé sur une rumeur de faille de sécu de sendmail, par Paul Vixie.
- 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.
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
cf Schéma 1
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
- 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 |
---|
cf schéma 2
- 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 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
cf schéma 3.
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 conf 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... cf liens perso sur delicious
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'arbo réellement + mount -o bind <arbo de base> <arbo chrootée> OK, mais solution + simple:
- on a /var/spool/postfix/private/ avec un socket lmtp dedans => on modifie les conf de postfix et cyrus pour utiliser ce socket au lieu de celui de l'arbo 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 conf 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.insa-rennes.fr ldap_search_base: dc=insa-rennes,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 pr01stg 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'user 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 conf 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. Cf schéma 4. Si on souhaite modifier le comportement par défaut des règles et restiction, 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 conf 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 auth et le telnet distant avec auth:
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.