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