Postfix

De Wiki NCad
Révision de 30 janvier 2014 à 15:58 par Cacheln (discuter | contributions) (Envoi sans authentification)

Aller à : navigation, rechercher

Présentation

Postfix est un serveur mail SMTP (Simple Mail Transfer Protocol) appelé aussi MTA pour Mail Transport Agent. Son rôle est d'assurer le traitement des mails aussi bien à l'envoi qu'à la réception.

Pour que les utilisateurs puissent récupérer leur message, Postfix devra être couplé à un service de relève de message basé sur le protocole POP (Post Office Protocol) et/ou IMAP (Internet Message Access Protocol). Nous utiliseront le service courier. L'authentification des utilisateurs sur le serveur mail s'effectuera par l'intermédiaire du daemon saslauth.

Installation

Il sera nécessaire d'installer les services suivants :

  • Postfix, qui est le MTA;
  • Courier-Pop, qui est le serveur POP pour la récupération des messages par l'utilisateur via un client de messagerie;
  • Courier-Imap, qui est le serveur IMAP pour la récupération des messages par l'utilisateur via un client de messagerie ou un webmail;
ICON Terminal.png

apt-get install postfix courier-pop courier-imap sasl2-bin procmail

Configuration de base

Configuration de base pour un usage local uniquement.

Fichier /etc/postfix/main.cf

  • Le fichier de configuration main.cf contient les éléments de configuration sur le MTA Postfix.
smtpd_banner = $myhostname ESMTP $mail_name
biff = no

append_dot_mydomain = no 

readme_directory = no

myhostname = alice.lan
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/124 [::1]/128
home_mailbox = Maildir/
mailbox_command = procmail -a "$EXTENSION"
recipient_delimiter = +
inet_interfaces = all
message_size_limit = 5120000
mailbox_size_limit = 10240000
ICON boxWarning.png

Par défaut, la variable home_mailbox a pour valeur /var/mail. Les messages sont enregistrés dans un fichier texte portant le nom de l'utilisateur UNIX. Ce mode de fonctionnement n'est pas compatible avec les daemons courier-pop et courier-imap

Fichier /etc/procmailrc

  • Le daemon procmail interrogera ce fichier pour chaque mail entrant. On y définira la localisation des boîtes mails.
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/

Création du répertoire mail

Dans notre cas nous disposons de l'utilisateur UNIX alice sur notre serveur avec pour répertoire personnel /home/alice.

  • Création des répertoires pour le courrier électronique de alice :
ICON Terminal.png

cd /home/alice
maildirmake Maildir
maildirmake -f Sent Maildir
maildirmake -f Queue Maildir
maildirmake -f junkmail Maildir
maildirmake -f virus Maildir
maildirmake -f Drafts Maildir
maildirmake -f Trash Maildir
chown alice:alice Maildir -R
chmod 700 Maildir -R

  • Pour que cette opération s'effectue automatiquement à chaque ajout d'un nouvel utilisateur UNIX :
ICON Terminal.png

sudo maildirmake /etc/skel/Maildir
sudo maildirmake /etc/skel/Maildir/.Drafts
sudo maildirmake /etc/skel/Maildir/.Sent
sudo maildirmake /etc/skel/Maildir/.Trash
sudo maildirmake /etc/skel/Maildir/.Templates



ICON Light.png
Nos comptes mails sont basés sur les utilisateurs UNIX du serveur.

Application des paramètres

  • Pour que les modifications soient prises en compte, il faut redémarrer Postfix :
ICON Terminal.png

sudo service postfix restart

Test de validation du serveur

Test du serveur SMTP

  • Nous pouvons vérifier le bon fonctionnement du serveur SMTP en s'y connectant depuis la commande telnet :
ICON Terminal.png

telnet 127.0.0.1 25

  • Le serveur répondra par un code 220 contenant la bannière qui a été définit au paramètre smtpd_banner dans le fichier main.cf.
ICON Terminal.png

telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 alice.lan ESMTP Postfix

  • Pour valider son fonctionnement, nous allons envoyer un mail. Commençons d'abord par indiquer notre adresse mail émetteur :
ICON Terminal.png

mail from:<root@alice.lan>
250 2.1.0 OK

  • Le serveur acquittant avec le code 250, nous pouvons maintenant indiquer l'adresse de l'expéditeur :
