Perfect Forward Secrecy pour Postfix/Dovecot

Après mon article sur PFS pour Apache, j’ai mis également en place PFS sur mon serveur de messagerie Postfix/Dovecot, le client K9-Mail pour Android supportant désormais des versions plus récentes de TLS, TLSv1.1 et v1.2.

Voici ici quelques éléments pour réaliser cette configuration et augmenter la sécurisation des flux chiffrés.

Postfix

Tout d’abord, pour utiliser TLS avec les propriétés PFS sous Postfix, il faut générer les clés DH. Cette opération peut être réalisée par crontab pour améliorer encore la sécurité des communications TLS. Il est également possible de générer un DH à 2048 bits.

openssl gendh -out /etc/postfix/dh_512.pem -2 512
openssl gendh -out /etc/postfix/dh_1024.pem -2 1024

Une fois les clés générées, il faut modifier le fichier de configuration main.cf de Postfix :

# Clés DH
smtpd_tls_dh1024_param_file = /etc/postfix/dh_1024.pem
smtpd_tls_dh512_param_file = /etc/postfix/dh_512.pem
# Activation d'ECDH
smtpd_tls_eecdh_grade = strong
# Désactivation de SSLv2
smtpd_tls_protocols= !SSLv2
smtpd_tls_mandatory_protocols= !SSLv2
# Activation de la cipher list tls_high_cipherlist
# (default: ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH)
smtpd_tls_mandatory_ciphers = high
#smtpd_tls_ciphers = high
# Forcer la sélection / choix de la cipher list côté serveur (côté client par défaut)
tls_preempt_cipherlist = yes
# Suppression des cipher non souhaités
smtpd_tls_mandatory_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULL
# Activation du log cipher pour les connexions entrantes
smtpd_tls_loglevel = 1
# Activation du log cipher pour les connexions sortantes
smtp_tls_loglevel = 1

Un redémarrage de Postfix permettra de constater des logs comme celui ci (Merci Google et Amazon AWS  ;), indiquant l’utilisation du chiffrement par courbes elliptiques et des propriétés cipher lists forcées.

postfix/smtpd[26611]: connect from mail-wg0-x238.google.com[2a00:1450:400c:c00::238]
postfix/smtpd[26611]: setting up TLS connection from mail-wg0-x238.google.com[2a00:1450:400c:c00::238]
postfix/smtpd[26611]: Anonymous TLS connection established from mail-wg0-x238.google.com[2a00:1450:400c:c00::238]: TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)

postfix/smtpd[28846]: connect from a0-41.smtp-out.eu-west-1.amazonses.com[54.240.0.41]
postfix/smtpd[28846]: setting up TLS connection from a0-41.smtp-out.eu-west-1.amazonses.com[54.240.0.41]
postfix/smtpd[28846]: Anonymous TLS connection established from a0-41.smtp-out.eu-west-1.amazonses.com[54.240.0.41]: TLSv1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits)

Pour plus de détails sur Perfect Forward Secrecy et Postfix , voir le lien.

Dovecot et imapd

Pour Dovecot, seul l’IMAPS est actif dans ma solution personnelle de mails, et j’utilise dovecot 2.0

La première modification a réaliser est donc dans le fichier /etc/dovecot/conf.d/10-ssl.conf, ou on va modifier les ciphers lists :

# SSL ciphers autorisés
# DEFAULT : ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL
ssl_cipher_list = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4

# Forcer la sélection de la cipher list côté serveur (disponible uniquement dans les dernières versions de Dovecot 2.2.x)
#ssl_prefer_server_ciphers = yes

Une fois cette modification réalisée, nous allons modifier le logging pour voir apparaitre la ciphers list utilisée par le client IMAPS, en ajoutant l’option %k, dans le fichier /etc/dovecot/conf.d/10-logging.conf :

# Space-separated list of elements we want to log. The elements which have
# a non-empty variable value are joined together to form a comma-separated
# string.
#login_log_format_elements = user=<%u> method=%m rip=%r lip=%l mpid=%e %c
login_log_format_elements = "user=<%u> method=%m rip=%r lip=%l mpid=%e %c %k"

Un redémarrage de Dovecot devrait suffire à produire à la prochaine connexion d’un client le log au format suivant :

dovecot: imap-login: Login: user=<user@domain.net>, method=PLAIN, rip=2001:41d0:8:dead::beef, lip=2001:41d0:8::ac1d, mpid=15748, TLS, TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)