Linux: Perfect Forward Secrecy einrichten und testen

1

Was ist PFS

Durch den Einsatz von PFS lässt sich eine höhere Sicherheit bei HTTPS-Übertragungengewährleisten, als ohne. Da stellt sich natürlich die Frage, warum HTTPS vorher unsicher war. Dies versteht man am besten an einem Beispiel, wie ein HTTPS-Verbindungsaufbau statt findet.

  • Client: Ruft https://blog.cscholz.io auf.
  • Server: Übermittelt dem Client einen öffentlichen Schlüssel, der von einer Zertifikatsstelle bestätigt wurde.
  • Client: Wendet sich an die Zertifizierungsstelle und prüft die Echtheit des Zertifikates. Nachdem diese bestätigt wurde, schlägt der Client dem Server ein Sitzungsschlüssel vor, welchen er mit dem öffentlichen Schlüssel verschlüsselt und zurück an den Server schickt.
  • Server: Entschlüsselt nun mit seinem privaten Schlüssel die Übertragung und verwendet den erhaltenen Sitzungsschlüssel für die weitere Übertragungen.

Schneidet jemand die verschlüsselte Übertragung mit, kann er erstmal nichts damit Anfangen, solange, bis er in der Zukunft irgendwann mal an den privaten Schlüssel des Servers kommt. Denn dann kann den Part der Übertragung entschlüsseln, in dem sich Client und Server auf den gemeinsamen Sitzungsschlüssel geeinigt haben. Und mit diesem kann anschliessend die gesamte restliche Übertragung entschlüsselt werden.

PFS verhindert diesen Ansatz, in dem mit Hilfe eines Mathematischen Ansatzes (Diffie-Hellmann Schlüsselaustausch) sich beide Parteien auf einen Sitzungsschlüssel einigen, der jedoch nie über die Leitung übertragen wurde. Somit kann man selbst dann den Datenstrom nicht entschlüsseln, wenn man den Mitschnitt sowie den privaten Schlüssel des Servers besitzt.

Erst IE Versionen größer 8 können jedoch überhaupt mit PFS umgehen.

PFS mit Apache 2.2

Im Apache 2.2 kann nur CDE (Elliptisch Kurve Algorithmus) aktiviert werden, was zwar etwas langsamer, aber dennoch sicherer ist. Um es zu aktivieren müssen der Datei /etc/Apache2/mods-available/ssl.conf nachfolgende Zeilen geämdert/hinzugefügt werden. Bitte darauf achten, dass die Parameter nicht mehrmals definiert sind, denn greift die zuletzt gesetzte Einstellung.

SSLCipherSuite HIGH:MEDIUM:!ADH

SSLProtocol all -SSLv2

Zu bedenken ist, dass die Kombination Apache 2.2 mit IE 10 nicht zur PFS-Verwendung führt, da diese Kombination erst ab Apache 2.4 funktioniert

PFS mit Apache 2.4

Ebenfalls in der Datei /etc/apache2/mods-available/ssl.conf folgende Einstellungen vornehmen:

SSLCipherSuite EECDH+AES:EDH+AES:-SHA1:EECDH+RC4:EDH+RC4:RC4-SHA:EECDH+AES256:DHE+AES256:AES256-SHA:!aNULL:!eNULL:!EXP:!LOW:!MD5

SSLHonorCipherOrder on

Apache PFS testen

Ob die PFS nun auch verwendet wird, kann man entweder über die bash oder über ein Firefox Plugin testen.

openssl s_client -cipher 'ECDHE:DH' -connect mx02.blog.cscholz.io:443

ist das Ergebnis eine Ciphersuite, welche mit DH bzw. ECDH beginnt, bietet der Server PFS an.

PFS mit Dovecot & Postfix

Für Dovecot & Postfix gibt es vom Heinlein-Support schon eine sehr umfangreiche Anleitung, weswegen ich mir hier eine erneute Ausführung spare.

Weitere Links

Nachtrag 08.07.2014

Sollte es trotz der Änderungen kein ECDH bei einer SSL-Verbindung verwendet zu werden, lohnt sich ein Blick auf die CipherSuiten des Servers:

openssl ciphers -v 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA

bzw. ein Blick in die Apache conf-Datei in der das Zertifikate angegeben ist, ob dort wiedersprüchliche Angaben existieren:

<VirtualHost *:443>
    ...
    SSLEngine on
    SSLCertificateFile      /path/to/signed_certificate
    SSLCertificateChainFile /path/to/intermediate_certificate
    SSLCertificateKeyFile   /path/to/private/key
    SSLCACertificateFile    /path/to/all_ca_certs
    SSLProtocol             all -SSLv2
    SSLCipherSuite          ...
    SSLHonorCipherOrder     on
    SSLCompression          off
</VirtualHost>
Teilen.

Über den Autor

Seit der Ausbildung zum Fachinformatiker Systemintegration (2002-2005) bei der DaimlerChrysler AG, beruflich im Bereich der E-Mail Kommunikation (Exchange, Linux) sowie des ActiveDirectory, mit entsprechenden Zertifizierungen (MCSE 2003, MCITP Ent.-Admin 2008, MCSE 2012, LPIC 1-3) tätig. Abgeschlossenes Studium zum Master of Science der IT-Management an der FOM sowie zertifizierter Datenschutzbeauftragter. Aktuell im Projektmanagement tätig.

1 Kommentar

  1. Hallo,

    der Cipher-Suite-String funktioniert nicht bei RHEL / Centos 5, da damit keine Cipher übrig bleibt (OpenSSL in Version 0.98).

    Besser ist

    ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:ALL:!aNULL:!ADH:!3DES:!EXP:!RC4:!kRSA:!kKRB5:!aDSS:!DES:!aPSK:!kECDH

    Der String funktioniert auch bei neueren OpenSSL-Versionen. Er erlaubt nur Ciphers mit FS.

    Mehr dazu steht unter http://www.tuxad.de/blog/archives/ssl/index.html

    Viele Grüße

    Frank

     

Antworten