ICON Terminal.png

rcpt to:<alice@alice.lan>
250 2.1.5 OK

  • Le serveur doit acquitter également avec le code 250. Maintenant nous allons rédiger le contenu du mail. Pour cela, il faut saisir la commande data :
ICON Terminal.png

data

  • Le serveur répondra par :
ICON Terminal.png

354 End data with <CR><LF>.<CR><LF>

  • Dès lors, nous pouvons maintenant rédiger notre mail. La touche Entrée est interprété comme un retour à la ligne dans le mail.
ICON Terminal.png

test d'envoi / réception
Merci ;)

  • Le mail rédigé, on revient à la ligne avec la touche Entrée, puis on saisie un point (.) et on appui de nouveau sur la touche Entrée :
ICON Terminal.png

.

  • Le serveur valide la mise en attente de distribution du mail et retourne son numéro d'identifiant quand le file d'attente :
ICON Terminal.png

250 2.0.0 Ok: queued as C01187F9FA

  • On ferme la connexion avec la commande quit :
ICON Terminal.png

quit
221 2.0.0 Bye
Connection closed by foreign host.

Test du serveur POP3

  • On va vérifier la bonne réception du mail envoyé à l'étape précédente. Pour cela on se connecte au serveur sur le port 110 :
ICON Terminal.png

telnet 10.0.0.44 110
Trying 10.0.0.44... Connected to 10.0.0.44. Escape character is '^]'. +OK Hello there.

  • On indique lenom d'utilisateur UNIX du compte avec la commande user :
ICON Terminal.png

user alice
+OK Password required

  • Le serveur demande le mot de passe du compte, on lui renseigne via la commande pass :
ICON Terminal.png

pass alice
+OK logged in.

  • Le serveur accepte la connexion. On consulte la liste des messages avec la commande list :
ICON Terminal.png

list
+OK POP3
1 280
.

  • On affiche les 20 premières lignes du message 1 avec la commande top :
ICON Terminal.png

top 1 20
+OK headers follow.
Return-Path: <root@localhost>
X-Original-To: alice@localhost
Delivered-To: alice@localhost
Received: from pfalk.net.ncad.fr (pfalk.net.ncad.fr [10.0.0.48])
__by alice.lan (Postfix) with SMTP id A3242628A2
__for <alice@localhost>; Thu, 30 Jan 2014 01:20:57 +0100 (CET)

test
.

Test du serveur IMAP

  • On se connecte au serveur sur le port imap 143 :
ICON Terminal.png

telnet 10.0.0.44 143
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.

  • OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL
    ACL2=UNION] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc. See COPYING for distribution information.
  • Le serveur attend un login est un mot de passe. Pour cela, on utilise la commande LOGIN <user> <password> :
ICON Terminal.png

01 LOGIN alice alice
1 OK LOGIN Ok.

  • On demande la liste des répertoires grâce à la commande LIST "" "*" :
ICON Terminal.png

2 LIST "" "*"
¤ LIST (\HasNoChildren) "." "INBOX.Queue"
¤ LIST (\HasNoChildren) "." "INBOX.Drafts"
¤ LIST (\HasNoChildren) "." "INBOX.Trash"
¤ LIST (\HasNoChildren) "." "INBOX.junkmail"
¤ LIST (\HasNoChildren) "." "INBOX.Sent"
¤ LIST (\Marked \HasChildren) "." "INBOX"
¤ LIST (\HasNoChildren) "." "INBOX.virus"
2 OK LIST completed

  • On accès au dossier des message reçus dans le dossier INBOX avec la commande SELECT <nom_dossier> :
ICON Terminal.png

3 SELECT INBOX
¤ FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)
¤ OK [PERMANENTFLAGS (\* \Draft \Answered \Flagged \Deleted \Seen)] Limited
¤ 4 EXISTS
¤ 4 RECENT
¤ OK [UIDVALIDITY 1391044096] Ok
¤ OK [MYRIGHTS "acdilrsw"] ACL
3 OK [READ-WRITE] Ok

  • On liste les message reçus dans le dossier INBOX avec la commande SELECT <nom_dossier> :
ICON Terminal.png

