En tant qu’administrateur système, je gère de nombreux serveurs web, mail etc. Je dois les garder à jour aussi bien en terme de sécurité que sur les avancées technologiques.
Une des dernières tâches à laquelle je me suis attelé dans ce domaine est la configuration correcte de SSL/TLS sur chacun des services que j’héberge (pour ceux qui savent utiliser SSL/TLS)
J’ai donc créé des certificats pour chaque serveur ou service, et j’ai décidé de faire une petite documentation en français et en anglais expliquant comment cela fonctionne, à destination de mes amis et collègues geeks.
Il y a un certain nombre d’étapes à passer pour obtenir une configuration SSL/TLS correcte.
Dans cette documentation, je vous expliquerais comment configurer postfix, courier (pop et imap), ejabberd et apache en mode sécurisé SSL/TLS avec un certificat distribué par CACert.
La génération du certificat n’est pas abordée dans cette documentation. Pour cela, rendez-vous dans la page expliquant comment générer un certificat serveur avec CaCert
Configuration de SSL/TLS pour chacun des services
Pour configurer SSL/TLS pour votre serveur, vous devez comprendre que le certificat est échangé avec d’autres machines, ces autres machines pouvant être d’autres serveurs de mail (pour SMTP avec TLS ou Jabber avec des connexions S2S chiffrées) ou des clients (de mail pop/imap ou https utilisant SSL/TLS). Lorsque le client se connecte à votre serveur, il utilise un nom d’hôte FQDN, et ce nom d’hôte DOIT correspondre au champ CN de votre certificat.
Configuration des DNS, Reverse et MX
Les DNS et DNS inverse de votre MX doivent être correctement configurés (ca n’a pas de rapport direct avec tls cela dit…)
Bien que cela n’ai pas de rapport particulier avec SSL/TLS, vous devez être conscient que votre serveur DNS, MX et DNS inverse doivent être configurés proprement lorsque vous souhaitez héberger un serveur MX : Si vous envoyez des mails vers Internet, votre configuration doit être parfaite si vous ne voulez pas être considéré comme un spammeur. Par exemple, si oberon.example.com, ayant l’adresse IP 192.0.2.1, est le MX du domaine example.com, vous devez avoir ceci dans votre configuration DNS :
- oberon.example.net le champ DNS A doit être 192.0.2.1
- example.com le champ DNS MX doit être oberon.example.net.
- 1.2.0.192.in-addr.arpa Le champs DNS PTR doit être oberon.example.net.
- oberon.example.net Le serveur SMTP doit répondre avec un SMTP EHLO (ou HELO) : oberon.example.net
Si l’un ou l’autre de ces points n’est pas correct, vous serez probablement considéré comme un spammeur lorsque vous enverrez du mail vers d’autres domaines. Faites attention aussi lors de l’utilisation de serveur MX ou DNS secondaires : ils doivent répondre aux mêmes exigences …
SMTP/SMTPD de Postfix : Le champ MX doit correspondre au nom CN du certificat
SSL/TLS sur un serveur SMTP peut s’utiliser de 3 manières différentes :
- Un serveur SMTPD recevant du mail en tant que MX (Mail eXchanger) pour un domaine
- Un serveur SMTPD recevant du mail destiné à être relayé comme serveur relai pour des clients (comme le logiciel Thunderbird)
- Un client SMTP qui envoie du mail au MX d’autres domaines
Dans les 3 cas ci-dessus, les configuration du MX, des serveurs DNS et des champs CN des certificats doivent utiliser le même nom d’hôte FQDN, de telle sorte que les clients SMTP ou serveurs SMTPD qui vous parlerons ne seront pas perturbés par une configutration TLS bancale.
Voici un exemple sous forme d’extraits de configuration DNS (bind9) et SMTPD (main.cf postfix) qui vous montre comment réaliser ceci :
DNS: /etc/bind/primary/serverside.fr IN MX 5 secure.example.com. DNS: /etc/bind/primary/metaconsult.fr alice IN A 80.67.165.6 DNS: /etc/bind/primary/80.67.165.0 6 IN PTR secure.example.com. SMTP: /etc/postfix/master.cf smtp inet n - - - 20 smtpd smtps inet n - - - 20 smtpd -o smtpd_tls_wrappermode=yes submission inet n - - - 20 smtpd smtp unix - - - - 20 smtp SMTP: /etc/postfix/main.cf myhostname = secure.example.com myorigin = secure.example.com # TLS Configuration for SMTPD server : # Configuration TLS pour le serveur smtp : smtpd_use_tls = yes smtpd_tls_dcert_file = /etc/ssl/private/secure.example.com.key+crt+chain smtpd_tls_dkey_file = $smtpd_tls_dcert_file smtpd_tls_CAfile = /etc/ssl/certs/ca-certificates.crt smtpd_tls_key_file = $smtpd_tls_dcert_file smtpd_tls_cert_file = $smtpd_tls_dcert_file smtpd_tls_loglevel = 0 smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s tls_random_source = dev:/dev/urandom # Configuration TLS pour le client smtp smtp_use_tls = yes smtp_tls_dcert_file = $smtpd_tls_dcert_file smtp_tls_dkey_file = $smtpd_tls_dcert_file smtp_tls_CApath = $smtpd_tls_CApath smtp_tls_CAfile = $smtpd_tls_CAfile
X509 : Résultat de la commande openssl x509 -in /etc/postfix/secure.example.com.pem -text :
# Note : Ne pas oublier de renouveler ce certificat AVANT Le 17 Aout 2009 :) Validity Not Before: Aug 18 17:43:11 2007 GMT Not After : Aug 17 17:43:11 2009 GMT Subject: CN=secure.example.com
Attention : il faut recopier les fichiers de /etc/ssl vers /var/spool/postfix/etc/ssl/ (par exemple via rsync /etc/ssl /var/spool/postfix/etc/ -a —delete) et redémarrer postfix après avoir modifié sa configuration pour que celle-ci fonctionne, postfix utilisant un Chroot dans /var/spool/postfix !
JABBER : Les champs A ou SRV doivent correspondre au nom CN du certificat
Lorsque vous utilisez SSL/TLS sur votre serveur jabber, vos clients et les autres serveurs utiliseront probablement le DNS pour trouver quelle est l’adresse de votre serveur jabber. Si nous reprenons l’exemple du serveur example.com, ayant pour serveur jabber jabber.example.net, votre zone DNS devra ressembler à quelque chose comme cela (zone Bind) :
$ORIGIN example.com. _jabber._tcp IN SRV 5 0 5269 jabber.example.net. _xmpp-server IN SRV 5 0 5269 jabber.example.net. _xmpp-client._tcp IN SRV 5 0 5222 jabber.example.net. $ORIGIN example.net. jabber IN A 192.0.2.12 Le certificat du serveur jabber.example.net DOIT donc avoir jabber.example.com comme champ CN. Voici un extrait de configuration pour ejabberd : EJABBERD: extrait de la configuration /etc/ejabberd/ejabberd.cfg : {listen, [{5222, ejabberd_c2s, [{ip, {192, 168, 1, 12}}, {access, c2s}, starttls, {certfile, "/etc/ejabberd/jabber.example.net.pem"}, {shaper, c2s_shaper}]}, {5223, ejabberd_c2s, [{ip, {192, 168, 1, 12}}, {access, c2s}, tls, {certfile, "/etc/ejabberd/jabber.example.net.pem"}, {shaper, c2s_shaper}]}, X509: Résultat de la commande openssl x509 -in /etc/ejabberd/jabber.example.net.pem -text : # Note : Ne pas oublier de renouveler ce certificat AVANT Le 17 Aout 2009 :) Validity Not Before: Aug 18 19:22:11 2007 GMT Not After : Aug 17 19:22:11 2009 GMT Subject: CN=jabber.example.net
APACHE : les Vhost HTTPS doivent correspondre au nom CN du certificat
Si vous utilisez apache-ssl, le champ CN de votre certificat DOIT correspondre au nom de votre domaine ou sous-domaine. Voici un exemple pour le domaine secure.example.com :
APACHE-SSL: Extrait de la configuration /etc/apache-ssl/httpd.conf : Listen 192.0.2.13:443 LoadModule apache_ssl_module /usr/lib/apache/1.3/libssl.so SSLCacheServerPath /usr/lib/apache-ssl/gcache SSLCacheServerPort /var/run/gcache_port SSLSessionCacheTimeout 15 # Ces lignes sont utiles si vous voulez utiliser l'authentification du certificat client : SSLCACertificatePath /etc/ssl/certs SSLVerifyClient 0 SSLVerifyDepth 10 SSLFakeBasicAuth # <VirtualHost 192.0.2.13:443> SSLCertificateFile /etc/ssl/private/secure.example.com.crt SSLCACertificateFile /etc/ssl/private/secure.example.com.chain.crt SSLCertificateKeyFile /etc/ssl/private/secure.example.com.key SSLCaCertificatePath /etc/ssl/certs SSLEnable DocumentRoot /var/www/ssl/ </VirtualHost> X509: Résultat de la commande openssl x509 -in /etc/ssl/private/secure.example.com.crt -text : # Note : Ne pas oublier de renouveler ce certificat AVANT Le 17 Aout 2009 :) Validity Not Before: Aug 18 19:32:34 2007 GMT Not After : Aug 17 19:32:43 2009 GMT Subject: CN=secure.example.com
COURIER : IMAP et POP Configuration SSL/TLS
Dans vos fichier /etc/courier/imapd-ssl et pop3d-ssl, vous devrez avoir la ligne suivante :
TLS_CERTFILE=/etc/ssl/private/secure.example.com.key+crt+chain
CYRUS : IMAP et POP Configuration SSL/TLS
pour Cyrus imap, vous devez modifier votre /etc/imapd.conf pour lui dire où il trouvera votre certificat, clé privé et chaine :
tls_cert_file: /etc/ssl/private/star.fdn.fr.crt tls_key_file: /etc/ssl/private/star.fdn.fr.key tls_ca_file: /etc/ssl/private/star.fdn.fr.chain tls_cipher_list: TLSv1+HIGH:!aNULL:@STRENGTH tls_session_timeout: 1440
et dans votre /etc/cyrus.conf, dans le bloc SERVICES vous devez avoir quelque chose comme :
imap cmd="imapd -U 30" listen="imap" prefork=0 maxchild=100 imaps cmd="imapd -s -U 30" listen="imaps" prefork=0 maxchild=100 pop3 cmd="pop3d -U 30" listen="pop3" prefork=0 maxchild=50 pop3s cmd="pop3d -s -U 30" listen="pop3s" prefork=0 maxchild=50
et redémarrez Cyrus
PROFTPD, Configuration
Pour configurer Proftpd pour utiliser SSL/TLS, il faut activer le module TLS dans /etc/proftpd/modules.conf avec
LoadModule mod_tls.c
Puis dans proftpd.conf mettre un bloc ainsi :
<IfModule mod_tls.c> TLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol SSLv23 TLSOptions NoCertRequest TLSCertificateChainFile /etc/ssl/private/secure.example.com.chain TLSRSACertificateFile /etc/ssl/private/secure.example.com.crt TLSRSACertificateKeyFile /etc/ssl/private/secure.example.com.key TLSVerifyClient off TLSRequired off </IfModule>
VERIFIER sa configuration TLS
pour vérifier sa configuration SSL/TLS, je vous propose un petit script nommé sslcheck. Ce script se connecte à une machine dont le nom DNS est passé en paramètre et vérifie si le certificat et sa chaîne sont bon
Accédez à la dernière version de sslcheck (20120106) ici :
sslcheck est distribué sous licence CC0