Dernière mise à jour : 07/09/2010
Nous allons couvrir dans cet article comment paramétrer un serveur de mail pour s'authentifier à un serveur MySQL (utilisateurs virtuels) et pouvoir envoyer/recevoir des emails de façon transparente avec authentification SMTP/TLS. Ce tutoriel considère que vous avez un apache (ou équivalent) installé avec les modules php5 et mysql activés. Pour plus de sécurité, je conseille d'utiliser une connexion https. J'utilise Debian Squeeze pour cette installation. J'ai ajouté une section sur l'authentification SASL pour l'envoi de mails, voir plus bas. Comme je suis joueur, j'ai aussi ajouté le filtrage des mails avec procmail.
Installez les paquets suivants : apt-get install postfix libapache2-mod-php5 mysql-client php5-mysql php5-imap dovecot-imapd dovecot-pop3d. Téléchargez ensuite la dernière version de Postfix Admin. Décompactez la dans /var/www. Ensuite lisez attentivement le fichier d'installation (INSTALL.TXT). Il vous faudra modifier config.inc.php en changeant au moins les valeurs suivantes. Je considère dans cet exemple que votre base de données est locale, que votre utilisateur postfix s'appelle postfixmailuser avec des droits sur la base. Enfin mon exemple utilise https.
$CONF['configured'] = true; $CONF['setup_password'] = 'votre pass'; $CONF['postfix_admin_url'] = 'https://fqdn.domaine.com/postfixadmin-2.3.1'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfixmailuser'; $CONF['database_password'] = 'votrepass'; $CONF['database_name'] = 'postfix';
Une fois installé et configuré, vous pouvez lancer le setup, allez à l'adresse : https://fqdn.domaine.com/postfixadmin/setup.php qui vous donnera tous les conseils pour tout avoir bien configuré. Il vous demande alors de créer un administrateur. Vous pouvez l'appeller comme vous le voulez (attention, il utilise une adresse email comme identifiant valide). Vous devez ensuite créer les fichiers de configuration pour MySQL et Postfix. Pour ce faire, allez dans /etc/postfix/ :
# cat mysql_alias.cf user=postfixmailuser password=votrepass dbname=postfix hosts = localhost table = alias select_field = goto where_field = address # cat mysql_domains.cf user=postfixmailuser password=votrepass dbname=postfix hosts = localhost table = domain select_field = domain where_field = domain additional_conditions = and backupmx = '0' and active = '1' # cat mysql_mailbox.cf user=postfixmailuser password=votrepass dbname=postfix hosts = localhost table = mailbox select_field = maildir where_field = username
Modifiez ensuite votre postfix pour avoir au moins cette configuration minimale :
setgid_group = postdrop myhostname = fqdn.domaine.com smtpd_banner = $myhostname ESMTP $mail_name biff = no delay_warning_time = 4h smtpd_helo_required = yes strict_rfc821_envelopes = yes disable_vrfy_command = yes unknown_address_reject_code = 554 unknown_hostname_reject_code = 554 unknown_client_reject_code = 554 smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname, permit alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = smtp.frlinux.net relayhost = mynetworks = 127.0.0.0/8, 160.6.207.17, [2001:770:60:cf:5652:ff:fe63:68bf] mailbox_command = procmail mailbox_size_limit = 0 recipient_delimiter = + inet_protocols = all inet_interfaces = all virtual_mailbox_base = /var/mail virtual_mailbox_maps = mysql:/etc/postfix/mysql_mailbox.cf virtual_alias_maps = mysql:/etc/postfix/mysql_alias.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql_domains.cf virtual_transport = virtual virtual_gid_maps = static:5000 virtual_minimum_uid = 5000 virtual_uid_maps = static:5000 smtp_sasl_password_maps = mysql:/etc/postfix/mysql_mailbox.cf mail_owner = postfix unknown_local_recipient_reject_code = 450 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_invalid_hostname, permit_mynetworks, reject_unauth_destination
Editez ensuite /etc/postfix/master.cf avec les ligness suivantes :
smtp inet n - n - - smtpd
pickup fifo n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr fifo n - n 300 1 qmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp
-o fallback_relay=
showq unix n - n - - showq
error unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache
smtp-amavis unix - - n - 2 smtp -o smtp_data_done_timeout=1200
127.0.0.1:10025 inet n - n - - smtpd -o content_filter=
dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d $(recipient)
smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject
maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}
old-cyrus unix - n n - - pipe
flags=R user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -m ${extension} ${user}
cyrus unix - n n - - pipe
user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -r ${sender} -m ${extension} ${user}
uucp unix - n n - - pipe
flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail unix - n n - - pipe
flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp unix - n n - - pipe
flags=Fq. user=foo argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient
Loggez vous ensuite sur l'interface de Postfix Admin (avec le compte admin créé précedemment) puis allez dans Domain List/New Domain. On va partir sur l'exemple domaine.com donc crééz le puis allez dans Virtual List/Create Mailbox. On va utiliser le compte luser@domaine.com, donc renseignez bien tous les champs et appuyez sur Add Mailbox.
Il faut à présent configurer dovecot (alternative à courier que j'utilisais depuis de nombreuses années). Dovecot vous permet de configurer votre POPS/IMAPS de façon très simple. Créez ces deux fichiers :
# cat /etc/dovecot.conf
base_dir = /var/run/dovecot/
protocols = imap imaps
protocol imap {
listen = *:143
ssl_listen = *:993
}
protocol pop3 {
listen = *:110
}
log_timestamp = ?%Y-%m-%d %H:%M:%S ?
syslog_facility = mail
mail_location = maildir:/var/mail/%u
mail_access_groups = mail
mail_debug = no
first_valid_uid = 150
last_valid_uid = 9000
maildir_copy_with_hardlinks = yes
protocol imap {
login_executable = /usr/lib64/dovecot/imap-login
mail_executable = /usr/lib64/dovecot/imap
imap_max_line_length = 65536
}
protocol pop3 {
login_executable = /usr/lib64/dovecot/pop3-login
mail_executable = /usr/lib64/dovecot/pop3
pop3_uidl_format = %08Xu%08Xv
}
protocol lda {
postmaster_address = postmaster@mydomain.com
sendmail_path = /usr/lib/sendmail
auth_socket_path = /var/run/dovecot/auth-master
}
auth_verbose = no
auth_debug = no
auth_debug_passwords = no
auth default {
mechanisms = plain
passdb sql {
args = /etc/dovecot/dovecot-mysql.conf
}
userdb sql {
args = /etc/dovecot/dovecot-mysql.conf
}
user = nobody
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0660
user = vmail
group = mail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
# cat /etc/dovecot-mysql.conf
driver = mysql
connect = host=127.0.0.1 dbname=postfix user=postfixmailuser password=votrepass
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u'
Créez ensuite votre utilisateur avec les bons droits :
groupadd -g 5000 vmail useradd -u 5000 -g 5000 -d /var/mail vmail chown -R vmail:vmail /var/mail/
Voilà, vous devriez à présent être capables de pouvoir envoyer et recevoir des mails sur votre serveur. Vous pouvez ajouter autant de domaines que vous le voulez. Si vous avez des questions ou des ajouts, merci d'utiliser le forum de préférence.
SASL
Pour SASL, c'est relativement simple, il vous faut le paquet suivant sous Debian : apt-get install libpam-mysql. Ensuite editez le fichier /etc/pam-mysql.conf comme suit:
users.host = localhost users.database = postfix users.db_user = postfixmailuser users.db_passwd = votre_pass users.table = mailbox users.user_column = username users.password_column = password users.password_crypt = 1
Il ne reste alors qu'à ajouter ceci dans /etc/postfix/main.cf :
#SASL smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl2_auth_enable = yes smtpd_sasl_security_options=noanonymous #smtpd_sasl_security_options = noplaintext, noanonymous smtpd_sasl_tls_security_options = noanonymous smtpd_sasl_local_domain = $myhostname #smtpd_sasl_local_domain = #broken_sasl_auth_clients = no broken_sasl_auth_clients = yes smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_invalid_hostname, reject_unlisted_sender, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unknown_sender_domain, reject_unknown_recipient_domain, permit_mynetworks, reject_unauth_destination
Lancez ensuite un postfix reload et c'est réglé.
Procmail
Une fois les bonnes options mises, il est relativement simple d'utiliser procmail pour diriger les emails vers le bon endroit. Commencez donc par éditer /etc/postfix/master.cf avec la ligne suivante :
procmail unix - n n - - pipe
-o flags=RO user=vmail argv=/usr/bin/procmail -t -m USER=${user} EXTENSION=${extension} NEXTHOP=${nexthop} /etc/postfix/procmailrc.common
Ceci va dire à postfix d'utiliser procmail avec des règles se trouvant dans le fichier /etc/postfix/procmailrc.common que nous allons créer de suite :
:0 HOME="/var/mail" MAILDIR="$HOME/$USER@$NEXTHOP" DEFAULT="$MAILDIR/" LOGFILE="/var/mail/$USER@$NEXTHOP/.logfile" NL=" " WS=" " SWITCHRC="$MAILDIR/.procmailrc"
Une petite explication rapide sur ce fichier un peu particulier. J'avais envie d'avoir un log des emails reçus, j'ai donc créé un logfile propre à chaque utilisateur. Ensuite le $NEXTHOP défini le domaine, à vous de changer selon votre configuration. Enfin, le point très important pour moi est la possibilité d'avoir un fichier de filtrage par utilisateur, c'est ici qu'intervient SWITCHRC. N'oubliez pas d'attribuer les bonnes permissions au fichier $MAILDIR/.procmailrc afin que l'utilisateur virtuel puisse le lire.
Il ne nous reste qu'à modifier les lignes suivantes dans /etc/postfix/main.cf :
#mailbox_command = #virtual procmail_destination_recipient_limit = 1 transport_maps = hash:/etc/postfix/transport
Ensuite créez le fichier /etc/postfix/transport et ajoutez les utilisateurs pour lesquels vous voulez filtrer :
user1@mydomain.com procmail
Si vous voulez filtrer tous les utilisateurs, remplacez le virtual_transport par procmail dans votre main.cf. Voilà ceci vous permettra de rediriger vos emails là où vous voulez.
