Installer et configurer son propre serveur mail

Ajouter description de l'objectif

Configurer le DNS

Lorsque nous envoyons des mails, il faut dans un premier temps savoir où ils vont se rendre. C'est pour cette raison que nous aurons besoin de créer des entrées DNS.

Voici ce dont nous avons besoin au minimum :

  • D'une entrée A : un nom de domaine qui pointe vers l'IP du serveur
  • D'une entrée A : un sous-domaine qui pointe vers l'IP du serveur et qui pourrait servir à la consultation de mails via un navigateur web.
  • D'une entrée MX : Nous citons le domaine qui sera connu par le serveur en question. On rajoute également un poids de priorité, ici 10.

Configurer le SMTP

Sans trop rentrer dans les détails, le protocole SMTP est le cœurs de la gestion des mails. Sans lui rien ne fonctionnerait et ce sont les utilitaires de postfix qui doivent s'en charger.

apt install postfix mailutils

le paquet mailutils vas nous être utile plus tard pour tester la configuration.

A la 1ere question, nous sélectionnons le type de configuration “Site Internet” :

Lors de la seconde question, il nous demande quel sera le FQDN. Si notre mail doit ressembler à contact@mon-domaine.com alors il faut lui renseigner mon-domaine.com.

Pour une configuration globale, il est déjà possible d'envoyer du mail vu qu'il s'agit juste de faire la commande suivante pour en envoyer :

mail -s "mon sujet" utilisateur@ma-boiter.com

Si l'on utilise un logiciel client alors il sera intéressant de laisser dovecot authentifier la personne qui communiquera par SMTP. On ajoutera donc dans le fichier main.fr :

# AUTH :
smtpd_tls_auth_only = no
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous

Optimisation optionnelle

Ensuite nous ajoutons manuellement quelques options qui vont nous permettre de ne pas être blacklisté directement dont réduire le rythme d'envois :

nano /etc/postfix/main.cf
minimal_backoff_time = 2h
maximal_backoff_time = 6h
maximal_queue_lifetime = 4d
queue_run_delay = 100s
bounce_queue_lifetime = 1d
initial_destination_concurrency = 5
default_destination_concurrency_limit = 20
slow_destination_rate_delay = 0
slow_destination_concurrency_limit = 1
slow_destination_concurrency_failed_cohort_limit = 100
slow_destination_recipient_limit = 25
smtpd_helo_required = yes
inet_protocols = ipv4

Puis dans le fichier suivant :

nano /etc/postfix/master.cf

Nous ajoutons cette ligne :

slow      unix     -       -       n       -       -    smtp

Il est également préférable de spécifier quels domaines qui accepte la réceptions de mail plus lente :

nano /etc/postfix/transport
orange.fr slow:
wanadoo.fr slow:
voila.fr slow:
laposte.net slow:

Nous pouvons maintenant prendre en compte touts ces changements :

postmap /etc/postfix/transport
systemctl restart postfix

Spécifions le nom de la machine qui sera présent dans l'entête :

echo "domaine.com" > /etc/mailname

Configurer l'IMAP

Pour le moment, nous allons mettre en place une solution locale permettant de consulter ses mails facilement via un navigateur web et non pas depuis un logiciel client comme Thunderbird. Nous allons instaler rainloop car il est simple d'installation et ne demande pas d'utiliser de base de donnée.

Vu que le service postfix et rainloop seront sur la même machine et pour éviter que les requêtes passent par l'extérieure du réseau (et donc pas utile d'ouvrir de nouveaux ports), on édite le fichier suivant :

echo "127.0.0.1    domaine.com" >> /etc/hosts

Téléchargeons Rainloop:

wget https://www.rainloop.net/repository/webmail/rainloop-latest.zip -O /tmp/rainloop.zip
unzip /tmp/rainloop.zip -d /var/www/

On définit les bon droits :

find  /var/www/ -type d -exec chmod 755 {} \;
find  /var/www/ -type f -exec chmod 644 {} \;
chown -R www-data:www-data /var/www/

Remarque, la racine futur site web sera situé à /var/www/.

Par la suite, il faut installer le service web avec Nginx et php7.0 en suivant ce tutoriel. N'oublions pas d'installer les dépendances de php7 que l'application utilise:

apt install php7.0-curl php7.0-json php7.0-xml 
/etc/init.d/php7.0-fpm restart

Voici un exemple de configuration :

Click to display ⇲

Click to hide ⇱

