Installation d'un serveur mail complet sous debian : Postfix (3/5)

Posted on sam. 03 janvier 2015 in tuto

Cet article est le quatrième d'une série sur l'installation d'un serveur mail sur debian wheezy. Accéder aux autres articles :


Maintenant qu'on a des adresses mail, il pourrait être pratique qu'elles puisse échanger des messages. C'est ce que permet postfix : faire passer des mails d'un serveur à l'autre. Il faut donc relier postfix à la base de données

Domaines :

Pour que postfix ait accès aux domaines, il faut écrire le code suivant dans /etc/postfix/mysql-virtual-mailbox-domains.cf :

    user = mailuser
    password = azerty
    hosts = 127.0.0.1
    dbname = postfixadmin
    query = SELECT 1 FROM domain WHERE domain='%s'

(Pensez à mettre votre mot de passe pour l'utilisateur mailuser)

Ce fichier va permettre à postfix, quand il reçoit un mail destiné à user@example.org, de déterminer si notre serveur est bien en charge du domaine example.org. Si c'est le cas, ça veut dire que le domaine se trouve dans notre base de données. Il faut qu'en executant la requête "query", un élément quelconque soit retourné, et rien si le domaine n'est pas présent.

Attention ! Ici, il n'est pas identique de marquer "localhost" et "127.0.0.1" dans le champ hosts. En effet, si vous mettez "localhost", postfix va chercher la socket UNIX de mysql, qui ne sera pas présente. Alors qu'en mettant l'IP, postfix va effectuer une connexion tcp sur le port de mysql.

Pour l'activez, lancez la commande :

# postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Cela ajoute la configuration au fichier /etc/postfix/main.cf et recharge automatiquement la configuration de postfix, évitant d'avoir à le faire à la main.

Pour tester si la recherche de domaine fonctionne bien, vous pouvez lancer la commande suivante :

# postmap -q example.org mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Si le domaine example.org est présent dans vos domaines, la valeur "1" sera affichée, sinon rien.

Boites mails

Ensuite, il faut vérifier si la boite mail existe, exactement comme avec les domaines. Cette fois ci on écrit dans le fichier /etc/postfix/mysql-virtual-mailbox-maps.cf :

user = mailuser
password = azerty
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT 1 FROM mailbox WHERE username='%s'

Pour activer :

# postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Et pour tester :

# postmap -q john@example.org mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Comme pour le domaine, le résultat est 1 si la boite existe, rien sinon.

Gestion des alias

Il faut maintenant rediriger les alias vers les utilisateurs existant. Dans le fichier /etc/postfix/mysql-virtual-alias-maps.cf :

user = mailuser
password = azerty
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s'

Pour activer :

# postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Pour tester :

# postmap -q abuse@example.org mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Ici le résultat n'est plus le même : c'est l'utilisateur destination qui doit s'afficher, ce qui permet à postfix de faire la correspondance.

Dernière étape très importante : modifier les droits de ces trois fichiers. En effet, ils contiennent en clair des mots de passe SQL. Lancez les deux commandes :

# chgrp postfix /etc/postfix/mysql-*.cf
# chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf

Comme ça postfix peut continuer à lire les configurations, et les visiteurs indiscrets ne peuvent pas.


Activation du port 587

Beaucoup de FAI bloquent le port 25 (smtp) pour éviter les serveurs de spam. Du coup on utilise le port 587 qui est un port alternatif "standard".

Pour le débloquer, il faut modifier le fichier /etc/postfix/master.cf et décommenter la ligne :

submission inet n       -       -       -       -       smtpd

Activation de SASL

Sasl permet de forcer l'authentification pour envoyer des mails, ce qui évite que n'importe quel spammer utilise votre serveur comme relai. Pour activer sasl avec postfix, modifiez le fichier /etc/postfix/main.cf en ajoutant les lignes suivantes :

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination

Ici on voit plusieurs choses :

  • auth_enable : on active l'authentification
  • tls_auth_only : on active l'authentification uniquement pour ceux qui ont une connexion TLS. Cela evite que votre mot de passe circule en clair.
  • recipient restrictions : on autorise uniquement les connexions en provenance des IP spécifiées dans "mynetwork", les personnes authentifiées correctement avec SASL (et donc avec TLS) et on autorise de relever les mails destinés aux utilisateurs du système.

La ligne la plus importante est la première : elle permet de faire passer l'authentification par dovecot. En effet l'authentification par SASL en passant par postfix est une usine à gaz. Ici, Postfix demande a SASL l'authentification, qui demande à Dovecot. Simple non ?


Et voila pour postfix ! Prochaine étape : dovecot, pour mettre les mails dans les boites respectives !