Mise en place d’un serveur e-mail complet et efficient sur un NAS ASUSTOR

Mise en place d’un serveur e-mail complet et efficient sur un NAS ASUSTOR

Oui, il existe bien un package dans AppCentral nommé « Mail Server ». J’ai voulu insister pour l’utiliser, mal m’en a pris ! Déjà il ne fonctionne pas STARTTLS avec le port 587, mais en SSL/TLS avec le port 465. On peut faire avec. En revanche, j’ai trouvé plus gênant qu’il y a certains messages qui ne sont tout simplement pas reçus, par exemple tous les emails provenant de GMail. J’ai donc décidé de trouver une solution pour installer mon propre serveur email, et j’ai trouvé plus simple de passer par Docker. Cela passe par deux dockers différents pour Postfix et Dovecot. J’aurais pu partir sur une seule installation mais je trouvais l’idée de séparer les deux aspects pratique, et pédagogique. De plus ça n’alourdit pas particulièrement le NAS : avec tout ce qui est installé, seulement ~40% des 4 Go de RAM sont consommés, il y a encore de la marge.

Installation de Dovecot

Pour dovecot, j’ai simplement installé l’image docker de dovecot à partir de Portainer :

J’ai créé, toujours dans Portainer, les liens suivants (noter qu’il faut bien sélectionner « Volume » ou « Bind » en fonction du type de lien) :

/volume1/Mail ==> /srv/mail
/volume1/Docker/Dovecot/conf.d ==> /etc/dovecot/conf.d

De cette façon, 1) les emails sont bien conservés au chaud par dovecot dans un répertoire sur le NAS que j’ai créé (/volume1/Mail) et 2) la configuration de dovecot est conservée et éditable dans

/volume1/Docker/Dovecot/conf.d

De plus, l’installation de l’image crée automatiquement un volume persistant dans le répertoire /usr/local/AppCentral/docker-ce/docker_lib/volumes/ dans lequel le fichier dovecot.conf est également éditable et persistant. Pour configurer dovecot il faut donc éditer le fichier

/usr/local/AppCentral/docker-ce/docker_lib/volumes/a73949915e9e61ca225db3388b315f490be498483ac0e9f87ed621a37768d18b/_data/dovecot.conf

(sachant que l’identifiant du volume, qui commence chez moi par a739… sera probablement différent chez vous)

Et il faut éditer les fichiers 10-auth.conf, 10-mail.conf, 15-lda.conf et auth-static.conf.ext présents dans

/volume1/Docker/Dovecot/conf.d

Vous trouverez ci-dessous tous les liens sur les fichiers de configuration qui vont bien et qui feront tourner dovecot correctement. :

Sans rentrer dans tous les détails, voici quelques informations sur l’essentiel de ces fichiers :

dovevot.conf : on active les protocoles imap, submission, sieve et lmtp. On active la sécurité (ssl), on active les services auth et lmtp qui sont configurés pour que postfix et dovecot communiquent bien puisqu’ils sont dans des containers, donc des « machines » (même si elles sont virtuelles) différentes, et on inclut les fichiers de configuration situés dans conf.d.

10-auth.conf : deux lignes sont décommentées pour décrire le type d’authentification, et le fichier où sont déclarées des infos complémentaires sur l’authentification.

auth_mechanisms = plain
!include auth-static.conf.ext

auth-static.conf.ext : définit le type de driver et surtout où trouver le fichier qui stocke les mots de passe (j’y reviens juste après), ainsi que où seront stockés les emails reçus (/srv/mail/%d/%n). %d est le domaine (domain.com), et %n le nom (robert).

passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /etc/dovecot/vusers.conf
}

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

Pour créer le fichier vusers.conf il faut utiliser la commande doveadm. Pour ceci, le plus simple sera d »entrer dans le container via Portainer :

On choisit un mot de passe pour un utilisateur d’email, par ex. pour robert@domain.com on va lui attribuer le mot de passe ‘Gla1QPR!56’ :

Une fois dans la console, on utilise la commande « doveadm » pour créer un mot de passe crypté :

Pour finir, on ajoute la ligne correspondante dans le fichier /etc/dovecot/vusers.conf défini plus ci-dessus :

