Dieser Artikel bietet einen Überblick über Perfect Forward Secrecy (PFS) und wie man es auf Apache®- oder Nginx®-Webservern aktiviert.
Was ist PFS?
PFS schützt Daten, die zwischen dem Client und dem Server ausgetauscht werden, selbst wenn der private Schlüssel kompromittiert ist. Sie können dies erreichen, indem Sie für jede durchgeführte Transaktion einen Sitzungsschlüssel generieren.
Warum PFS auf einer Website implementieren?
Ein TLS- oder SSL-Zertifikat funktioniert mit einem öffentlichen Schlüssel und einem privaten Schlüssel. Wenn der Webbrowser und der Server Schlüssel austauschen, erstellt das System einen Sitzungsschlüssel mithilfe eines Schlüsselaustauschmechanismus namens RSA, bei dem alle Informationen zwischen dem Client und dem Server verschlüsselt werden. RSA erstellt eine Verknüpfung zwischen dem privaten Schlüssel des Servers und dem Sitzungsschlüssel, der für jede Uniquesecure-Sitzung erstellt wird.
Die Sitzung kann einem Brute-Force-Angriff ausgesetzt werden – dies besteht aus einem Angriff, der dem Server Kombinationen von Sicherheitsschlüsseln injiziert, bis er den richtigen findet. Auch wenn dieser Vorgang lange dauern kann, kann der Angreifer, wenn der private Schlüssel des Servers kompromittiert wird, sowohl die Sitzungsdaten als auch alle Client-Transaktionen einsehen.
Wie PFS eine Website schützt
PFS ermöglicht es dem Server, sich nicht auf einen einzigen Sitzungsschlüssel zu verlassen. Anstatt immer denselben Verschlüsselungsschlüssel zu verwenden, wenn ein Benutzer oder Dienst eine Verbindung herstellt, generiert PFS einen eindeutigen Sitzungsschlüssel für jede Verbindung.
Aktivieren Sie PFS mithilfe von Austauschmechanismen – Ephemeral Diffie-Hellman (DHE)
und Elliptic Curve Diffie-Hellman (ECDHE)
. Wenn die Angreifer den Sitzungsschlüssel brutal erzwingen, können sie nur die Informationen aus dieser einen Sitzung entschlüsseln und nicht aus den anderen.
Anforderungen zur Implementierung von PFS in einem Webserver
Verwenden Sie eines der folgenden Tools, um PFS zu implementieren:
- OpenSSL 1.0.1c+
- Apache 2.4 oder
- Nginx 1.0.6+ und 1.1.0+
Sie können die Versionen dieser Pakete überprüfen, indem Sie die folgenden Befehle ausführen:
Hinweis :Die Ergebnisse können variieren, wenn die Anbieter neue Versionen veröffentlichen.
[root@rackspace-test ~]$ openssl version
OpenSSL 1.1.1g FIPS 21 Apr 2020
[root@rackspace-test ~]$ httpd -v
Server version: Apache/2.4.37 (centos)
Server built: Nov 4 2020 03:20:37
Für Server mit Debian®- oder Ubuntu®-Betriebssystemen lautet der Befehl apache2ctl -v
.
[root@rackspace-test ~]$ nginx -v
nginx version: nginx/1.14.1
SSL-Protokollkonfiguration
Überprüfen Sie, welche Websites SSL implementiert haben, indem Sie die Befehle in den folgenden Abschnitten ausführen.
Diese Beispiele implementieren PFS in einer Domäne namens example.com .
Apache-Anweisungen
Es gibt zwei Möglichkeiten, um zu überprüfen, welche Websites über ein SSL-Zertifikat verfügen:
[root@rackspace-test ~]# grep -ir "SSLEngine" /etc/httpd/
/etc/httpd/conf.d/example.com.conf: SSLEngine on
Hinweis: Der Standardpfad für Apache Virtual Hosts befindet sich im Verzeichnis /etc/httpd/conf.d/ . Verzeichnisse können je nach Konfiguration variieren.
Oder Sie können die Befehle httpd -S
verwenden oder apachectl -S
für CentOS ® oder RedHat® Enterprise Linux ® (RHEL) und apache2ctl -S
für Debian- oder Ubuntu-Betriebssysteme.
[root@rackspace-test ~]# httpd -S | grep 443
*:443 is a NameVirtualHost
port 443 namevhost www.example.com (/etc/httpd/conf.d/example.com.conf:10)
Fügen Sie mit Ihrem bevorzugten Texteditor die folgenden Parameter zur vhost-Konfiguration hinzu:
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
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"
Wenn Sie nach dem Wort SSL suchen im vhost sollte die Ausgabe nach der Implementierung etwa so aussehen:
[root@rackspace-test ~]# egrep 'SSL' /etc/httpd/conf.d/example.com.conf
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
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"
SSLCertificateFile /etc/ssl/certs/2022-example.com.crt
SSLCertificateKeyFile /etc/ssl/private/2022-example.com.key
Stellen Sie sicher, dass die Syntax korrekt ist, und starten Sie Apache neu.
[root@rackspace-test ~]# httpd -t
Syntax OK
[root@rackspace-test ~]# apachectl -k restart
Nginx-Anweisungen
Listen Sie die Websites auf, auf denen ein SSL-Zertifikat installiert ist:
[root@rackspace-test ~]# egrep -ir 'SSL' /etc/nginx/conf.d/
/etc/nginx/conf.d/example.com.conf: listen 443 ssl;
/etc/nginx/conf.d/example.com.conf: ssl_certificate /etc/ssl/certs/2022-example.com.chained.crt;
/etc/nginx/conf.d/example.com.conf: ssl_certificate_key /etc/ssl/private/2022-example.com.key;
Hinweis: Der Standardpfad für Nginx-Blöcke befindet sich im Verzeichnis/etc/nginx/conf.d/ . Verzeichnisse können je nach Konfiguration variieren.
Fügen Sie mit Ihrem bevorzugten Texteditor die folgenden Parameter zur vhost-Konfiguration hinzu:
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers "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";
Wenn Sie nach dem Wort SSL suchen im vhost sollte die Ausgabe nach der Implementierung etwa so aussehen:
[root@racksapce-test ~]# egrep -ir 'SSL' /etc/nginx/conf.d/example.com.conf
listen 443 ssl;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers "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";
ssl_certificate /etc/ssl/certs/2022-example.com.chained.crt;
ssl_certificate_key /etc/ssl/private/2022-example.com.key;
Stellen Sie sicher, dass die Syntax korrekt ist, und starten Sie Nginx neu.
[root@rackspace-test ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@rackspace-test ~]# nginx -s reload
Mit den vorangegangenen Schritten können Sie PFS korrekt für Ihre Websites implementieren.
Verwenden Sie die Registerkarte „Feedback“, um Kommentare abzugeben oder Fragen zu stellen. Sie können auch mit uns ins Gespräch kommen.