SMTP et SMTPD over TLS avec Postfix

par julien, oct. 2007

L'une des faiblesses du protocole SMTP est la transmission des emails complètement en clair. De nombreuses “rustines” ont vus le jour au fil des ans, essayant tant bien que mal de sécuriser ce protocole. L'une des plus efficaces est l'utilisation du protocole de cryptographie TLS en dessous de SMTP.

Les principes de fonctionnement de TLS sont détaillés dans le dossier “SSL et les PKI : les bases”.

Ici, nous allons avoir besoin d'un certificat serveur (dont le CN correspond a la valeur $myhostname de postfix), de la clé associée et du certificat public de l'autorité qui les a délivré. Avec ces 3 fichiers, nous pouvons activer le mode STARTTLS de Postfix, tel qu'il est défini dans la RFC 3207.

Postfix::main.cf

La configuration du mode STARTTLS se fait dans le fichier /etc/postfix/main.cf très simplement. Il suffit de rajouter les options suivantes :

# TLS server options
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/certs/smtp.key
smtpd_tls_cert_file = /etc/postfix/certs/smtp.pem
smtpd_tls_CAfile = /etc/postfix/certs/ca.crt
smtpd_tls_loglevel = 2
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache
tls_random_source = dev:/dev/urandom
smtpd_tls_ask_ccert = yes
smtpd_tls_req_ccert = no
smtpd_tls_mandatory_protocols = !SSLv2 
smtpd_tls_mandatory_ciphers = high
smtpd_tls_mandatory_exclude_ciphers = aNULL, MD5

# TLS client options
smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtp_tls_loglevel = 1

La partie TLS SERVER OPTIONS definit la maniere dont postfix va reagir lorsqu'un client veut lui envoyer un message. La partie TLS CLIENT OPTIONS definit la maniere dont postfix va agir lorsqu'il se connecte a un autre serveur mail.

les options de la partie serveur sont :

  • smtpd_tls_security_level = may : rend le mode STARTTLS pour SMTPD disponible mais non obligatoire.
  • smtpd_tls_auth_only : affiche la methode auth uniquement lorsque STARTTLS est active. on ne fait pas passer d'information d'authentification dans un canal non securise.
  • loglevel = 1 permet de conserver l'établissement des connections TLS dans syslog
  • session cache : definit la duree du cache de session SSL (pour ne pas renegocier les cles de sessions en permanence) et l'endroit ou ce dernier est stocke. Si le fichier n'existe pas, il est cree.
  • random source definit le device a utilise pour generer du pseudo random
  • ccert: il s'agit du certificat client. ces deux parametres permettent d'abord de demander un certificat client et ensuite de preciser que ce dernier n'est pas obligatoire.
  • tls_mandatory: définit les contraintes posées sur STARTTLS. Tout d'abord on ne veux pas de SSLv2, qui est cassé, puis on précise que les algos autorisés sont dans la liste “high” de OpenSSL mais on enlève le chiffrement NULL et le hash MD5.

Dans la partie client:

  • starttls_offer propose a un serveur distant d'utiliser TLS, meme si ce dernier ne le presente pas forcement.
  • ensuite, on precise le niveau de log

Dans la partie client, on ne precise pas de certificat. Il est possible d'en presenter un, mais cela peut poser des problemes de compatibilite avec certains serveurs mails distants, ce n'est donc pas recommander par la doc officielle.

Enfin, vérifier que les droits sur les certificats serveur sont bons et pas trop permissifs (600 sur la clé par exemple).

Tester l'extension

Facile ! Il suffit de se connecter en ligne de commande sur le port 25 et de demander le chargement du mode TLS :

$ nc 192.168.0.20 25
220 smtp.linuxwall.info
EHLO MAIL
250-machin.linuxwall.info
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
STARTTLS
220 2.0.0 Ready to start TLS
quit

Et hop ! le mode TLS est chargé. Pensez à jeter un coup d'oeil dans les logs, c'est toujours intéressant.

Cote client, avec thunderbird par exemple, vous pouvez preciser que votre serveur SMTP utilise TLS (et pas SSL) et dans les logs du serveur, lorsque vous envoyez un mail, vous verrez ceci :

