Ajouter le support TLS à Postfix et Dovecot

TLS (qui s’appelait SSL avant 2001) signifie Transport Layer Security. Il s’agit d’une couche qui crypte la communication entre deux hôtes. En utilisant SMTP AUTH (voir cet article) avec les mécanismes PLAIN ou LOGIN, le nom d’utilisateur ainsi que le mot de passe transitent en clair et sont exposés à quiconque sniffe le réseau. C’est là que la couche TLS peut résoudre ce point faible.
Pour utiliser le cryptage, il faut un certificat qui valide notre authenticité pour le client qui va se connecter au serveur de messagerie. Normalement un tel certificat doit s’acheter auprès d’une autorité compétente comme Thawte ou Verisign. L’autre solution est d’auto-signer son certificat, c’est bien entendu gratuit, mais n’étant pas officiel (mais reste légal!), les utilisateurs du serveur de messagerie devront vous faire confiance en acceptant ce certificat « maison ». Cette soluton est décrite ci-dessous.

Création du certificat

La création du certificat s’effectue avec la commande openssl, comme suit :

# openssl req -new -x509 -days 3650 -nodes -out /etc/postfix/mailserver.pem -keyout /etc/postfix/mailserver.pem

C’est parti pour une série de questions, peu importe les réponses données, seul le Common Name est important et doit refléter le nom d’hôte du serveur, dans notre exemple : mail.example.net. Le certificat sera valide 10 ans (10 x 365 jours).
Il faut veiller à placer les bonnes permissions sur le fichier :

# chmod 600 /etc/postfix/mailserver.pem

Postfix

On ajoute les bonnes directives au main.conf de Postfix, par exemple en fin de fichier :

smtpd_tls_key_file = /etc/postfix/mailserver.pem
smtpd_tls_cert_file = /etc/postfix/mailserver.pem
smtpd_tls_security_level = encrypt
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
smtp_tls_loglevel = 3

Redémarrage de Postfix :

# postfix reload

Tout est en place, le serveur SMTP devrait pouvoir instantier une connexion TLS maintenant, essayons en telnet, si une nouvelle ligne STARTTLS apparait et que le serveur répond correctement, c’est tout bon :

$ telnet mail.example.net 25
Trying 91.127.162.55...
Connected to mail.example.net.
Escape character is '^]'.
220 mail.example.net ESMTP Postfix
EHLO localhost
250-mail.example.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

STARTTLS est bien présent, on tape la commande STARTTLS :

STARTTLS
220 2.0.0 Ready to start TLS

La serveur dit qu’il est pret, sinon revoir ses certificats, les chemins et les bonne options dans main.cf. Cependant il reste un petit problème de sécurité, il faut que l’authentification SMTP AUTH PLAIN ne soit disponible que lorsque l’utilisateur utilise TLS. Ainsi Postfix va effectuer le SMTP AUTH uniquement après que la couche soit TLS soit établie. Pour ce faire il suffit de rajouter cette ligne au main.cf :

smtpd_tls_auth_only = yes

On redémarre Postfix :

# postfix reload

On re-telnet :

$ telnet mail.example.net 25
Trying 91.127.162.55...
Connected to mail.example.net.
Escape character is '^]'.
220 mail.example.net ESMTP Postfix
EHLO localhost
250-mail.example.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

On voit que maintenant SMTP AUTH ne sera disponible qu’après avoir établit la liaison TLS (les lignes AUTH ne sont plus visibles à ce niveau).

Dovecot SSL

Au tour de Dovecot de passer en SSL. C’est très simple, nous allons utiliser le même certificat que pour Postfix. On ajoute les lignes suivantes au fichier dovecot.conf :

protocols = imap imaps
ssl_disable = no
# ssl = yes pour les versions supérieures à v1.2.beta1
ssl_cert_file = /etc/postfix/ssl/postfix.pem
ssl_key_file = /etc/postfix/ssl/postfix.pem
verbose_ssl = yes

Un petit rappel sur les permissions du certificat qui ne doit etre accessible que par l’utilisateur root : root:root 0444. Autre petit point qui a son importance, on refuse désormais les connexions LOGIN à moins que TLS/SSL soit établi. Pour ce faire, on modifie cette ligne :

disable_plaintext_auth = yes

On re-démarre le serveur IMAP :

# service dovecot restart

On peut le tester :

