Rendez-vous sur Arrakis

C'est lorsque nous croyons savoir quelque chose qu'il faut justement réfléchir un peu plus profondément. F. Herbert

Serveur mail avec utilisateurs virtuels et multi-domaines

Dans le cadre des CHATONS, j'héberge le courrier de plusieurs utilisateurs, qui commencent à être assez nombreux. Voici comment le serveur mail est mis en place.

Le serveur propose des adresses mails sur trois domaines :

Il y a une signature DKIM, un antispam avec spamassassin comme décrit dans la documentation pour s'auto-héberger. Ça fait donc appel à plusieurs mécanismes, dont on pourrait d'ailleurs se passer pour le côté antispam si on en installe sur chaque machine qui va consulter les mails. Mais bon, ça ne peut pas faire de mal, surtout avec l'excellent spamd.

Ici, je ne parlerai que de la configuration de smtpd et dovecot.

Un seul véritable utilisateur : vmail

Puisqu'on veut des comptes virtuels (et c'est très bien ainsi), il nous faut quand même au moins un utilisateur qui va gérer les mails : on l'appelera “vmail”.

On crée cet utilisateur sans lui donner accès à aucun shell. Ici, son dossier personnel sera /var/vmail. C'est ici que seront enregistrés tous les messages, répartis par domaines. Exemple :

/var/vmail/yeuxdelibad.net/kiki/Maildir
/var/vmail/3hg.fr/coco/Maildir

La création de “vmail” se déroule ainsi :

useradd -m -g =uid -c "Virtual Mail" -d /var/vmail -s /sbin/nologin vmail

smtpd

On va avoir un fichier /etc/mail/smtpd.conf qui charge des fichiers comme des tables. Ces fichiers seront au nombre de 3 : - /etc/mail/virtuals : contient la liste des utilisateurs. - /etc/mail/passwd : contient la liste mots de passe, partagé avec dovecot - /etc/mail/domains : contient la liste des domaines servis.

On verra après comment les remplir.

En attendant, voici à quoi ressemble le fichier /etc/mail/smtpd.conf commenté.

# Les alias du système
table aliases file:/etc/mail/aliases
# La liste des domaines servis
table domains file:/etc/mail/domains 
# Les fichiers pour utilisateurs virtuels
table passwd passwd:/etc/mail/passwd
table virtuals file:/etc/mail/virtuals

# Certificats, créés avec acme-client
pki certsssl key "/etc/ssl/acme/private/yeuxdelibad.net-privkey.pem"
pki certsssl certificate "/etc/ssl/acme/yeuxdelibad.net-fullchain.pem"
ca certsssl certificate "/etc/ssl/acme/yeuxdelibad.net-fullchain.pem"

## Quelques options ##
expire 7d
queue compression
queue encryption key 7d3b5db2353beb64caf8d9e25288c1e8

## ECOUTE ##
# Messages locaux
listen on lo0

## RECEPTION DE MESSAGES ##
listen on re0 port smtp tls pki certsssl tag INCOMING
## ENVOI DE MESSAGES ##
listen on re0 port submission tls-require pki certsssl auth <passwd> tag OUTGOING

## RECEPTION ##
# Message venant du système
accept from local for local alias <aliases> deliver to maildir "~/Maildir"

# Message NOSPAM
accept from any for domain <domains> virtual <virtuals> \
    deliver to maildir "/var/vmail/%{rcpt.domain}/%{rcpt.user}/Maildir"

## ENVOI ##
# Mail sortant portant une signature DKIM, multi domaine
accept from local sender {"@yeuxdelibad.net"} for any relay hostname "yeuxdelibad.net"
accept from local sender {"@3hg.fr"} for any relay hostname "3hg.fr"
accept from local sender {"@ouaf.xyz"} for any relay hostname "ouaf.xyz"
accept for any relay

Les lignes importantes ici sont :

/etc/mail/virtuals

Ce fichier contient la liste des utilisateurs, un par ligne. Il ressemble beaucoup au fichier /etc/mail/aliases

batman@domaine.com vmail
superman&domaine.fr vmail
kiki@autredomaine.net vmail

Eh oui, toutes ces adresses vont pour l'utilisateur vmail.

/etc/mail/passwd

Même logique ici, une ligne pour un mot de passe :

batman@domaine.com:$2b$09$lerdFpdQtnu.Bs5EpAsVbeF851GjdD0aza8IDhho38i1DOHk.ujzi::::::
superman@autredomaine.net:$2b$09$VRU/CYJUS3QZHVUFP70xIOURPbiNQeyOEZHoZo6NOY3uO.XSpd2MW::::::

Chaque ligne est constituée des éléments suivants, séparés par des : :

Afin de chiffrer le mot de passe, utilisez la commande encrypt ainsi :

encrypt -p

Ça vous demander d'entrer le mot de passe. Lorsque vous validez avec “Entrée”, un hash du mot de passe s'affiche, il reste à le mettre dans /etc/mail/passwd. (oui, vous vous en doutez, tout ça est dans un script maintenant…).

/etc/mail/domains

Une ligne, un domaine :

domaine.com
domaine.fr
autredomaine.net

/etc/dovecot/local.conf

Dovecot a lui aussi besoin d'être configuré pour accéder à la liste des mots de passe :

mail_location = maildir:~/Maildir

passdb {
    args = scheme=blf-crypt /etc/mail/passwd
    driver = passwd-file
}

userdb {
    args = uid=vmail gid=vmail home=/var/vmail/%d/%n/
    driver = static
}

Création d'un nouvel utilisateur

Je le fais avec ce script :

#!/bin/sh
VIRTUALS=/etc/mail/virtuals
PASSWD=/etc/mail/passwd

if [ "$(whoami)" != "root" ]; then
        echo "You have to be root"
        exit 1
fi
if [ $# -ne 2 ]; then
        echo "usage:"
        echo "addmailuser domain.net user"
        exit 1
fi

# test si déjà pris
if [ -n "$(grep -o ${2}@${1} $VIRTUALS)" ]; then
        echo "Pseudo déjà pris"
        exit 1
fi

echo "Entrez le mot de passe pour ce nouvel utilisateur"
PW=$(encrypt -p)

echo "${2}@${1}    vmail" >> $VIRTUALS
echo "${2}@${1}:${PW}::::::" >> $PASSWD
rcctl restart smtpd

exit 0

Suppression d'un utilisateur

#!/bin/sh

if [ "$(whoami)" != "root" ]; then
        echo "You have to be root"
        exit 1
fi
if [ $# -ne 2 ]; then
        echo "usage:"
        echo "rmmailuser domain user"
        exit 1
fi

TEMP=$(mktemp)
/usr/bin/grep -v "$2@$1" /etc/mail/virtuals >> $TEMP
/bin/mv $TEMP /etc/mail/virtuals
/usr/bin/grep -v "$2@$1" /etc/mail/passwd >> $TEMP
/bin/mv $TEMP /etc/mail/passwd
rm -r /mnt/bigstorage/vmail/${1}/${2}
rcctl restart smtpd

exit 0

Voir aussi :