Serveur mail complet avec utilisateurs virtuels

Cette désignation fait référence à des utilisateurs qui sont bien réels, mais qui ne sont pas des comptes UNIX à proprement parler qui peuvent accéder à un shell (la ligne de commande).

Ainsi, un nouveau compte mail ne sera pas créé avec adduser, mais en éditant un simple fichier texte contenant le nom d’utilisateur et un hash de son mot de passe.

Un utilisateur responsable des mails : _vmail

On va créer utilisateur en charge de tous les mails. Il portera le doux nom de “_vmail” 😁. Ce dernier ne servira qu’à ça et n’aura donc pas accès au shell, c’est plus sûr 😊 :

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

Un nouveau dossier est créé : /var/vmail. Les messages des utilisateurs seront dedans, mais bien organisés : dans ce dossier, il y aura des sous-répertoires portant le nom des utilisateurs virtuels. Ainsi, les messages seront enregistrés dans, par exemple :

/var/vmail/chezmoi.tld/batman/Maildir
/var/vmail/chezmoi.tld/utilisateur/Maildir
/var/vmail/chezmoi.tld/ninja/Maildir
...

/etc/mail/virtuals

Ce fichier contient la liste des utilisateurs, un par ligne. Il fonctionne comme le fichier /etc/mail/aliases :

heros@chezmoi.tld batman@chezmoi.tld,superman@chezmoi.tld
batman@chezmoi.tld _vmail
superman@chezmoi.tld _vmail
kiki@chezmoi.tld _vmail

Eh oui, toutes ces adresses correspondant (lire “appartiennent”) à l’utilisateur _vmail.

Notez que sur la première ligne, on a fait un alias à titre d’exemple pour transférer un mail d’une adresse à une autre.

/etc/mail/passwd

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

batman@chezmoi.tld:$2b$09$lerdFpdQtnu.Bs5EpAsVbeF851GjdD0aza8IDhho38i1DOHk.ujzi
superman@chezmoi.tld:$2b$09$VRU/CYJUS3QZHVUFP70xIOURPbiNQeyOEZHoZo6NOY3uO.XSpd2MW

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

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

encrypt -p

Ou bien l’équivalent smtpctl encrypt mot_de_passe

Ça vous demande 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.

(Facultatif) Permissions sur les fichiers d’identification

Les fichiers précédents ne doivent pas être lisibles par un simple utilisateur de passage. Faisons en sorte que seul l’administrateur (root) puisse écrire dedans et rendons-les lisibles par les démons qui en auront besoin : dovecot et smtpd. Ce n’est pas une obligation, mais c’est une précaution qui ne peut blesser personne 😉.

Afin de séparer les privilèges, dovecot et smtpd fonctionnent à partir d’utilisateurs aux accès restreints, respectivement _smtpd et _dovecot. Tout ceci permet de protéger votre serveur si un jour, l’un de ces services était compromis.

Nous allons créer un groupe _maildaemons dans lequel nous mettrons les deux utilisateurs cités ci-dessus afin de faciliter la gestion des permissions :

# groupadd _maildaemons
# usermod -G _maildaemons _smtpd
# usermod -G _maildaemons _dovecot

dovecot n’est peut-être pas installé à ce stade de votre lecture puisqu’on en parle plus loin. Installez-le avant la dernière commande : # pkg_add dovecot.

On définit maintenant le propriétaire et le groupe des fichiers contenant les mots de passe et identifiants :

# chown root:_maildaemons /etc/mail/passwd /etc/mail/virtuals

Enfin, on ne permet qu’à root d’écrire dans ces fichiers et au groupe _maildaemons d’en lire le contenu :

# chmod 640 /etc/mail/passwd /etc/mail/virtuals

Si vous vérifiez, vous voyez que les permissions et propriétaires sont corrects :

# ls -l /etc/mail/passwd
-rw-r-----  1 root  _maildaemons  17226 Nov 12 08:40 /etc/mail/passwd

Configuration d’Opensmtpd

Opensmtpd (smtpd) est le serveur mail par défaut sur OpenBSD. Il est déjà installé, reste à le configurer.

Cependant, avant toutes choses, ouvrez et redirigez les ports suivants : 25 (smtp), 587 (submission) et 993 (imaps). Nous ne préoccupons pas du port 465 (smtps) car il est déprécié.

Pour configurer opensmtpd, on édite /etc/mail/smtpd.conf. Ce dernier sera mis en oeuvre dans l’ordre de lecture.

Ce dernier se décompose en 3 parties :

Le voici, à adapter à vos besoins :

# Configuration generale
## Tables 
table aliases "/etc/mail/aliases"
table passwd "/etc/mail/passwd"
table virtuals "/etc/mail/virtuals"

## Certificats
pki chezmoi.tld key "/etc/ssl/private/chezmoi.tld.key"
pki chezmoi.tld cert "/etc/ssl/chezmoi.tld-fullchain.pem"

