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.
Super article :)
Merci ;>
très bien…
IL manque juste
à décommenter
tlsmgr unix – – n 1000? 1 tlsmgr
dans /etc/postfix/master.cf
Merci pour le tuto, j’ai bien compris comment vérifier ma configuration et si elle était vraiment sécurisée
Bon tuto !!
Merci William!
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.
Hello Oussama, ce n’est pas un message d’erreur, il te dit au contraire que ton serveur IMAP est prêt à l’emploi.
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
—
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.