$ openssl s_client -connect mail.example.net:imaps
CONNECTED(00000003)
depth=0 /C=IT/ST=Lazio/L=Roma/O=example.net/OU=mailserver/CN=mail.example.net/emailAddress=fabien@feub.net
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=IT/ST=Lazio/L=Roma/O=example.net/OU=mailserver/CN=mail.example.net/emailAddress=fabien@feub.net
verify return:1
---
Certificate chain
 0 s:/C=IT/ST=Lazio/L=Roma/O=example.net/OU=mailserver/CN=mail.example.net/emailAddress=fabien@feub.net
   i:/C=IT/ST=Lazio/L=Roma/O=example.net/OU=mailserver/CN=mail.example.net/emailAddress=fabien@feub.net
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDojCCAwugAwIBAgIJAKn3cs1HiGLvMA0GCSqGSIb3DQEBBQUAMIGTMQswCQYD
VQQGEwJJVDEOMAwGA1UECBMFTGF6aW8xDTALBgNVBAcTBFJvbWExFzAVBgNVBAoT
DmZhYmllbmFtYW5uLmV1MRMwEQYDVQQLEwptYWlsc2VydmVyMRwwGgYDVQQDExNt
YWlsLmZhYmllbmFtYW5uLmV1MRkwFwYJKoZIhvcNAQkBFgpfQGZldWIubmV0MB4X
DTExMDgwNDEzNTY1OFoXDTIxMDgwMTEzNTY1OFowgZMxCzAJBgNVBAYTAklUMQ4w
DAYDVQQIEwVMYXppbzENMAsGA1UEBxMEUm9tYTEXMBUGA1URChMOZmFiaWVuYW1h
bm4uZXUxEzARBgNVBAsTCm1haWxzZXJ2ZXIxHDAaBgNVBAMTE21haWwuZmFiaWVu
YW1hbm4uZXUxGTAXBgkqhkiG9w0BCQEWCmZAZmV1Yi5uZXQwgZ8wDQYJKoZIhvcN
AQEBBQADgY0AMIGJAoGBAO5esAspC+j2yVIPRsSQ6aUsbR+8iS/u5H4LgwL8OQd5
799lXzG9hWmn0uMR+6SutjgDFbDL+w+zdXzGZ2UQi6OjKjKo+L/pwEkdokRRIpNw
mhyIum+F+7XcfP1KHdVQu85cDphd+rhPDkDtYNUMD8Nd8ClmaftTeVVaV5T1MEGt
AgMBAAGjgfswfafaHQYDVR0OBBYEFKCxvAc+P1gk+ILQWc3NXvdxNxYRMIHIBgNV
HSMEgcAwgb2AFKCxvAc+P1gk+ILQWc3nXvdxNxYRoYGZpIGWMIGTMQswCQYDVQQG
EwJJVDEOMAwGA1UECBMFTGF6aW8xDTALBgNVBAcTBFJvbWEXFzAVBgNVBAoTDmZh
YmllbmFtYW5uLmV1MRMwEQYDVQQLEwptYWlsc2VydmVyMRwwGgYDVQQDExNtYWls
LmZhYmllkikiFtYW5uLmV1MRkwFwYJKoZIhvcNAQkBFgpmQGZldWIuV0ggkAqfdy
zUeIYu8wDAYDVR0TBAUwAwEB/zANBgkqhdiG9w0BAQUFAAOBgQAyESbxZh8WID39
Qwr/NjotqatAsKqGXCIuW5WROo+7ZVvmPoVx/OLvnYQnF5DzCnMF/9E7kuiW2feg
BmQPYT5UXU5cH2R5fBkT/bnIgPTEr33L75RFDWiKE4vKzvtTDneUIWxXxw+goGOz
SK3TyKQawclFSbVC9nvBixw5+4hbfg==
-----END CERTIFICATE-----
subject=/C=IT/ST=Lazio/L=Roma/O=example.net/OU=mailserver/CN=mail.example.net/emailAddress=fabien@feub.net
issuer=/C=IT/ST=Lazio/L=Roma/O=example.net/OU=mailserver/CN=mail.example.net/emailAddress=fabien@feub.net
---
No client certificate CA names sent
---
SSL handshake has read 1505 bytes and written 319 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: 7A7619EB698CEF9463774C06E6729F0A2CE9D9E551DD96439C00D7BA3001641D1
    Session-ID-ctx: 
    Master-Key: 89E6DA90F03046C65F4C330A9D24209D3260A4DE134EC4287D6516B344AFBE80BCAE0FDCE037177B384E2F166C17CBCE
    Key-Arg   : None
    Krb5 Principal: None
    Start Time: 1312960774
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
* OK Dovecot ready.

Le serveur de messagerie est maintenant plus sécurisé avec cette couche TLS/SSL qui crypte les communications et authentifie l’identité du serveur. L’utilisation d’un cryptage à clé publique permet au client de vérifier que le serveur possède un certificat valide et ainsi ce client sait pour des utilisations ultérieures qu’il peut faire confiance à ce serveur. L’utilisateur qui se connecte est également vérifié dans ce processus.

11 thoughts on “Ajouter le support TLS à Postfix et Dovecot”

  1. Merci d’abord pour cet article, je retrouve un souci quand je lance la commande :
    openssl s_client -connect mail.abbassitapis.ma:imaps

    Voilà le message d’erreur :
    * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.

  2. bonjour
    j’ai suivi votre tuto, je suis sur archlinux
    mais la commande : openssl s_client -connect mail.xxxx.com:imaps
    me renvoie

    CONNECTED(00000003)
    write:errno=104

    no peer certificate available

    No client certificate CA names sent

    SSL handshake has read 0 bytes and written 176 bytes
    Verification: OK

    New, (NONE), Cipher is (NONE)
    Secure Renegotiation IS NOT supported
    Compression: NONE
    Expansion: NONE
    No ALPN negotiated
    SSL-Session:
    Protocol : TLSv1.2
    Cipher : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1516285709
    Timeout : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no

    1. Hello noog,
      C’est un ancien article, cela fait longtemps que je n’ai pas touché à ce sujet là. Les messages no peer certificate available et No client certificate CA names sent ont l’air de dire qu’il ne trouve pas les certificats, donc vérifier les chemins ou les droits sur les certs.

Laisser un commentaire

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