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 !