4 UID FETCH 1:* RFC822.SIZE
¤ 1 FETCH (UID 1 RFC822.SIZE 280)
4 OK FETCH completed.

  • On consulte le message avec l'UID 1 en saisisant la commande UID FETCH <UID_message> BODY[] :
ICON Terminal.png

5 UID FETCH 4 BODY[]
¤ 4 FETCH (UID 4 BODY[] {310}
Return-Path: <root@alice.lan>
X-Original-To: alice@alice.lan
Delivered-To: alice@alice.lan
Received: from pfalk.net.ncad.fr (pfalk.net.ncad.fr [10.0.0.48])
___by alice.lan (Postfix) with SMTP id 511AB628A2
___for <alice@alice.lan>; Thu, 30 Jan 2014 01:56:23 +0100 (CET)

test d'envoi / réception
Merci ;)
)
¤ 4 FETCH (FLAGS (\Seen \Recent))
5 OK FETCH completed.

  • On ferme la connexion avec la commande LOGOUT :
ICON Terminal.png

6 logout
¤ BYE Courier-IMAP server shutting down
6 OK LOGOUT completed
Connection closed by foreign host.

Autres méthodes

On peut également vérifier que le mail est bien été acheminé.

  • Via les logs stockés dans /var/log/mail.log :
Jan 30 02:29:40 alice postfix/local[13772]: C01187F9FA: to=<alice@alice.lan>, relay=local, delay=50, delays=49/0.17/0/0.14, dsn=2.0.0, status=sent (delivered to command: procmail -a "$EXTENSION")
Jan 30 02:29:40 alice postfix/qmgr[13254]: C01187F9FA: removed
  • En interrogeant la file d'attente :
ICON Terminal.png

/usr/bin/mailq

Authentification SMTP Postfix

Contrairement aux serveurs pop (courier-pop) et imap (courier-imap), la connexion au serveur SMTP s'effectue sans demande de mot de passe. Pour remédier à cette faille de sécurité propre à la configuration par défaut de Postfix, nous installeront le paquet sasl2-bin qui permettra l'authentification des utilisateurs avec le module pam (Pluggable Authentication Modules, utilisé par Linux).

ICON Terminal.png

sudo apt-get install sasl2-bin

Activation du module

  • Editer le fichier de configuration /etc/default/saslauthd, puis remplacer :
START=no
  • par :
START=yes

Par défaut, le mécanisme d'authentification utilisé est pam (paramètre MECHANISMS) ce qui nous conviens pour le moment (authentification via les comptes UNIX existants).

  • Remplacer aussi la ligne :
OPTIONS="-c -m /var/run/saslauthd"
  • Par :
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
  • On crée le répertoire /var/spool/postfix/var/run/saslauthd avec les permissions adéquates :
ICON Terminal.png

mkdir -p /var/spool/postfix/var/run/saslauthd
chown -R root:sasl /var/spool/postfix/var/run/saslauthd
chmod 710 /var/spool/postfix/var/run/saslauthd

  • On ajoute l'utilisateur Postfix au groupe sasl :
ICON Terminal.png

adduser postfix sasl

  • On crée le fichier /etc/pam.d/smtp et on y insère les éléments suivants :
@include common-auth
@include common-account
@include common-password
@include common-session
  • On démarre le daemon saslauthd :
ICON Terminal.png

service saslauthd start

Intégration dans Postfix

  • Ajouter la ligne suivante dans le fichier /etc/postfix/main.cf :
broken_sasl_auth_clients = yes

smtpd_recipient_restrictions =
 permit_sasl_authenticated,
 reject_unauth_destination

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = cyrus
cyrus_sasl_config_path = /etc/postfix/sasl
  • Créer le fichier /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
  • On redémarre Postfix pour appliquer les nouveaux paramètres :
ICON Terminal.png

service postfix restart

Vérification

La commande ehlo

La commande ehlo permet de s'annoncer au serveur. Certains serveur SMTP la requiert avant toute autre action. Dans notre cas elle nous permet de voir les méthodes d'authentification acceptés par le serveur SMTP.

  • Résultat de la commande ehlo sans le module sasl d'activé :
ICON Terminal.png

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
ehlo alice.lan
250-alice.lan
250-PIPELINING
250-SIZE 5120000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

  • Résultat de la commande ehlo avec le module sasl d'activé :
