--- title: Howto Serveur de mail sécurisé avec Mailcow et Scaleway categories: sysadmin mail --- # Intro 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. ``` # apt update # apt upgrade ``` # Création du volume /var chiffré 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`. ``` # dd if=/dev/zero of=/var.img bs=1M count=35000 # chmod 600 /var.img # losetup /dev/loop0 /var.img ``` On en profite pour aussi créer une swap de 1G tant qu'à faire. ``` # dd if=/dev/zero of=/swapfile.img bs=1M count=1000 # chmod 600 /swapfile.img # mkswap -LSWAP # echo "/swapfile.img none swap sw 0 0" >> /etc/fstab ``` 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 ! :-) ``` # apt install cryptsetup # cryptsetup luksFormat --hash sha256 --key-size=512 /dev/loop0 # cryptsetup luksOpen /dev/loop0 crypted-var ``` On formate le tout en EXT4, on monte le volume, on stoppe les services qui utilisent actuellement `/var` et on rsync le tout. ``` # mkfs.ext4 -LVAR /dev/mapper/crypted-var # mount /dev/mapper/crypted-var /mnt/ # for pid in $(lsof | grep /var | tr -s '\t' ' ' | cut -d' ' -f2 | sort | uniq | grep -v "^1$"); do kill $pid; done # rsync -avh --progress /var/ /mnt/ # rm -rf /var/* # umount /mnt ``` 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. ``` # echo "crypted-var /var.img none luks" >> /etc/crypttab # echo "/dev/mapper/crypted-var /var ext4 defaults 0 2" >> /etc/fstab # systemctl disable unattended-upgrades.service # reboot ``` Ta-daa ! On a notre `/var` chiffré. ``` root@scw-049d84:~# df -h /var Filesystem Size Used Avail Use% Mounted on /dev/mapper/crypted-var 35G 687M 33G 3% /var ``` # Installation de Mailcow ## Pré-requis 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). On supprime exim4, car Mailcow utilise postfix. ``` # apt purge exim4 exim4-base exim4-config exim4-daemon-light ``` 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. Laissez-vous guider par le script d'installation. ``` # ./install.sh ``` # Fini 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). # Bonus : Certificat client X.509 L'idée est de restreindre l'accès au 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. ``` # cd /usr/local # git clone https://forge.evolix.org/shellpki.git # cd shellpki # install -d -m 700 /etc/shellpki /etc/ssl/clients # sed -i 's#/etc/openvpn/ssl#/etc/shellpki#g' openssl.cnf # install -m 600 openssl.cnf /etc/shellpki/ # sed -i -e 's#PREFIX=.*#PREFIX=/etc/shellpki#' -e 's#WWWDIR=.*#WWWDIR=/etc/ssl/clients#' shellpki.sh ``` Éditer `/etc/shellpki/openssl.cnf` et initialiser shellPKI. Le plus important est de remplir le « Common Name », par exemple `ca.domain.tld`. ``` # vim /etc/shellpki/openssl.cnf # ./shellpki.sh init ``` Ensuite on génère un On obtiens un certificat et une clé dans `/etc/shellpki/ca/` que l'on peut positionner sur nginx, dovecot et postfix. ``` # sed -i -e 's#/etc/ssl/mail/mail.crt#/etc/shellpki/ca/cacert.pem#' \ -e 's#/etc/ssl/mail/mail.key#/etc/shellpki/ca/private.key#' \ /etc/nginx/sites-available/mailcow.conf /etc/postfix/main.cf \ /etc/dovecot/dovecot.conf ``` Générer un certificat client ``` ``` # Autres actions Voici une liste de tâches non exhaustives à faire de votre côté que je ne documente pas, non obligatoire mais conseillé… - Activer un pare-feu sur votre machine, par exemple `ufw` ; - Monitorer votre serveur ; - S'assurer du suivi des mises à jour ; - Faire des sauvegardes ; - …