robert@domain.com:{SHA512-CRYPT}$6$GDloJS3PzjRRZ/Z1$saMySfwQFHKFAVsqlqbUDGZRAGwSBxYYC3a4py.7pbJtddblqEDzDGNQU0y/MOhbjN0lytB4.sB9tqXBCMmH80

Penser à fixer les droits de lecture sur ce fichier à 640.

10-mail.conf : dans ce fichier on peut redonner la localisation du répertoire de stockage des emails, la ligne la plus intéressante ici est la deuxième : elle définit le format de stockage. Avec Dovecot, on choisit en général le format Maildir, mais dovecot a développé son propre format de stockage, que j’ai personnellement choisi pour cette installation, sdbox. Le groupe correspondant est vmail (défini dans le container).

mail_home = /srv/mail/%d/%n
mail_location = sdbox:/srv/mail/%d/%n
mail_privileged_group = vmail
auth_mechanisms = plain
!include auth-static.conf.ext

15-lda.conf : définit quelques options utiles. J’ai conservé le bloc « protocol lda », si je veux ajouter des plugins à dovecot plus tard.

# Should saving a mail to a nonexistent mailbox automatically create it?
lda_mailbox_autocreate = yes

# Should automatically created mailboxes be also automatically subscribed?
lda_mailbox_autosubscribe = yes

protocol lda {
  # Space separated list of plugins to load (default is global mail_plugins).
  #mail_plugins = $mail_plugins sieve
}

Il faut enfin bien penser à transférer les ports 24, 12345 et 143 du NAS au container dovecot :

  • les ports 12345 et 24 permettent à dovecot et postfix de communiquer (notamment via le protocle lmtp)
  • le port 143 est l’accès à dovecot pour lire les emails

Installation de Postfix

Pour postfix je me suis fortement inspiré de l’image instrumentisto/postfix sur Docker Hub. En fait on pourrait juste l’utiliser telle quelle, mais je me suis aperçu qu’il manquait un package dans le container pour qu’elle fonctionne correctement avec mon installation, donc j’ai décidé de reconstruire l’image moi-même en utilisant le fichier de configuration de instrumentisto/postfix et en ajoutant juste la commande pour installer le package en question. Vous pouvez télécharger le fichier de configuration ici. Dans ce fichier on peut retrouver l’unique ligne que j’ai ajoutée pour que l’image fonctionne parfaitement bien par la suite dans ma configuration :

... 
# Install Postfix dependencies
 && apt-get install -y --no-install-recommends --no-install-suggests \
            libpcre3 libicu57 \
            libdb5.3 libpq5 libmariadbclient18 libsqlite3-0 \
            libsasl2-2 \
            libsasl2-modules \
            libldap-2.4 \
    \
...

Pour info, le package libsasl2-modules semble indispensable pour utiliser OVH comme « relay » à postfix.

Ensuite, on peut lancer le container avec la commande suivante :

root@astorus:/volume1/Docker/Traefik# docker run -d --name Postfix --restart always --network="bridge" -v /volume1/Docker/Postfix/etc:/etc/postfix -p 25:25 -p 587:587 instrumentisto/postfix:latest

Le container apparaîtra alors dans Portainer.

Pour la configuration de postfix, je suis intervenu sur les différents fichiers ci-dessous :

Je ne vais pas rentrer dans tous les détails de main.cf car il y a un paquet de définitions, vous pouvez aller chercher dans la documentation de postfix si nécessaire. Je reviendrai seulement sur quelques éléments qui me semblent importants par rapport à la configuration à mettre en place pour notre cas :

# fixer ces variables à votre domaine 
myhostname = mail.domain.com
mydomain = domain.com

# Tailles maxi des mailboxes et des messages
mailbox_size_limit = 1073741824
message_size_limit = 20971520

# SMTPD SASL parameters
# Ce blox définit les liens et la façon de communiquer avec le serveur dovecot, en accord avec les options définies dans la configuration de dovecot décrite ci-dessus
# Comme dovecot et postfix tournent dans des containers séparés, il faut un transport adapté, c'est pour ça qu'on utilise lmtp qui passe du container au NAS, et le NAS transfère automatiquement à dovecot (via le port 24)
smtpd_sasl_type = dovecot                                                                      
smtpd_sasl_path = inet:192.168.1.140:12345                                                     
smtpd_sasl_auth_enable = yes                                                                   
smtpd_sasl_local_domain = $mydomain                                                            
broken_sasl_auth_clients = yes                                                                 
mailbox_transport = lmtp:192.168.1.140:24