## Ecoute pour recevoir/envoyer
### Reception
listen on all tls pki chezmoi.tld 
### Envoi avec client de messagerie
listen on all port submission tls-require pki chezmoi.tld auth <passwd> 

# ACTIONS 
action "envoi" relay 
action local_mail maildir alias <aliases>
action virtual_maildir maildir "/var/vmail/%{dest.domain}/%{dest.user}/Maildir" virtual <virtuals>

# Correspondances
## Reception
### Message pour les utilisateurs virtuels
match from any for domain chezmoi.tld action virtual_maildir
### Message pour les utilisateurs locaux
match from any for local action local_maildir

## Envoi
match auth from any for any action "envoi"
match for any action "envoi"

Vous n’avez quasiment rien à modifier dans ce fichier, mis à part chezmoi.tld à remplacer par votre nom de domaine.

STOOOP! On veut des détails!

Regardons les lignes de ce fichier les unes après les autres.

Tous d’abord, les premières lignes correspondent à des options générales.

Ensuite, sont définies quelques actions qui seront appliquées aux mails. Il peut s’agir d’envoyer un courriel à l’extérieur ou bien de distribuer une enveloppe à un utilisateur du serveur.

Enfin, on regarde si on doit envoyer un message ou le délivrer pour appliquer les actions définies.

Notez que si rien n’est précisé, on considère que la règle s’applique pour un message venant du serveur : le from local est sous-entendu. Sinon, from any permet d’envoyer un message à partir de votre ordinateur, en passant par le serveur.

Nous passons maintenant à une étape simple mais importante afin que les mails soient correctement émis. Il faut indiquer dans le fichier /etc/mail/mailname votre nom de domaine sur une seule ligne. Il s’agit du domaine que vous avez indiqué dans le champ MX de votre zone DNS :

chezmoi.tld

Nous pouvons maintenant activer et relancer le serveur smtpd :

# rcctl enable smtpd
# rcctl restart smtpd

Voilà pour opensmtpd 😊.

Dovecot

Dovecot va être utilisé comme serveur IMAP, afin de pouvoir récupérer son courrier à partir d’un client comme Thunderbird.

On installe dovecot comme d’habitude :

# pkg_add dovecot

On édite maintenant le fichier /etc/dovecot/local.conf pour y mettre le contenu suivant :

# On écoute en IPV4 et IPV6.
listen = *, [::]

# imap > pop
protocols = imap

# Chiffrement. Editez ces lignes
ssl = yes
ssl_cert = </etc/ssl/chezmoi.tld-fullchain.pem
ssl_key = </etc/ssl/private/chezmoi.tld.key
disable_plaintext_auth = yes

# tres important comme on a modifie les permissions
# sur /etc/mail/passwd
service auth {
    user = $default_internal_user
    group = _maildaemons
}

# methodes d'authentification
passdb {
    args = scheme=blf-crypt /etc/mail/passwd
    driver = passwd-file
}

# Les messages sont dans /var/vmail et appartiennent à _vmail
userdb {
    driver = static
    args = uid=_vmail gid=_vmail home=/var/vmail/%d/%n/ 
}

L’exemple ci-dessus est commenté pour vous aider à comprendre ce qui y est fait.

Pensez à adapter l’emplacement des certificats aux variables ssl_cert et ssl_key.

Par ailleurs, une configuration ssl est déjà pré-configurée dans le fichier /etc/dovecot/conf.d/10-ssl.conf. C’est censé nous faciliter la vie avec un script qui génère un certificat auto-signé, mais comme on a déjà nos certificats et configuré cette partie, il risque de ne pas trop aimer. Dans ce fichier, commentez donc toutes les lignes restantes :

## Fichier /etc/dovecot/conf.d/10-ssl.conf
#ssl_cert = </etc/ssl/dovecotcert.pem
#ssl_key = </etc/ssl/private/dovecot.pem

Afin que dovecot fonctionne correctement, il faut maintenant éditer le fichier /etc/login.conf pour ajouter quelques lignes : (voir le fichier /usr/local/share/doc/pkg-readmes/dovecot*)

dovecot:\
    :openfiles-cur=1024:\
    :openfiles-max=2048:\
    :tc=daemon:

On prend en compte les changements récents sur ce fichier avec la commande suivante :

# [ -f /etc/login.conf.db ] && cap_mkdb /etc/login.conf

Pour terminer cette partie, on active dovecot et on relance les différents éléments constituant le serveur mail.

# rcctl enable dovecot
# rcctl start dovecot
# rcctl restart smtpd

Il vous est désormais possible d’utiliser un client de messagerie afin de consulter votre courrier.

Ajouter un nouveau compte mail

Vous devez remplir les fichiers /etc/mail/virtuals et /etc/mail/passwd avec une ligne en plus. Ensuite, lancez les commandes suivantes pour que smtpd prenne vos changements en compte :

smtpctl update table virtuals
smtpctl update table passwd

Ou alors, relancez smtpd avec rcctl.


Page suivante →