How-To Debian Sarge: Postfix + SASL + MySQL + PostfixAdmin + Courier + VirtualDomain

Le problème est le suivant, nous souhaitons héberger de nombreux domaines sur une machine que nous nommerons ici serveur.domaine.com, cette machine doit servir de serveur SMTP pour ces domaines, ainsi que de serveur IMAP, le tout administré à l’aide de PostfixAdmin. Cependant postfix doit être un minimum sécurisé : mots de passe md5 dans la bdd et chroot.

Mise en place de MySQL

Nous allons d’abord installer les bases MySQL qui nous permettrons de stocker les comptes utilisateurs et les domaines ! Pour celà il suffit de suivre l’installation de postfixadmin, téléchargeons donc les sources de postfixadmin.

1
2
3
4
cd /var/www/
tar -zxvf postfixadmin-2.1.0.tgz
cd postfixadmin-2.1.0
mysql -u root -p < DATABASE_MYSQL.TXT

Voilà à présent vous avez installé la base de donnée MySQL postfix, à savoir que l’utilisateur postfix aura comme mot de passe postfix, n’oubliez pas de le changer par la suite ! Vous pouvez également installer cette base sur un serveur MySQL distant ! Cependant pour des questions de sécurité, il sera judicieux d’utiliser un socket unix en local.

Installation de postfixadmin

On édite alors le fichier de configuration de postfixadmin :

1
mv config.inc.php.sample config.inc.php

editor config.inc.phpOn modifie alors les variables pour le serveur local. Sans oublier :

1
2
3
$CONF['encrypt'] = 'md5crypt';
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'YES';

Se référer ensuite au fichier INSTALL.TXT !

On modifiera aussi le fichier /var/www/postfixadmin/admin/.htaccess

1
2
3
4
AuthUserFile /var/www/postfixadmin/admin/.htpasswd
AuthGroupFile /dev/null
AuthName "Postfix Admin"
AuthType Basic

require valid-userPuis on redéfinit le mot de passe à l’aide de la commande

1
# htpasswd -b /var/www/postfixadmin/admin/.htpasswd admin motdepasse

Vérifiez que le fichier .htaccess est interprété ! Si ce n’est pas le cas, vérifiez la variable AllowOverride dans votre configuration apache !

Installation et configuration de postfix

On install postfix et son extension postfix-mysql à l’aide d’un

1
#apt-get install postfix postfix-mysql

On indiquera lors de la configuration automatique, une configuration « Site Internet ».

On crée d’abord le dossier où seront stocké les maildirs :

1
2
3
# mkdir /var/mail/virtual
# chown -R 1001:1001 /var/mail/virtual
# chmod -R 771 /var/mail/virtual

On modifie ensuite la configuration de postfix en ajoutant ceci au /etc/postfix/main.cf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
virtual_alias_maps = mysql:/etc/postfix/mysql/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:1001
virtual_mailbox_base = /var/mail/virtual
virtual_mailbox_domains = mysql:/etc/postfix/mysql/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 1001
virtual_transport = virtual
virtual_uid_maps = static:1001
# Additional for quota support
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes

On crée ensuite le dossier dans lequel sera stocké les maps :

1
2
# mkdir /etc/postfix/mysql/
# cd /etc/postfix/mysql/

et on crée ensuite les fichiers :

1
mysql_virtual_alias_maps.cf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
user = postfix
password = postfix
hosts = 127.0.0.1
dbname = postfix
table = alias
select_field = goto
where_field = address

mysql_virtual_domains_maps.cf

user = postfix
password = postfix
hosts = 127.0.0.1
dbname = postfix
table = domain
select_field = domain
where_field = domain
#additional_conditions = and backupmx = '0' and active = '1'

mysql_virtual_mailbox_maps.cf

user = postfix
password = postfix
hosts = 127.0.0.1
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
#additional_conditions = and active = '1'

mysql_virtual_mailbox_limit_maps.cf
1
2
3
4
5
6
7
8
user = postfix
password = postfix
hosts = 127.0.0.1
dbname = postfix
table = mailbox
select_field = quota
where_field = username
#additional_conditions = and active = '1'

Les valeurs de l’hosts ont été mises à 127.0.0.1 et non pas à localhost pour contrer un problème dû au chroot !

Par ailleurs, il faut modifier les droits d’accés de l’utilisateur postfix pour ne pas avoir d’erreur !

1
2
mysql -u root -p
GRANT SELECT , INSERT , UPDATE , DELETE ON `postfix` . * TO 'postfix'@'%';
1
2
# chmod -R 755 mysql/
# chown -R root:root mysql/
1
 