# SMTP SASL parameters
# Ce blox permet d'utiliser un relay host pour envoyer les messages. Pour une installation personnelle c'est plus simple que d'utiliser postfix directement, car votre domaine n'est pas reconnu partout et peut être refusé par d'autres serveurs. On utilise le fichier sasl_passwd pour définir l'accès au relay host 
smtp_sasl_auth_enable = yes                                                                    
smtp_sasl_security_options = noanonymous                                                       
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd   

# SMTPD TLS PARAMETERS (incoming connections)        
# On définit ici la façon de recevoir des emails
# On définit la localisation des certificats (j'y reviendrai)
# On définit aussi un fichier, dh4096.pem,
smtpd_tls_security_level = may        
smtpd_tls_ciphers = high        
smtpd_tls_mandatory_ciphers = high        
smtpd_tls_exclude_ciphers = aNULL, LOW, EXP, MEDIUM, ADH, AECDH, MD5, DSS, ECDSA, CAMELLIA128, 3DES, CAMELLIA256, RSA+AES, eNULL        
smtpd_tls_dh1024_param_file = /etc/postfix/dh4096.pem        
smtpd_tls_cert_file = /etc/postfix/ssl/mail.crt        
smtpd_tls_key_file = /etc/postfix/ssl/mail.key    
smtpd_tls_auth_only = no
smtpd_use_tls=yes
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, TLSv1.2, TLSv1.3
smtpd_tls_ciphers = high
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, TLSv1.2, TLSv1.3
smtpd_tls_mandatory_ciphers = high
smtpd_tls_received_header = yes

Pour créer le clé cryptographique dh4096.pem (clé Diffie-Hellman), utiliser la commande (dans le container postfix) :

openssl dhparam -out /etc/postfix/dh4096.pem 4096;

La clé cryptographique Diffie-Hellman est un algorithme cryptographique qui permet aux protocoles Internetd’utiliser une clé partagée et assurer des connexions sécurisées.

sasl_password : c’est le fichier qui contient les credentials pour se connecter au relay host. Je vous conseille de créer un utilisateur, par exemple postmaster, sur l’interface OVH de votre domaine. Il faut ensuite insérer ces identifiants dans le fichier sasl_passwd :

[ssl0.ovh.net]:587 postmaster@domain.com:Password

master.cf : il faut que toutes les lignes suivantes soient bien décommentées (ou ajoutées) :

smtp      inet  n       -       n       -       -       smtpd
...
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
...
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop}

aliases : définit les identifiants. Par exemple, robert et christine sont des users du NAS. On va définir les alias correspondants :

robert:		robert
robert.berrotin:	robert
christine:  christine
christine.berrotin:  christine

Il faut, une fois ce fichier mis à jour, aller dans la console du docker, lancer la commande newaliases puis relancer le docker.

virtual_mailbox : on définit ici les mailbox

robert@domain.com  OK
christine@domain.com  OK

virtual_alias : on définit ici les alias de mailbox

robert.berrotin@domain.com robert@domain.com
chistine.berrotin@dmain.com christine@domain.com

Et voilà ! on a fait le tour. En théorie, ça devrait fonctionner 🙂 .

Installation de Roiundcubemail

Pour lire mes emails avec un navigateur j’ai ajouté Roundcubemail, avec le container natif de roundcubemail :

Cette installation crée un volume persistant lié à /var/www/html, il suffit d’aller dans ce volume pour avoir accè-s aux fichiers de configuration de l’installation. Je ne rentrerai pas dans le détail de cette installation qui n’a rien de spécifique à l’installation sur ce NAS, on peut se référer à la documentation de roundcube pour ça.