ICON Terminal.png

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
ehlo ncad.fr
250-alice.lan
250-PIPELINING
250-SIZE 5120000
250-VRFY
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5 NTLM PLAIN LOGIN
250-AUTH=DIGEST-MD5 CRAM-MD5 NTLM PLAIN LOGIN

250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

Envoi sans authentification

  • Tentative d'envoi sans authentification :
ICON Terminal.png

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
mail from:<root@alice.lan>
250 2.1.0 Ok
rcpt to:<nicolas@cachelou.fr>
554 5.7.1 <nicolas@cachelou.fr>: Relay access denied
221 2.7.0 Error: I can break rules, too. Goodbye.
Connection closed by foreign host.

  • Trace laissée dans /var/mail/mail.log :
Jan 30 13:17:32 alice postfix/smtpd[20759]: NOQUEUE: reject: RCPT from pfalk.net.ncad.fr[10.0.0.48]: 554 5.7.1 <nicolas@cachelou.fr>: Relay access denied; from=<root@alice.lan> to=<nicolas@cachelou.fr> proto=SMTP

Le serveur refuse le destinataire avec pour motif : Relay access denied.

ICON Light.png
Le serveur autorise de transmettre les mails sans authentification pour tous les domaines renseignés dans le paramètre mydestination du fichier /etc/postfix/main.cf.

Envoi avec authentification

  • Tentative d'envoi avec authentification :
ICON Terminal.png

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
auth login YWxpY2U=
334 UGFzc3dvcmQ6
YWxpY2U=
235 2.7.0 Authentication successful
mail from:<root@alice.lan>
250 2.1.0 Ok
rcpt to:<alice@alice.lan>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
test
.
250 2.0.0 Ok: queued as 8EDAD62881


ICON Information.png

Le nom d'utilisateur et le mot de passe sont encodés en Base64. Plus d'informations ici

  • Trace laissée dans /var/mail/mail.log :
Jan 30 14:48:59 alice postfix/smtpd[24312]: CD53F62881: client=pfalk.net.ncad.fr[10.0.0.48], sasl_method=login, sasl_username=alice@alice.lan
Jan 30 14:49:05 alice postfix/cleanup[24315]: CD53F62881: message-id=<>
Jan 30 14:49:05 alice postfix/qmgr[24195]: CD53F62881: from=<root@alice.lan>, size=190, nrcpt=1 (queue active)
Jan 30 14:49:07 alice postfix/smtp[24316]: CD53F62881: to=<nicolas@cachelou.fr>, relay=aspmx.l.google.com[173.194.78.27]:25, delay=16, delays=14/0.13/1.2/0.56, dsn=5.7.1, status=bounced (host aspmx.l.google.com[173.194.78.27] said: 550-5.7.1 [109.190.9.125      11] Our system has detected that this message is 550-5.7.1 not RFC 2822 compliant. To reduce the amount of spam sent to Gmail, 550-5.7.1 this message has been blocked. Please review 550 5.7.1 RFC 2822 specifications for more information. dq1si3286812wib.75 - gsmtp (in reply to end of DATA command))
Jan 30 14:49:07 alice postfix/cleanup[24315]: 31F5F63799: message-id=<20140130134907.31F5F63799@alice.lan>
Jan 30 14:49:07 alice postfix/qmgr[24195]: 31F5F63799: from=<>, size=2576, nrcpt=1 (queue active)
Jan 30 14:49:07 alice postfix/bounce[24317]: CD53F62881: sender non-delivery notification: 31F5F63799
Jan 30 14:49:07 alice postfix/qmgr[24195]: CD53F62881: removed
Jan 30 14:49:07 alice postfix/local[24318]: 31F5F63799: to=<root@alice.lan>, relay=local, delay=0.3, delays=0.05/0.12/0/0.13, dsn=2.0.0, status=sent (delivered to command: procmail -a "$EXTENSION")
Jan 30 14:49:07 alice postfix/qmgr[24195]: 31F5F63799: removed

D'après les logs l'authentification bien réussi. Cependant, l'envoi du mail vers nicolas@cachelou.fr a échoué car le fournisseur du service de messagerie GMail a refusé le message. En effet, l'adresse root@alice.lan n'est pas valide car le domaine alice.lan n'existe pas.

Liens