Postfix et TLS

Billet posté le 6 janv. 2016

Postfix et TLS

Merci au blog de [http://www.bortzmeyer.org/](Stéphane Bortzmeyer) qui m’avait aidé à l’époque lors de la mise en place. Il est donc tout à fait normal de citer ma source : http://www.bortzmeyer.org/postfix-tls.html

Je possède un serveur Debian avec un service postfix installé dessus. Jusque là tout est normal. Il se trouve que j’avais envie de mettre en place un peu plus de confidentialité. C’est précisément dans ce contexte que l’on peut déployer du TLS.

Par défaut la configuration de postfix installée avec Debian active plus ou moins TLS. Nous allons donc creuser un petit peu cette configuration afin que notre serveur SMTP soit capable de discuter en TLS avec d’autres serveurs SMTP.

Le fichier de configuration de postfix qui nous intéresse est le fichier /etc/postfix/main.cf. Avant toute manipulation nous allons en effectuer une sauvegarde :

cp /etc/postfix/main.cf /etc/postfix/main.cf.$(date "+%Y%m%d")

La partie TLS est la suivante :

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

Dit autrement on y voit l’utilisation du certificat, de la clé privée, nous activons TLS, puis les caches des sessions smtp et smtpd sont stockés dans des dossiers.

Je vous propose d’utiliser l’autorité de certification let’s encrypt afin d’avoir un joli certificat.

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt/

Puis nous allons générer un nouveau certificat (hostname -f correspond au nom pleinement qualifié de votre serveur et est utilisé ici pour faire du générique, donc à remplacer quand c’est nécessaire) :

./letsencrypt-auto certonly --standalone -d $(hostname -f)

Cela nous donne donc dans le dossier /etc/letsencrypt/live/$(hostname -f) plusieurs fichiers dont :

  • cert.pem qui est le certificat
  • privkey.pem qui est la clé privée

A ce moment là nous allons créer un nouveau dossier pour postfix :

mkdir /etc/postfix/ssl

Puis enfin copier les fichiers précédents :

cp /etc/letsencrypt/live/$(hostname -f)/cert.pem /etc/postfix/ssl/$(hostname -f).pem
cp /etc/letsencrypt/live/$(hostname -f/privkey.pem /etc/postfix/ssl/$(hostname -f).key

Ainsi nous pouvons mettre à jour le fichier /etc/postfix/main.cf afin qu’il prenne en compte le nouveau certificat ainsi que la clé privée associée :

smtpd_tls_cert_file=/etc/postfix/ssl/$(hostname -f).pem
smtpd_tls_key_file=/etc/postfix/ssl/$(hostname -f).key

Il est possible de faire mieux en configuration par exemple en ajoutant ceci :

# TLS non obligatoire, a la demande du client
smtpd_tls_security_level = may
smtpd_tls_auth_only = no
# Enregistrer dans un en-tete Received
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1
# Divers
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Ce qu m’intéresse dans le bloc de configuration précédent c’est de pouvoir dire au client SMTP que TLS n’est pas obligatoire mais que s’il sait le faire autant y aller. On ajoute des enregistrements dans les headers afin de garder une trace de la discussion TLS ainsi que dans les fichiers de log.

Il faut à présent redémarrer le service postfix :

service postfix restart

Extrait du fichier /var/log/mail.log :

Jan  6 11:22:58 vps-low postfix/smtpd[23672]: connect from mail-yk0-x232.google.com[2607:f8b0:4002:c07::232]
Jan  6 11:22:58 vps-low postfix/smtpd[23672]: Anonymous TLS connection established from mail-yk0-x232.google.com[2607:f8b0:4002:c07::232]: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)

Dans les headers du mail nous pouvons retrouver l’information suivante :

Received: from mail-yk0-x232.google.com (mail-yk0-x232.google.com [IPv6:2607:f8b0:4002:c07::232])
	(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
	(No client certificate requested)
	by vps-low.lovetux.net (Postfix) with ESMTPS id 9676C292A3
	for <hindy@lovetux.net>; Wed,  6 Jan 2016 11:22:58 +0100 (CET)

Pour un peu plus de détails sur let’s encrypt je vous invite à voir ce billet.

Monitorer avec Nagios l’expiration du certificat

J’utilise Nagios pour monitorer tout un tas de service. Nous allons définir une nouvelle commande nagios qui permet de vérifier l’expiration du certificat, et l’appliquer à notre serveur.

La commande :

# 'check_smtp_ssl' command definition
define command{
        command_name    check_smtp_ssl
        command_line    /usr/lib/nagios/plugins/check_smtp -H '$HOSTADDRESS$' -S -D '$ARG1$','$ARG2$'
}

Appliquer cette commande sur un serveur :

define service{
        use                             generic-service
        host_name                       vps-low.lovetux.net
        service_description             SSL SMTP
        check_command                   check_smtp_ssl!5!3
}