Dec 21 14:07:29 zerhuel postfix/smtpd[5390]: initializing the server-side TLS engine               
Dec 21 14:07:29 zerhuel postfix/tlsmgr[5391]: open smtpd TLS cache btree:/var/lib/postfix/smtpd_tls_session_cache                                                                                     
Dec 21 14:07:29 zerhuel postfix/tlsmgr[5391]: tlsmgr_cache_run_event: start TLS smtpd session cache cleanup                                                                                           
Dec 21 14:07:30 zerhuel postfix/smtpd[5390]: connect from unknown[192.168.1.20]                    
Dec 21 14:07:30 zerhuel postfix/smtpd[5390]: setting up TLS connection from unknown[192.168.1.20]  
Dec 21 14:07:30 zerhuel postfix/smtpd[5390]: unknown[192.168.1.20]: TLS cipher list "ALL:+RC4:@STRENGTH:!aNULL"                                                                                       
Dec 21 14:07:30 zerhuel postfix/smtpd[5390]: SSL_accept:before/accept initialization               
Dec 21 14:07:30 zerhuel postfix/smtpd[5390]: SSL_accept:SSLv3 read client hello B                  
Dec 21 14:07:30 zerhuel postfix/smtpd[5390]: SSL_accept:SSLv3 write server hello A                 
Dec 21 14:07:30 zerhuel postfix/smtpd[5390]: SSL_accept:SSLv3 write certificate A                  
Dec 21 14:07:30 zerhuel postfix/smtpd[5390]: SSL_accept:SSLv3 write key exchange A                 
Dec 21 14:07:30 zerhuel postfix/smtpd[5390]: SSL_accept:SSLv3 write certificate request A          
Dec 21 14:07:30 zerhuel postfix/smtpd[5390]: SSL_accept:SSLv3 flush data                           
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: unknown[192.168.1.20]: certificate verification depth=1 verify=1 subject=/C=FR/ST=France/L=Paris/O=Linuxwall/CN=Linuxwall Certificate Authority Root Certificate/emailAddress=root@linuxwall.info                                                           
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: unknown[192.168.1.20]: certificate verification depth=0 verify=1 subject=/C=FR/ST=France/O=Linuxwall/CN=Julien Vehent                                    
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: SSL_accept:SSLv3 read client certificate A            
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: SSL_accept:SSLv3 read client key exchange A           
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: SSL_accept:SSLv3 read certificate verify A            
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: SSL_accept:SSLv3 read finished A                      
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: SSL_accept:SSLv3 write change cipher spec A           
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: SSL_accept:SSLv3 write finished A                     
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: SSL_accept:SSLv3 flush data                           
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: unknown[192.168.1.20]: save session 3134D5F9B0BCB48933CC926FF4772ADE15EF0B5D096AA7609BC131F5DD968AAF&s=smtp to smtpd cache                               
Dec 21 14:07:37 zerhuel postfix/tlsmgr[5391]: put smtpd session id=3134D5F9B0BCB48933CC926FF4772ADE15EF0B5D096AA7609BC131F5DD968AAF&s=smtp [data 1351 bytes]                                          
Dec 21 14:07:37 zerhuel postfix/tlsmgr[5391]: write smtpd TLS cache entry 3134D5F9B0BCB48933CC926FF4772ADE15EF0B5D096AA7609BC131F5DD968AAF&s=smtp: time=1229864857 [data 1351 bytes]                  
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: subject=/C=FR/ST=France/O=Linuxwall/CN=Julien Vehent  
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: issuer=/C=FR/ST=France/L=Paris/O=Linuxwall/CN=Linuxwall Certificate Authority Root Certificate/emailAddress=root@linuxwall.info                          
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: unknown[192.168.1.20]: Trusted: subject_CN=Julien Vehent, issuer=Linuxwall Certificate Authority Root Certificate, fingerprint=F3:69:87:C6:B9:0E:18:E0:7A:45:EA:A6:9C:7A:CE:18                                                                              
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: Trusted TLS connection established from unknown[192.168.1.20]: TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)                                       
Dec 21 14:07:37 zerhuel postfix/smtpd[5390]: B3980EB9F5: client=unknown[192.168.1.20]              
Dec 21 14:07:37 zerhuel postfix/cleanup[5417]: B3980EB9F5: message-id=<494E3DE2.2020505@linuxwall.info>                                                                                               
Dec 21 14:07:37 zerhuel postfix/qmgr[3222]: B3980EB9F5: from=<julien@linuxwall.info>, size=6044, nrcpt=1 (queue active)

Le client thunderbird et le serveur postfix communique donc bien en TLS. on voit ici tous les messages de l'echange, avec les certificats utilises.

Pour la partie serveur postfix vers autre serveur mail, on voit egalement que notre serveur essaie d'utiliser TLS :

Dec 21 14:07:43 zerhuel postfix/smtp[5442]: initializing the client-side TLS engine                
Dec 21 14:07:50 zerhuel postfix/smtp[5442]: 252D0EB9F7: to=<julien.vehent@gmail.com>, relay=smtp.sfr.fr[160.92.187.242]:25, delay=7.7, delays=0.05/0.01/0.25/7.4, dsn=2.0.0, status=sent (250 Ok: queued as DC0A6E0015BC)                                                                                
Dec 21 14:07:50 zerhuel postfix/qmgr[3222]: 252D0EB9F7: removed

mais apparemment, le relais smtp.sfr.fr (oui, je suis chez neuf/sfr) n'active pas STARTTLS~~DISCUSSION~~

fr/ressources/dossiers/postfix/smtp_tls.txt · Last modified: 2013/02/12 07:51 (external edit)
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0