Perfect Forward Secrecy pour Apache

Lors de l’utilisation d’un protocole comme SSL/TLS pour le chiffrement et la sécurisation des données sur des réseaux non sûrs, il est important de garantir la confidentialité totale des communications, même en cas de capture du trafic chiffré.

TLS n’est en effet pas un protocole unique, mais une multitude de briques permettant la sécurisation des échanges, grâce à :

  • L’authentification du serveur (et optionnellement du client). On utilise en général un certificat x509v3 délivré par une autorité de certification.
  • La confidentialité des données, en utilisant les suites de chiffrement disponibles dans les CipherSpecs.
  • L’intégrité des donnés, en utilisant des fonctions de hachage disponibles dans les CipherSpecs.

Un des problèmes de TLS est que pour que cela fonctionne, il faut bien un clé master symétrique définie dans l’étape client key exchange. Heureusement, celle-ci est chiffrée par la clé publique du certificat serveur, empêchant sa lecture par un tiers autre que le serveur.

Un des problèmes est que si l’on récupère la clé master et la clé privée du serveur, même à postériori, il est techniquement possible (même si cela n’est pas à la porté de quiconque !) de déchiffrer l’ensemble d’une capture du trafic par exemple. On perd ainsi la confidentialité des données transmises, ce qui n’est pas acceptable pour un protocole de sécurisation de données. Quand on connait les impacts potentiels de la faille HeartBleed, on se rend compte que l’obtention de la clé privée est possible (même si encore une fois, cela reste une attaque très complexe et non garantie, cela reste possible et envisageable).

Afin d’éviter cela, nous allons utiliser la propriété Perfect Forward Secrecy, qui va faire appel à des suites de chiffrement basées sur les échanges de clé DH (au lieu de RSA) qui ne sont pas faillibles (en théorie) à ce principe, car les clés échangées sont éphémères et signées. Cette propriété permet d’éviter le déchiffrement à postériori d’une capture, même en possession de la clé privée du serveur. Attention, ceci est vrai si le groupe DH est suffisamment grand et valide, et uniquement sur des communications antérieures à l’obtention de la clé privée.

Il est possible de renforcer ce mécanisme de Perfect Forward Secrecy en utilisant la cryptographie basée sur des courbes elliptiques (ECDHE pour l’échange de clés éphémères, et ECDSA pour l’authentification du serveur), réputée plus sûre que la cryptographie par factorisation.

Par exemple, sur le logiciel Apache, on peut utiliser les CipherSuites suivantes pour renforcer la sécurité de nos échanges basés sur TLS :

# Activation du mod_ssl dans Apache
SSLEngine on

# On désactive SSLv2 et SSLv3 pour n'utiliser que TLS v1.x
SSLProtocol all -SSLv2 -SSLv3

# Au lieu de préférer les suites du client (mécanisme par défaut), on privilégie les suites proposées par le serveur
SSLHonorCipherOrder on

# On propose les suites avec ECDHE, ECDSA uniquement pour PFS
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"
 
# On autorise les clients non compatibles SNI à accéder à ce vhost
SSLStrictSNIVHostCheck on

# Certificat, clé et chîne de certification
SSLCertificateFile      /etc/ssl/certs/cert_beufa.net.cert
SSLCertificateKeyFile   /etc/ssl/private/cert_beufa.net.key
SSLCertificateChainFile /etc/ssl/certs/CAcert_chain.pem

Ces options sont bien sûr à activer avec précaution en cas de forte charge sur vos serveurs Apache. En effet, la baisse de performances liées à l’usage de la propriété Perfect Forward Secrecy entraîne des baisses de performances importantes, de l’ordre de 15% à 20% en fonction de la longueur des clés et CipherSpecs utilisés.