Ce Howto explique comment monter un serveur de mail sécurisé en utilisant [Mailcow](https://github.com/andryyy/mailcow) et un serveur virtuel chez [Scaleway](https://www.scaleway.com/). L'introduction est à lire sur mon [blog](https://www.lekernelpanique.fr/?p=925).
La première étape consiste évidement à créer l'instance sur la console de Scaleway en choisissant Debian 8 en OS.
> **Note**: Il est important d'utiliser le noyau Scaleway `x86_64 4.8.14 std #2 (latest)` dans les paramètres avancés, section « bootscript ». Sinon vous n'aurez pas les modules noyau liés au chiffrement. Il vous faudra rebooter pour appliquer le changement de noyau.
# Mise à jour
L'image Debian de Scaleway n'étant pas « buildé » tout les jours, il se peut qu'il y ait quelques mises à jour à faire. On fait donc une upgrade.
Ce volume accueillera vos mails et journaux systèmes. Il est donc intéressant de le chiffrer. Malheureusement, l'image Scaleway fournit un disque non partitionné. L'`initrd` cherche à amorcer le volume root directement sur `/dev/vda`… On va donc créer un fichier image, puis le chiffrer avec `cryptsetup`. Un `/var` de 35G devrait suffire.
Création du fichier image et montage sur `/dev/loop0`.
On chiffre le volume en LUKS avec `cryptsetup`. Choisissez une passphrase, vous aller devoir la taper à chaque démarrage dans la console de Scaleway. Pas très souvent si tout est stable ! :-)
On indique le volume chiffré dans `crypttab` et le point de montage dans `fstab` puis on reboot. Préparez-vous à aller taper votre passphrase dans la console Scaleway !
> **Note** : On désactive `unattended-upgrades` qui va planter l'arrêt à cause du /var qui n'existe plus.
Il vous faut un nom de domaine ! Il faudra choisir quel FQDN utiliser, le plus classique étant `mail.domain.tld`.
Au niveau de vos entrées DNS, il vous faudra un champ A et un MX. Plus de détails sur le [README](https://github.com/andryyy/mailcow#before-you-begin-prerequisites).
Puis on télécharge le script d'installation, on édite la configuration et on lance l'installation.
```
# wget -O - https://github.com/andryyy/mailcow/archive/v0.14.tar.gz | tar xfz -
# cd mailcow-0.14
# vim mailcow.config
```
> **Note** : Le webmail par défaut est Roundcube. Si vous allez utiliser un smartphone avec synchronisation des contacts et agenda, choisissez plutôt SOGo dans le fichier de config.
Voilà, c'est fini ! Il vous reste à créer votre premier compte mail via l'interface d'admin.
Si vous avez des questions ou besoin d'aide, n'hésitez pas à ouvrir un ticket (an anglais !) ici. Sinon demandez-moi sur [Twitter](https://twitter.com/benpro82) ou par [Mail](mailto:benoit[arobase]benpro.fr).
L'idée est de restreindre l'accès aux services web (webmail et admin), et mail (SMTPS/IMAPS) via un certificat client X.509. Sans ce certificat, impossible d'accéder à quoi que ce soit.
> **Note** : Cela remplace le certificat Let's Encrypt utilisé par Mailcow.
Pour cela il faut mettre en place une `PKI` et émettre un certificat client. J'utilise l'outil [shellPKI](https://wiki.evolix.org/HowtoOpenVPN#mise-en-place-dune-pki-avec-shellpki-openbsd-et-debian) pour ça.
Éditer `/etc/shellpki/openssl.cnf` et initialiser shellPKI. Le plus important est de remplir le « Common Name », par exemple `Myname Root Certificate`.
Injecter le certificat racine `/etc/shellpki/ca/cacert.pem` dans votre navigateur et vos appareils tel qu'un smartphone.
Ensuite on génère un certificat (sans passphrase) pour les services web et mail avec un « Common Name » correspondant à votre FQDN pour accéder à vos services comme `mail.domain.tld`.
```
# ./shellpki.sh create
```
On obtiens un certificat et une clé dans `/etc/ssl/clients/` que l'on positionne sur nginx, dovecot et postfix. Les différentes directives à modifier :
# for service in dovecot postfix nginx; do systemctl restart $service; done
```
On en régénère un autre pour votre client (sans passphrase), soit un utilisateur par exemple. On pourra choisir un « Common Name » `username.mail.domain.tld` ou `Nom Prénom`.