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 “:
”
:
- L'adresse mail du compte ;
- Le mot de passe chiffré ;
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 :
- Les options générales du serveur ;
- Les actions qui pourront être réalisées sur les mails, qu'on appelle “enveloppes” ;
- Les critères pour reconnaître les enveloppes et y appliquer les actions qui correspondent.
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.crt"
## 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.
-
table aliases ...
: On précise dans quel fichier se trouvent les alias entre les utilisateurs. Ce fichier permet de faire suivre des messages. -
table passwd ...
: On définit le fichier contenant les mots de passe chiffrés qu'on a créés auparavant. -
table virtuals ...
: Le fichier contenant la liste des utilisateurs virtuels. -
pki ...
: On indique où se trouve la clé et le certificat correspondant servant à identifier le serveur et établir une connexion sécurisée. Modifiez les emplacements selon ce que vous avez obtenu dans le paragraphe sur la gestion des certificats. -
listen on all tls pki chezmoi.tld
: smtpd écoute (sur le port 25) pour recevoir des courriels d'autres serveurs. Ici, la connexion profite du chiffrement tls si possible en utilisant le certificat configuré plus haut, repéré par son nom de domaine. -
listen on all port submission tls-require pki chezmoi.tld auth <passwd>
: Cette ligne indique que le serveur écoute sur le port submission avec indispensablement une connexion chiffrée en tls (
tls-require
). Aussitôt, celui qui se connecte sur ce port doit s'identifier (auth
) par rapport au contenu de la table<passwd>
. Cette ligne permet à un utilisateur virtuel de se servir d'un client de messagerie pour envoyer des courriels à partir de son ordinateur.
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.
-
action "envoi" relay
: le serveur relaie l'enveloppe. Dit plus simplement, il l'envoie à l'adresse écrite dessus, au serveur mail SMTP du destinataire. -
action local_mail maildir alias <aliases>
: On distribue l'enveloppe dans une boîte de type maildir d'après la table de correspondance<aliases>
. C'est utile pour les messages internes au système, envoyés à un utilisateur du système. C'est important d'avoir paramétré la redirection de mail pour root dans ce cas. -
action virtual_maildir maildir "/var/vmail/%{dest.domain}/%{dest.user}/Maildir" virtual <virtuals>
: Dans cette action, on distribue une enveloppe dans un dossier de type maildir selon la table des utilisateurs virtuels. Remarquez que le chemin de la boîte maildir est précisé de façon à correspondre au dossier indiqué plus haut.
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.
-
match for local action local_mbox
: on délivre les messages système. -
match from any for domain chezmoi.tld action virtual_maildir
: si le message vient de l'extérieur et est pour le nom de domaine du serveur, on le distribue aux utilisateurs virtuels. -
match auth from any for any action "envoi"
: lorsqu'un message provient d'un client extérieur au serveur et authentifié avec son mot de passe (avec votre client de messagerie par exemple), on envoie le message. -
match for any action "envoi"
: on envoie les message émis depuis “l'intérieur” du 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.crt
ssl_key = </etc/ssl/private/chezmoi.tld.key
disable_plaintext_auth = yes
# emplacement des mails
mail_location = maildir:/var/vmail/%d/%n/Maildir
# 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
.