1
# /etc/init.d/postfix restart

On devrait à partir de là obtenir un postfix qui fonctionne !

Pour tester : On crée un utilisateur avec postfixadmin, puis on crée une boite mail. Si tout se passe bien, la boite est crée dans /var/mail/virtual … sinon on observe les logs dans /var/log/mail.log

A partir de là nous avons un postfix configuré pour recevoir les mails fonctionnel

Installation de Courier-IMAP Courier-POP !

1
apt-get install courier-authmysql courier-imap courier-pop courier-authdaemon

Nous allons maintenant configurer courier pour l’authentification avec la base MySQL de postfix !

On modifie pour celà le fichier /etc/courier/authdaemonrc

1
authmodulelist="authmysql"

Puis on édite la configuration de l’identification MySQL :

1
2
3
4
vim /etc/courier/authmysqlrc
MYSQL_SERVER            127.0.0.1
MYSQL_USERNAME          postfix
MYSQL_PASSWORD          postfix
1
2
3
4
5
6
7
8
9
MYSQL_OPT               0

MYSQL_DATABASE          postfix
MYSQL_USER_TABLE        mailbox
MYSQL_CRYPT_PWFIELD     password

MYSQL_UID_FIELD         '1001'
MYSQL_GID_FIELD         '1001'
MYSQL_LOGIN_FIELD       username
1
2
3
MYSQL_HOME_FIELD        '/var/mail/virtual/'
MYSQL_NAME_FIEL         name
MYSQL_MAILDIR_FIELD     maildir

Attention: N’utilisez que des tabulations, les espaces provoquent des erreurs d’identification ! cf /var/log/mail.log

on lance ensuite les services désirés :

1
2
3
/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-pop restart

On teste ensuite la récupération des mails, en principe, ça marche.

Authentification SASL SMTP

Il existe plusieurs méthodes d’identification SASL avec postfix, mais notre problème est que nous voulons utiliser les mots de passe cryptés dans la base de donnée, et que nous ne voulons pas patché les packages par soucis de maintenance.

La meilleure solution que j’ai trouvé, est d’utiliser le daemon d’authentification de courier !

Pour celà on procéde d’abord à l’installation de SASL2

1
#apt-get install postfix-tls  sasl2-bin libsasl2 libsasl2-modules

On doit ensuite permettre à postfix de voir le socket du daemon authdaemond, celui-ci étant dans un chroot, on va lier le socket dans le chroot

1
2
# mkdir -p /var/spool/postfix/var/run/courier/authdaemon/
# ln /var/run/courier/authdaemon/socket /var/spool/postfix/var/run/courier/authdaemon/socket

On crée ici un hard link du socket de authdaemon dans le chroot, cependant à chaque relance authdaemon il faudra refaire ce hard link, je vous recommande de modifier vos scripts d’init pour celà !

Maintenant on configure postfix pour l’authentification SASL, on crée d’abord un fichier /etc/postfix/sasl/smtpd.conf :

1
2
3
4
5
pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/run/courier/authdaemon/socket
# ( en réalité /var/spool/postfix/var/run/courier/authdaemon/socket )

et on ajoute à /etc/postfix/main.cf :

1
2
3
4
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
1
/etc/init.d/postfix restart

Voilà, nous avons donc effectué une configuration rudimentaire, sachez que cette configuration n’est PAS SÉCURISÉE ! En effet, les mots de passes transitent en clair, et les restrictions laissent à désirer, dans un prochain article, je vous expliquerais comment améliorer tout ça !

N’oubliez pas de changer tous les mots de passe par défaut !

About sekh

Comments

26 Responses to “How-To Debian Sarge: Postfix + SASL + MySQL + PostfixAdmin + Courier + VirtualDomain”
  1. NG dit :

    Bonjour,

    Comment permettre une authentification sécurisée (CRAM-MD5, DIGEST-MD5) en smtp SASL alors que les mots de passe sont chiffrés en base ?

    NG

  2. sekh dit :

    Celà ne doit pas être possible avec authdaemond, on doit utiliser saslauthd avec un patch il me semble.
    Mais la meilleure méthode pour sécurisée est tout de même d’utiliser TLS pour transférer les données, celà fera l’objet d’un article dans quelques temps.

    Edit: après vérification on ne peut utiliser du md5 avec authdaemond si la base mysql a des passwords cryptés. L’intérêt de ce how-to est justement le cryptage des mots de passe dans MySQL, il faudra donc utiliser TLS/SSL.

  3. Flornet dit :

    Bonjour,

    j’ai à peu près tout fait pareil (sauf que je n’ais pas postfix_tls, je n’en suis pas encore là) et j’ai des problèmes d’itentification … cf copy/paste de mon maillog :
    ——————————————–
    Dec 11 03:16:14 flornet courierpop3login: authentication error: Input/output error
    Dec 11 03:16:14 flornet courierpop3login: authentication error: Input/output error
    Dec 11 03:16:14 flornet courierpop3login: authentication error: Input/output error
    Dec 11 03:16:14 flornet courierpop3login: authentication error: Input/output error
    Dec 11 03:16:17 flornet courierpop3login: LOGIN FAILED, user=flornet@flornet.fr, ip=[::ffff:82.236.42.131]
    Dec 11 03:16:17 flornet courierpop3login: LOGIN FAILED, user=flornet@flornet.fr, ip=[::ffff:82.236.42.131]
    Dec 11 03:16:17 flornet courierpop3login: LOGIN FAILED, user=flornet@flornet.fr, ip=[::ffff:82.236.42.131]
    Dec 11 03:16:17 flornet courierpop3login: LOGIN FAILED, user=flornet@flornet.fr, ip=[::ffff:82.236.42.131]
    ——————————————–

    Je n’arrive pas à trouver plus d’infos sur cet « Input/output error » .. c’est pas super explicite …

    Tu n’aurais pas une idée ??

    Merci en tout cas, super article,

    Flornet

  4. sekh dit :

    Est ce que tu utilises bien les packages de sarge ?
    Apparemment courier-pop3 ne communique pas bien avec authdaemond.
    Est ce que l’authentification SMTP fonctionne ?

  5. Flornet dit :

    | Est ce que tu utilises bien les packages de sarge ?
    -> Oui (enfin unstable, c’est gênant ?)

    | Est ce que l’authentification SMTP fonctionne ?
    -> Je n’en suis pas encore là car je me suis arrêté sur « On teste ensuite la récupération des mails, en principe, ça marche. » … qui ne marche pas pour moi.

    | Apparemment courier-pop3 ne communique pas bien avec authdaemond.
    -> ben … je peux faire quoi pour avoir plus d’infos ?? il y a un mode verbose/debug ??

  6. Flornet dit :

    Résolu (il y a un mode debug dans /etc/courier/authdaemonrc qui permet d’avoir plus d’infos…):
    ———————————————————————————-

    Dec 12 20:35:58 flornet authdaemond: SQL query: SELECT username, password, «  », ’1001′ #UID de postfix, ’1001′ #GID de postfix, ‘/var/mail/virtual/’, maildir, «  », «  », «  » FROM mailbox WHERE username = « flornet@flornet.fr »
    ———————————————————————————-

    –> Donc en résumé, il faut pas de commentaires dans le fichier /etc/courier/authmysqlrc
    :)

  7. sekh dit :

    | Est ce que tu utilises bien les packages de sarge ?
    -> Oui (enfin unstable, c’est gênant ?)

    Ce ne sont pas les mêmes packages, il peut y avoir des différences, sarge est actuellement la stable. Mais ce n’est pas le problème.

    Il me semble que le fichier est trés sensible aux espaces. Je vais enlever les commentaires du tuto au cas où, merci :)

  8. placeoweb dit :

    Félicitation pour cet excelent article sekh ! Synthétiquement clair, court, comprenhensible !

    Bien que je sois bloqué à l’envoi d’un mail vers un autre domaine :

    toto@placeoweb.com -> titi@placeoweb.com OK
    toto@placeoweb.com -> grosminet@hotmail.com MARCHE PAS :

    Impossible d’envoyer le message car l’un des destinataires a été refusé par le serveur. L’adresse de messagerie refusée était ‘seb_ja_perpi@hotmail.com’. Objet ‘TEST Exterieur’, Compte : ‘toto@comsports.fr’, Serveur : ‘smtp.placeoweb.com’, Protocole : SMTP, Réponse du serveur : ’554 : Relay access denied’, Port : 25, Sécurisé (SSL) : Non, Erreur de serveur : 554, Numéro d’erreur : 0x800CCC79

    As tu une idée du paramètre qu’il me faut pour autoriser les utilisateurs authentifiées à envoyer leur mail vers divers domaines ?

  9. placeoweb dit :

    L’erreur doit provenir du refus d’identification via SASL à cause d’un fichier inexistant ou inacessible :

    warning: SASL authentication failure: cannot connect to Courier authdaemond: No such file or directory

    Dec 17 18:52:36 sd-4004 postfix/smtpd[20734]: connect from bch66-1-82-242-241-8.fbx.proxad.net[82.242.241.8]
    Dec 17 18:52:36 sd-4004 postfix/smtpd[20734]: warning: SASL authentication failure: cannot connect to Courier authdaemond: No such file or directory
    Dec 17 18:52:36 sd-4004 postfix/smtpd[20734]: warning: bch66-1-82-242-241-8.fbx.proxad.net[82.242.241.8]: SASL LOGIN authentication failed
    Dec 17 18:52:36 sd-4004 postfix/smtpd[20734]: lost connection after AUTH from bch66-1-82-242-241-8.fbx.proxad.net[82.242.241.8]
    Dec 17 18:52:36 sd-4004 postfix/smtpd[20734]: disconnect from bch66-1-82-242-241-8.fbx.proxad.net[82.242.241.8]

    Mais quel fichier va lire postfix/smtpd ?
    /var/run/courier/authdaemon/socket est accessible a tout le monde

  10. placeoweb dit :

    [Résolu] Il vient surement lire la socket /var/spool/postfix/var/run/courier/authdaemon/socket

    J’avais sauté l’étape

    mkdir -p var/spool/postfix/var/run/courier/authdaemon/
    # ln /var/run/courier/authdaemon/socket /var/spool/postfix/var/run/courier/authdaemon/socket

  11. sekh dit :

    :)
    je te remercie pour ces compliments, ça fait plaisir de voir des gens satisfaits de ce que j’écris.
    En effet, tu dois absolument créer un hard link pour accéder à la socket dans le chroot.
    Et attention, n’oublie de rajouter cette ligne de commande dans les scripts d’init, sinon lorsque tu relanceras authdaemond, tu risques d’avoir des surprises !

  12. XD dit :

    Bonjour.

    Tout d’abord bravo pour la qualité de l’article ! J’en ai lu beaucoup des comme ça, et celui ci est extrèmement clair (et propre dans les configs).

    J’ai un petit soucis, qui a mon avis provient de ma config postfix mais sur lequel je butte.
    Je peux créer des alias via postfixadmin, je peux créer des utilisateurs (depuis que j’ai mis un 777 sur /var/mail/virtual :p).

    Seulement, les mails sont parfaitement acheminés lorsque j’utilise par exemple mutt en local, mais impossible de communiquer depuis l’extérieur. Pourtant mon pote 25 est bien à l’écoute (sisi, c’est Nmap qui me l’a dit).

    Voici l’erreur que je récupère :
    Dec 26 16:18:37 c5850-a4-2-62-147-39-140 postfix/smtp[1776]: F160C98F6F: to=, relay=none, delay=3868, status=deferred (connect to bazobox.xxx.com[X]: server dropped connection without sending the initial SMTP greeting)

    Merci d’avance ! :)

  13. XD dit :

    Problème résolu (jusqu’au prochain) j’avais deux entrées dans « mynetworks »

    mynetworks = 127.0.0.0/8, MONIPDESERVEUR/8

    J’ai retiré l’IP du serveur, et hop, c’est tout bon.

    Je vais donc continuer l’article pour finaliser l’installation POP/IMAP ! :)

  14. XD dit :

    *Pouf* ça rebloque :)

    Ni IMAP ni POP ne me permettent de relever les mails distants… :\

    Erreur d’authentification les deux fois. Je n’ai pour ma part rien rajouté dans authmysqlrc (donc pas de commentaires persos :p).

    J’utilise login@domaine.com comme login, et mon pass comme pass… J’ai bien essayé avec login (tout court) et le pass, rien non plus, ni en IMAP, ni en POP…

    Une idée sur la provenance du soucis ?

  15. XD dit :

    Bon j’ai résolu. J’ai tatonné pour y arriver, mais je pense que le seul problème était que MYSQL_MAILDIR_FIELD maildir était commenté, j’avais dû l’oublier au passage :)

    Donc je suis ok de ce côté là ;-)

  16. Greg dit :

    Bonjour,

    Tout d’abord Bravo et merci pour cet article très réussi.
    Tout fonctionne à merveille.

    Par contre, j’ai une question … Comment gérer les quotas avec cette configuration ?
    Merci de votre aide.

  17. XD dit :

    Tu peux gérer les quotas facilement en activant $CONF['quota'] à YES dans config.inc.php de postfix admin.
    Ensuite dans le panel d’administration, tu auras un champ quota ! Tout simplement.

    Question subsidiaire, l’UID et le GID, à quoi correspondent-ils ? Doit-on créer un utilisateur système sans shell et lui accorder les droits ?

    Merci et bonne soirée ! :)

  18. Greg dit :

    Merci XD pour ta réponse,

    Cela est activé de mon côté, mais les quotas ne sont pas pris en compte.

    Aurais-je oublier quelque chose ?

    Merci.

  19. Greg dit :

    Hello,

    J’ai trouvé tout seul, il faut installer le patch VDA pour que postfix prenne en compte les quotas.
    Quand vous tapez « postconf -n » et que vous ne voyez pas les lignes suivantes :

    # Additional for quota support
    virtual_create_maildirsize = yes
    virtual_mailbox_extended = yes
    virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_limit_maps.cf
    virtual_mailbox_limit_override = yes
    virtual_maildir_limit_message = Sorry, the user’s maildir has overdrawn his diskspace quota, please try again later.
    virtual_overquota_bounce = yes

    C’est que vous n’avez pas le patch VDA !
    Celui-ci es tdispo à cette adresse : http://debian.home-dn.net/sarge/postfix-vda/

    Enjoy ;-)

  20. Miam's dit :

    Salut
    Je trouve effectivement ce tuto très bien foutu.
    Pour ce qui est du patch VDA, ceux qui ne souhaitent pas patcher postfix, il existe un package pour debian déjà tout fait (avec patch VDA pour les Quotas):
    Il suffit d’ajouter ce dépot http://debian.home-dn.net
    et ensuite installer le paquet postfix.
    (dixit Lea-Linux: http://www.lea-linux.org/cached/index/Postfix-courier-mysql-quota-spamassassin-amavis.html)

  21. Nastyl dit :

    Tuto super clair, en un mot : limpide !

    Ca marche bien mais j’ai juste un souci de redemarrage… En fait je dois créer le lien symbolique en root après avoir lancé le service authdaemon sinon ca ne marche pas.

    J’ai tenté de modifier le script d’init /etc/init.d/authdaemon pour coller la création du lien symbolique après le lancement du service mais rien n’y fait ca me colle une erreur d’authentification qui dit que SASL n’arrive pas à passer par le socket…

    J’aimerais bien dé-chrooter le bazard mais je doit le faire sur quel ligne dans le master.cf ?

    Merci d’avance si vous avez des infos :P

  22. Nastyl dit :

    Bon j’ai mis la première ligne « smtp » sans chroot et ca marche nickel. Merci ! J’aurais aimé avoir l’info sur le socket en chrooté si quelqu’un a le temps de se pencher sur la question ;)

  23. Ma2t dit :

    merci uncle sekh; merciii

  24. artiflo dit :

    Bonjour,

    Cela fait 6 mois que j’utilise cette configuration mais depuis quelques jours sans raison apparente je ne peux plus me connecter en SMTP mais la connexion en IMAP marche bien.

    J’ai cette erreur SASL authentication failure: cannot connect to Courier authdaemond: Connection refused

    J’ai vérifier et le liens du socket est bien la.

    Quelqu’un aurait une idée ?

  25. artiflo dit :

    Pardon, Voici l’erreur complète :

    Jan 31 20:02:11 xxx postfix/smtpd[4765]: warning: SASL authentication failure: cannot connect to Courier authdaemond: Connection refused
    Jan 31 20:02:11 xxx postfix/smtpd[4765]: warning: SASL authentication failure: Password verification failed
    Jan 31 20:02:11 xxx postfix/smtpd[4765]: warning: unknown[85.xx.xxx.xxx]: SASL PLAIN authentication failed: generic failure
    Jan 31 20:02:11 xxx postfix/smtpd[4765]: warning: SASL authentication failure: cannot connect to Courier authdaemond: Connection refused
    Jan 31 20:02:11 xxx postfix/smtpd[4765]: warning: unknown[85.xxx.xxx.xxx]: SASL LOGIN authentication failed: generic failure

  26. etn dit :

    Merci pour ce tuto, il est nickel !

    par contre petite faute:

    mkdir -p var/spool/postfix/var/run/courier/authdaemon/

    Il vaut mieux mettre :
    mkdir -p /var/spool/postfix/var/run/courier/authdaemon/

    Ca évite les « pourquoi ça merde… » :D ;)

Speak Your Mind

Tell us what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!