9 Comments

  1. Jacques

    Bonjour Eric,

    merci pour ce travail qui révèle une certaine expertise pour découvrir et traiter les spécificités du NAS.

    Pour que Piwigo puisse envoyer des mails aux utilisateurs (fonction « mot de passe oublié » par exemple), faut il installer Dovecot et Postfix ?

    Y a t il une configurations ou des choses à faire pour cela ?

    Cordialement, (quasiment amicalement mais je n’en suis pas encore là car tu me chambre trop sur les pintes 😀 ).

    1. Eric

      Salut. En fait non, il faut installer dovecot et postfix uniquement si tu souhaites héberger ton serveur email sur ton NAS. Je le fais car j’ai euh… sacrifié une pinte pour un nom de domaine, webdot.fr :p . Du coup j’ai pu me créer une adresse email unique sur ce nom de domaine. Tous mes emails sont hébergés, reçus et envoyés à partir de mon NAS, ce qui évite par exemple qu’ils soient lus par les Google et autres fournisseurs (c’est ce qu’ils font pour auto-organiser les emails par exemple et ça ça me plaît pas).
      Concernant piwigo, il faut juste spécifier les serveurs smtp et imap dans le fichier de config, donc ça peut être ceux de Google ou de Yahoo.

  2. Jacques

    Bonjour Eric,

    je n’avais pas fait F5 sur cette page depuis plusieurs jours et je viens de lire ta réponse.

    Merci Eric (mieux vaut tard que jamais, navré…. ).
    😀

  3. Florian

    Bonjour Eric,
    Merci pour ce super tuto, très intéressant !
    J’essaie de le mettre en place de mon côté, mais je bloque pour l’installation de Postfix.
    1- Je n’arrive pas à installer le fichier modifié, mais je pense que ce n’est pas grave (je n’utilise pas OVH).
    2- Quand je mets la commande pour installer Apache :

    docker run -d –name Postfix –restart always –mount type=volume,source=/usr/local/AppCentral/doc
    ker-ce/docker_lib/volumes/postfix_conf/_data,target=/etc/postfix -p 25:25 -p 587:587 apache:latest

    j’ai cette erreur :

    Unable to find image ‘apache:latest’ locally
    docker: Error response from daemon: pull access denied for apache, repository does not exist or may require ‘docker login’: denied: requested access to the resource is denied.

    Aurais-tu une idée stp ?

  4. Bonjour Florian,

    pourrais-tu essayer la ligne suivante ?

    docker run -d --name Postfix --restart always --network="bridge" -v /volume1/Docker/Postfix/etc:/etc/postfix -p 25:25 -p 587:587 instrumentisto/postfix:latest

  5. Florian

    Bonjour Eric,

    Merci pour ton retour rapide !
    J’ai ce message :

    docker: Error response from daemon: Conflict. The container name « /Postfix » is already in use by container « 7846f3a0e82d026ec0068d2ca7a0e01ccd3f4b3c98d4e3082b703f5eafec5158 ». You have to remove (or rename) that container to be able to reuse that name.
    See ‘docker run –help’.

    Surement parce que j’ai installé Postfix juste avant en passant par Portainer 🙂

    Du coup je peux continuer le tuto si Postfix est installé ?

  6. Oui je pense, après je ne sais pas s’il peut y avoir des problèmes si on s’éloigne de la « recette », tu me diras :).
    Pour dire vrai, j’avais changé la ligne de code et remplacé celle du tuto par celle que je t’ai donnée au-dessus pour la création du docker Postfix, j’avoue ne plus savoir pourquoi, et j’avais surtout oublié de changer le tuto en conséquence, mea culpa !
    Je pense que je me suis emmêlé les pinceaux à l’écriture du tuto, parce que je ne vois pas pourquoi lancer un docker Apache pour Postfix :/
    Je vais le faire dans la foulée.

  7. Florian

    Merci Eric, je vais attendre la mise à jour pour continuer le tuto 🙂

    De plus, pourrais-tu me dire stp où trouver les fichiers de conf Postfix ?

    main.cf
    master.cf
    aliases
    sasl_passwd
    virtual_alias
    virtual_mailbox

    Encore merci !

  8. Comme j’ai lancé Postfix en Docker, ces fichiers sont dans /etc/postfix … mais dans le docker. Comme j’ai ajouté un lien Host/Volume qui lie le répertoire
    « /volume1/Docker/Postfix/etc » sur le disque du NAS à « /etc/postfix » dans le docker, ces fichiers sont accessibles et éditables dans ce répertoire du NAS.

Répondre à Florian Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *