OpenVPN kommt in den Standardsettings was die Verschlüsselung angeht recht konservativ daher. Hier möchte ich Euch zeigen, wie man OpenVPN Post-Snowden tauglich macht. Dazu benötigen wir die neueste Version von OpenVPN, beim Schreiben des Artikels ist das Version 2.3.6. Für die Debian/Ubuntu-Fraktion empfehle ich die von OpenVPN bereitgestellten Software-Repositories, um die neueste OpenVPN-Version zu installieren. Auf das Einrichten des OpenVPN-Servers möchte ich hier nicht eingehen, dazu gibt es z.B. für Ubuntu eine brauchbare Anleitung.
1. cipher
Meine Empfehlung: AES-256-CBC
Server-Config:
cipher AES-256-CBC
Client-Config:
cipher AES-256-CBC
2. auth
Meine Empfehlung: sha512
Server-Config:
auth SHA512
Client-Config:
auth SHA512
3. dh
Standardmäßig nutzt OpenVPN einen nur 1024bit großen Diffie-Hellmann-Parameter. Wir erstellen einen neuen mit 4096bit (Achtung, das wird sehr lange dauern):
cd /etc/openvpn/easy-rsa2/keys openssl dhparam -out dh4096.pem 4096
und geben/passen den Pfad in der Server-Config an:
dh ./easy-rsa2/keys/dh4096.pem
4. tls-cipher
Hier bedienen wir uns den Empfehlungen von bettercrypto.org und dem herausgegebenen pdf-Dokument.
Server-Config:
tls-cipher DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
Client-Config:
tls-cipher DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
Die TLS-Cipher Namen werden beim Verbinden als „deprecated“ bezeichnet, was aber nicht so tragisch ist, denn OpenVPN versteht die Anweisung trotzdem. Die IANA-Namen haben alle noch ein „TLS-„ vorneweg und würden die Liste verkürzen, da die tls-cipher Anweisung nur 256Byte lang sein darf.
5. tls-version-min
Server-Config:
tls-version-min 1.2
Client-Config (siehe Update):
tls-version-min 1.2
Forciert die Benutzung von TLS v1.2 (und ermöglicht damit auch die stärkeren Cipher-Suiten wie DHE-RSA-AES256-GCM-SHA384). Bei der zum Zeitpunkt der Veröffentlichung dieses Artikels aktuellen OpenVPN Version 2.3.6. muss die tls-version-min Anweisung mit demselben Wert in Server- und Clientkonfiguration drin stehen. Die OpenVPN-Macher haben mit 2.4 aber schon angekündigt, TLS v1.2 standardmäßig zu verwenden, so dass diese Option in Zukunft nicht mehr notwendig sein könnte.
Update: Nach letzten Tests, die ich mit den neuesten OpenVPN-Versionen durchführte, ist die tls-version-min-Anweisung in den Client-Configs nicht mehr nötig.
6. verify-x509-name
Sicherheitsfeature gegen man-in-the-middle-Attacken.
Client-Config:
verify-x509-name <common-name des servers> name
In der Regel nimmt man als Common-Name für das Serverzertifikat den FullQualifiedDomainName, mit dem der OpenVPN-Server von außen erreichbar ist. Die meisten Anleitungen weisen auch auf diesen Umstand hin.
7. remote-cert-tls
Ein weiteres Sicherheitsfeature, was die Schlüsselverwendung überprüft und zusammen mit verify-x509-name ebenfalls gegen man-in-the-middle-Attacken hilft.
Server-Config:
remote-cert-tls client
Client-Config:
remote-cert-tls server
8. tls-auth
Eine gut Methode, um DOS-Attacken abzuschwächen, ist die hier beschriebene TLS-Auth-Methode mit einem TLS-Static-Key (PSK). Dabei werden eingehende TLS-Pakete nur akzeptiert, wenn sie mit dem TLS-Key signiert wurden. Nicht signierte Pakete werden so schon frühzeitig verworfen und können keine so hohe Last erzeugen.
Zuerst erstellen wir einen TLS-Static-Key:
cd /etc/openvpn/easy-rsa2/keys openvpn --genkey --secret ta.key chmod 0600 ta.key
und passen dann wieder die Configs an. Server-Config:
tls-auth ./easy-rsa2/keys/ta.key 0
Client-Config:
tls-auth ta.key 1
Beim Verteilen der Zertifikat-Pakete an die Clients sollte man natürlich den ta.key nicht vergessen.
Am Ende den OpenVPN-Server neustarten:
service openvpn restart
Sehr guter Artikel!!
Super Infos. Hat mir sehr geholfen. Vielen Dank !
For OpenVPN >= 2.4
„cipher“ should be replaced with „ncp-cipher“, so that the server tells the client which ciphers are allowed, so no „cipher“ option is needed in the client config anymore.
And also „tls-auth“ should be replaced be „tls-crypt“, see https://www.securai.de/veroeffentlichungen/blog/sichere-konfiguration-eines-vpn-mit-openvpn/
Thx 4 hint. You are right, there are some changes with OpenVPN 2.4 and this article is a bit outdated.