mail.domaine.com
server {
        listen 80;
        server_name  mail.domaine.com;
 
        root /var/www/;
        index index.php;
 
	location ^~ /data {
	  deny all;
	}
 
        location ~ \.(js|css|png|jpg|jpeg|gif|ico|svg|woff)$ {
                expires 2M;
                add_header Cache-Control "public";
        }
 
	access_log /var/log/nginx/mail.domaine.com.access;
	error_log /var/log/nginx/mail.domaine.com.error error;
 
        location ~ .php$ {
                try_files $uri =404;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}

On vérifie la configuration et si elle est sans erreur alors on recharge la configuration générale :

nginx -t
/etc/init.d/nginx reload

L'application communique à travers dovecot pour authentifier un utilisateur donc, nous installons le requis suivant :

apt install dovecot-imapd

Et on lui indique que l'authentification se basse pas fichier :

nano /etc/dovecot/conf.d/10-master.conf

Et dé-commenté la section suivante :

  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
  }

Rendons-nous à cette URL pour configurer l'accès au server mail en local : http://mail.domaine.com/?admin Par défaut les identifiants sont : admin et 12345

Il reste à configurer son domaine (par exemple pour le domaine fusing.fr):

Nous avons enfin terminé la configuration! Il reste plus qu'a se connecter avec un compte utilisateur UNIX.

Admettons par exemple que nous avions l'utilisateur toto, alors son adresse mail ressemblera a : toto@domaine.com

Configurer le SMTPS

Cette configuration s'effectue du côté de Postfix et je propose deux solutions.

Il est possible d'utiliser le certificat ssl-cert-snakeoil.pem. Il est installé en même temps que le système servant ainsi à s'authentifier et sécuriser les communications (tel que les mises à jours avec la commande apt) faites avec la machine. Il dépend du paquet ca-certificates.

Si cette situation convient alors il y a pas de modification à faire vu que c'est déjà paramétré dans main.cf.

Cependant, c'est un certificat auto-signé et si vous avez déjà de côté des certificats qui servent pour un site web par exemple, il est possible de joindre ces certificats ainsi :

nano /etc/postfix/main.cf
smtpd_tls_key_file = /etc/letsencrypt/live/domaine.com/privkey.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/domaine.com/fullchain.pem
smtpd_tls_CAfile = /etc/letsencrypt/live/domaine.com/chain.pem

smtpd_sasl_tls_security_options = noanonymous

Pour activer ces directives ont édite le fichier suivant pour décommenter/ajouter ces directives :

nano /etc/postfix/master.cf
smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

Essayer ces directives sur la prod + recherche deff:
+slow      unix     -       -       n       -       -    smtp
+smtp      unix  -       -       -       -       -       smtp
+relay     unix  -       -       -       -       -       smtp

Vérifier que l'échange de clés s'effectue et qu'ils s'échangent les bon certificats :

 openssl s_client -connect mail.domaine.com:smtps

On obtiendra notamment ces informations :

Server public key is 5120 bit
subject=/CN=domaine.com
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3

Configurer le IMAPS

C'est un peu le même pricinpe qu'avec SMTPS. A la différence, qu'ici j'utilise juste le cartificat de base vu que qu'il n'y a pas vraiment besoin d'un certificat valide. pour communiquer avec les autres serveurs mais juste avec des logiciels clients tel que Thunderbird.

protocols = imap
ssl = yes

ssl_cert = </etc/ssl/certs/ssl-cert-snakeoil.pem
ssl_key = </etc/ssl/private/ssl-cert-snakeoil.key
ssl_dh_parameters_length = 1024

Notons que le Diffie-Hellman sera recréé à chaque rechargement de la configuration.

Quelques directives de sécurité en plus :

ssl_protocols = TLSv1.2 TLSv1.1 !TLSv1 !SSLv2 !SSLv3
ssl_cipher_list = CDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES128:DH+AES:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!LOW
ssl_prefer_server_ciphers = yes

mail_max_userip_connections = 10

On vérifie que tout fonctionne bien ainsi :

openssl s_client -tls1_2 -connect domaine.com:imaps

On obtiendra alors la bannière de bienvenu :

  • OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.

Utiliser un logiciel client

Il reste encore quelque configuration à appliquer sur le serveur dont la gestion des droits :

usermod -aG mail contact

Depuis votre propre machine en local, vous pouvez le faire avec Thunderbird ou alors avec Mutt en mode console dont voici le minimum pour se connecter à sa boite mail :

Click to display ⇲

Click to hide ⇱

.muttrc
#config de base
set from = "contact@domaine.com"
set realname = "NOM PRENOM"
set editor = "vim -c 'set tw=72' -c 'set wrap'"
 
# compte imap : 
set imap_user = "contact"
set folder = "imap://domaine.com:143"
 
# compte smtp :
set smtp_url = "smtp://contact@domaine.com@domaine.com:25/"
 
set move = no 
set imap_check_subscribed
set mail_check = 12
set timeout = 30
set imap_keepalive = 300
set pager_index_lines=7
set pager_stop
set spoolfile = "+INBOX"
set postponed ="+Drafts"
unset crypt_use_gpgme
 
# comportement :
set quit
set delete 
set beep_new