Jail Postfix et Dovecot2
La première chose à faire est de créer un répertoire pour héberger les mails et de donner un accès en lecture et écriture à ce répertoire à la jail. Pour ça je vais créer les répertoires /home/mail
et /home/jails/mail/home/mail
et d’ajouter une ligne à /etc/fstab.mail
.
mkdir -p /home/mail /home/jails/mail/home/mail
echo "/home/mail /home/jails/mail/home/mail nullfs rw 1 1" >> /etc/fstab.mail
Il suffira alors de redémarrer ezjail pour prendre ces changements en compte ou de monter le répertoire à la main en attendant :
mount_nullfs /home/mail /home/jails/mail/home/mail
Une fois l’environnement créé, on peut se rendre dans la jail et commencer l’installation.
jexec mail csh
Configuration de Postfix
Commençons par installer Postfix (et Dovecot au passage).
cd /usr/ports/mail/postfix
make install clean
Afin que Postfix s’accorde avec Dovecot sur l’authentification SASL, j’ai choisie l’option DOVECOT2
, et comme cette option nécessite l’installation de Dovecot, ça nous économise une étape au passage. J’ai aussi choisie l’option TLS
et répondu « y
» au script qui me demandait si je voulais ajouter Postfix à mailer.conf
.
On crée le fichier de démarrage /etc/rc.conf
afin d’y ajouter le démarrage de Postfix et Dovecot et d’empêcher sendmail de s’occuper de quoi que ce soit.
dovecot_enable="YES"
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
postfix_enable="YES"
Puisque l’on se passe du service de sendmail, autant éviter à periodic d’effectuer des tâches inutiles le concernant en ajoutant quelques lignes à /etc/periodic.conf
.
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"
La grande majorité des articles traitant de la mise en œuvre de Postfix utilise un SGBD pour stocker les informations comme les domaines servis ainsi que leurs comptes et alias. J’imagine qu’on pourrait disserter sur les performances de la solution mais personnellement j’aime le fichier plat : c’est simple, rapide à mettre en œuvre et facile à administrer, entre autres. J’utiliserais donc ici trois fichiers pour les domaines, les comptes et les alias.
Je n’utilise pas d’alias dans ma configuration, mais Postfix attend pourtant un fichier /etc/aliases.db
et pour le générer, il suffit d’un :
newaliases
On configure ensuite Postfix en modifiant /usr/local/etc/postfix/main.cf
.
mail_owner = postfix
myhostname = mx0.domain.tld
mydomain = domain.tld
myorigin = $mydomain
mydestination =
inet_protocols = ipv4
inet_interfaces = all
mynetworks = 192.168.0.0/24, 12.34.56.78
virtual_mailbox_domains = /usr/local/etc/postfix/virtual_domains
virtual_mailbox_base = /home/mail
virtual_mailbox_maps = hash:/usr/local/etc/postfix/virtual_mailboxes
virtual_uid_maps = static:125
virtual_gid_maps = static:125
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
smtpd_tls_cert_file = /usr/local/etc/postfix/certificate.pem
smtpd_tls_key_file = /usr/local/etc/postfix/private.pem
Préciser un protocole via `inet_protocols` permet d'éviter les warnings du type `postfix: warning: inet_protocols: disabling IPv6 name/address support: Protocol not supported`.
Pour créer la clé privée et le certificat associé, il suffit de remplir le formulaire affiché par :
openssl req -new -x509 -days 3650 -nodes -out /usr/local/etc/postfix/certificate.pem -keyout /usr/local/etc/postfix/private.pem
Dans le champ « Common Name » je vous recommande d’entrer le domaine associé au serveur SMTP, ça évitera aux clients de râler parce qu’en plus d’être self-signed le certificat n’est pas associé au bon domaine.
Pour d’évidentes raisons de sécurité il faut ensuite modifier les droits d’accès sur ces deux fichiers.
chmod 0644 /usr/local/etc/postfix/certificate.pem
chmod 0400 /usr/local/etc/postfix/private.pem
Afin d'éviter que vos mails se fassent jeter par les autres serveurs, je vous recommande de modifier le reverse de l'IP de votre serveur afin que celui-ci pointe vers mx0.domain.tld
(voir la configuration du serveur BIND). Et comme c'est faisable que si vous possédez le /24 associé à l'IP de votre serveur, pour le modifier il vous faudra probablement vous rendre dans le panneau d'administration de votre hébergeur.
Configuration de Dovecot
On configure Dovecot en modifiant le fichier /usr/local/etc/dovecot/dovecot.conf
.
auth_mechanisms = cram-md5
disable_plaintext_auth = yes
first_valid_uid = 125
mail_location = maildir:/home/mail/%d/%n/
passdb {
args = scheme=CRYPT username_format=%u /usr/local/etc/dovecot/passdb
driver = passwd-file
}
protocols = imap
service auth {
unix_listener /var/spool/postfix/private/auth {
user = postfix
mode = 0660
group = postfix
}
}
service imap-login {
inet_listener imap {
address = 12.34.56.78
port = 143
}
inet_listener imaps {
address = 12.34.56.78
port = 993
}
}
ssl_cert = </usr/local/etc/dovecot/certificate.pem
ssl_key = </usr/local/etc/dovecot/private.pem
userdb {
args = uid=125 gid=125 home=/home/mail/%d/%n
driver = static
}
Pour créer la clé privée et le certificat associé, il suffit de remplir le formulaire affiché par :
openssl req -new -x509 -days 3650 -nodes -out /usr/local/etc/dovecot/certificate.pem -keyout /usr/local/etc/dovecot/private.pem
Comme plus haut, je vous recommande d’entrer le domaine associé au serveur IMAP dans le champ « Common Name » et de modifier les droits d’accès sur ces deux fichiers.
chmod 0444 /usr/local/etc/dovecot/certificate.pem
chmod 0400 /usr/local/etc/dovecot/private.pem
Ajout d’un domaine
Pour ajouter un domaine à cette configuration, il suffit de créer le répertoire destiné à accueillir les répertoires des comptes et de l’attribuer à l’utilisateur et au groupe postfix.
mkdir /home/mail/domain.tld
chown postfix:postfix /home/mail/domain.tld
Il ne reste alors plus qu’à ajouter le domaine au fichier /usr/local/etc/postfix/virtual_domains
, qui est composé d’un domaine virtuel par ligne et qui sera en fait ajouté tel quel à la configuration de Postfix.
echo domain.tld >> /usr/local/etc/postfix/virtual_domains
Ajout d’un compte
Pour ajouter un compte à un domaine dans cette configuration il faut tout d’abord créer une structure Maildir qui comprend pour chaque boîte les sous-répertoires cur
, new
et tmp
. On notera que local
est ici le nom de la boîte mail (qui sera la partie locale de l’adresse e-mail).
mkdir -p /home/mail/domain.tld/local/{cur,new,tmp}
Si vous comptez utiliser Thunderbird, je vous recommande aussi de créer les répertoires `.Drafts`, `.Sent` et `.Trash`.
mkdir -p /home/mail/domain.tld/local/{.Drafts,.Sent,.Trash}
On peut alors assigner le tout à l’utilisateur et au groupe postfix.
chown -R postfix:postfix /home/mail/domain.tld/local
Il faut ensuite ajouter une ligne liant une adresse à ce répertoire, si ce dernier se termine par un slash Postfix comprendra que c’est une boîte au format Maildir, mbox sinon.
Notons que le répertoire indiqué est relatif à la racine des domaines virtuels, configurée dans /usr/local/etc/postfix/main.cf
.
echo "local@domain.tld domain.tld/local/" >> /usr/local/etc/postfix/virtual_mailboxes
Le fichier /usr/local/etc/postfix/virtual_mailboxes
doit par contre être créé ou mis à jour en utilisant la commande postmap
dessus à chaque modification afin de tenir à jour le fichier /usr/local/etc/postfix/virtual_mailboxes.db
.
postmap /usr/local/etc/postfix/virtual_mailboxes
Le fichier contenant les associations login-password est compatible avec un classique /etc/passwd
, ce qui donne un minimum fonctionnel de login:password
. Cependant Dovecot est livré avec un binaire d’administration du serveur, doveadm
, qui possède une fonction destinée à simplifier la création de compte en s’occupant, par exemple, du hashage du mot de passe.
sh -c 'echo "local@domain.tld:"`doveadm pw -s CRAM-MD5` >> /usr/local/etc/dovecot/passdb'
Il ne reste alors plus qu’à arrêter sendmail, à démarrer postfix et dovecot et à sortir de la jail.
/etc/rc.d/sendmail stop
/usr/local/etc/rc.d/postfix start
/usr/local/etc/rc.d/dovecot start
exit