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 !
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
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.
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
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 ?
| 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 ??
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
| 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
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 ?
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
[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
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 !
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 !
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 !
*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 ?
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à
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.
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 !
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.
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
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)
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
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
merci uncle sekh; merciii
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 ?
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
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… »