IPsec VPN Verbindung mit Client Zertifikaten absichern

Letzte Aktualisierung am 25.12.2023, 11:12:42 Uhr

In diesen Artikel beschreibe ich die Konfiguration und Einrichtung eines Client2Site (C2S) VPN-Verbindung. VPN Verbindungen werden auch im privaten Umfeld immer wichtiger um sicher auf (sensible) Daten zugreifen zu können. Grundsätzlich können natürlich weiterhin Anwendungen direkt im Internet veröffentlicht werden. Allerdings fehlen den meisten Hobby ITlern das notwendige Wissen, zeitlichen Ressourcen und die finanziellen Mitteln. Daher ist VPN einfache schlichte, einfache Option.

Oftmals werden für die Authentifizierung von VPN Verbindungen Pre-Shared-Keys bzw. Benutzername + Passwort benutzt. Der Vorteil für beiden Optionen ist, dass die Einrichtung und Verwaltung einfach und schnell ist und keine weitere Zusatzprodukte erforderlich sind. Der Vorteil ist unter Betrachtung der Sicherheit auch zu gleich der Nachteil. Werden die Daten unzureichend von den Nutzern sicher verwahrt oder sogar an Dritte weitergebene, ist es nicht mehr gewährleistet, dass ausschließlich autorisierte Nutzer Zugriff auf das geschützte Netzwerk erhalten.

Ein anderer Ansatz ist die Authentifizierung mit Hilfe von Client Zertifikaten. Der Vorteil hierbei ist, dass ohne der privaten Schlüssel des Zertifikats keine Weitergabe/Missbrauch möglich ist. Das i-Tüpfelchen hierbei ist den privaten Schlüssel zusätzlich mit einem Passwort zu schützen. Dieses muss bei jeder Nutzung des Zertifikats interaktiv eingegeben werden. Der Nachteil hierbei ist, man muss Wissen wie Public Key Infrastrukturen (PKI) funktionieren und auch sicher einzurichten sind.

An dieser Stelle setzt auch dieser Beitrag an. Es setzt voraus, dass bereits Erfahrungen mit OPNsense als auch PKI vorhanden sind.

Rahmenbedingungen

Für diesen Artikel habe ich eine OPNsense auf einem Server von Hetzner installiert. Grundsätzlich spielt es keine Rolle, ob das System in der Cloud oder zu Hause steht. Wichtig bei der letzten Option ist, dass der Internetanschluss als Dual-Stack (kein Lite) vorhanden sein muss.

Auf dem LAN Interface der Firewall liegt das Subnetz 10.0.0.0/24 an. Die Firewall hat die IP-Adresse 10.0.0.1.

Für die verschiedenen Testes nutze ich ein Windows 11. Hierbei greife ich auf die integrierte Funktion für VPN-Verbindungen zurück. Sprich es ist keine zusätzliche Software erforderlich.

Aktuell wird seitens OPNsense in Verbindung mit Windows 10/11 keine Authentifizierung über EAP-TLS unterstützt. Daher muss hierzu ein Radius-Server zur Hilfe genommen werden (EAP-Radius).

Konfiguration OPNsense

Nachstehend beschreibe ich die einzelnen Schritte auf der Firewall.

Einrichtung der PKI

Konfiguration der Root Certificate Authority (Root CA)
Konfiguration der Intermediate Certificate Authority (ICA)

Einrichtung einer Zertifikatsperrliste (CRL)

Die CRL ist erforderlich, um später (zu jedem Zeitpunkt) ein Zertifikat sperren zu können. Sobald das Zertifikat auf der CRL ist, kann dieses nicht mehr für die Einwahl verwendet werden.
Hinweis: Sobald ein Zertifikat auf bzw. von der CRL genommen wird, muss zum aktuellen Zeitpunkt des Beitrags der Dienst „FreeRADIUS“ neu gestartet werden.

Zertifikat für den VPN Service

Konfiguration Radius-Server

Installation von FreeRADIUS
Konfiguration von EAP
Firewall als RADIUS Client hinzufügen
Radius-Server der OPNsense hinzufügen

Einrichtung eines Testbenutzers

Einrichtung IPsec IKEv2

Mit Address „0.0.0.0/0“ wird sämtlicher Datenverkehr durch den VPN-Tunnel geschickt. Im Grunde es ist eine Default Route, welche einer besser Metrik erhält.

Firewall Regelwerk erweitern

Standardmäßig bzw. automatisch wird auf dem IPsec Interface eine Any Any Regel mit der Direction „out“ erstellt.

Hier fehlt nun eine weitere Regel, welche eine „in“ Direction hat. Anderenfalls werden später keinerlei Daten transferiert werden können. Um erst einmal die Funktionalität sicherzustellen, wird es ebenfalls eine Any-Any-Regel.
Wenn alles funktioniert, sollte die Regel deaktiviert werden und ein granulares Regelwerk aufgebaut werden.

Konfiguration Windows 11

Damit das Zertifikat des Benutzer von der PKI der OPNsense auf einem Windows System als gültig angesehen wird, müssen die Zertifikat der RCA und ICA manuell importiert werden.

Zertifikate einspielen

Zertifikate der CAs von der OPNsense herunterladen
Zertifikat des Testbenutzers herunterladen
Da der privaten Schlüssel (Private Key) in dem Export enthalten ist, ist es empfehlenswert ein sicheres Passwort zu vergeben.
Zertifikat der RCA auf dem Windows System importieren
Hinweis: Microsoft Management Console (MMC) muss als Administrator gestartet werden.
Zertifikat der ICA auf dem Windows System importieren
Zertifikate des Benutzers importieren
Hinweis: Eine weitere MMC im Kontext des betroffenen Benutzers bzw. dessen Konto öffnen.

VPN Verbindung einrichten (GUI)

Auszug aus dem Logfile des IPSec VPN Services:

VPN Verbindung einrichten (PowerShell)

Add-VpnConnection -Name "OPNsenseIPSecIKEv2" -ServerAddress "static.200.155.76.144.clients.your-server.de" `
-TunnelType IKEv2 -EncryptionLevel Required -AuthenticationMethod EAP

$config = New-EapConfiguration -Tls -UserCertificate -VerifyServerIdentity
Set-VpnConnection -Name "OPNsenseIPSecIKEv2" -EapConfigXmlStream $config.EapConfigXmlStream

VPN Verbindung mit DH14/AES-CGM einrichten (PowerShell)

Windows nutzt nach wie vor standardmäßig Diffie-Hellmann (DH) Group 2. Mit Hilfe der PowerShell kann die moderne DH Group 14 verwendet werden. Damit verbunden ist auch das AES-CGM Verfahren nutzbar.
Add-VpnConnection -Name "OPNsenseIPSecIKEv2-CGM" -ServerAddress "static.200.155.76.144.clients.your-server.de" `
-TunnelType IKEv2 -EncryptionLevel Required -AuthenticationMethod EAP

$config = New-EapConfiguration -Tls -UserCertificate -VerifyServerIdentity
Set-VpnConnection -Name "OPNsenseIPSecIKEv2-CGM" -EapConfigXmlStream $config.EapConfigXmlStream

Set-VpnConnectionIPsecConfiguration -ConnectionName "OPNsenseIPSecIKEv2-CGM" -AuthenticationTransformConstants GCMAES256 `
-CipherTransformConstants GCMAES256 -EncryptionMethod AES256 -IntegrityCheckMethod SHA256 -DHGroup Group14 -PfsGroup None -Force

Funktionstest

Der einfachste und schnellste Funktionstest des VPN Tunnel ist ein Ping (ICMP). Und zwar von VPN-Client zur Firewall, 10.0.0.1.

Funktionstest bestanden. 🙂

Split-Tunneling

Mit der aktuellen Konfiguration des VPN IPsec Tunnels, Phase 2 wird standardmäßig sämtlicher Datenverkehr, der nicht das Subnetz in dem der Client sich befindet, in den Tunnel geschickt. Somit auch alle Datenpakete die Internetseiten (z.B. google.de) betreffen.

Abhilfe schafft der Parameter „-SplitTunneling“, welcher in den Bereichen „VPN Verbindung einrichten (PowerShell)“ und „VPN Verbindung mit DH14/AES-CGM einrichten (PowerShell)“ an den Befehl in der ersten Zeile (Add-VpnConnection….) am Ende hinzugefügt wird.

Konfiguration Apple iPhone/iPad

Die nachstehenden Test wurde mit iOS in der Version 16.3 getestet.

Zuerst müssen die Zertifikate (im Format crt) der beiden CAs (Wydler LAB03 RSA TLS Root CA 2023-1, Wydler LAB03 RSA Radius ICA 2023-1) sowie das Client Zertifikat (in Format pfx, p12) für das Endgerät auf das Gerät kommen. Ich habe die Dateien per E-Mail auf das Gerät geschickt.

Ich empfehle für jedes Gerät ein dedizierte Zertifikat auszustellen. Es ist problemlos möglich in den Eigenschaften des Benutzers auch mehrere Zertifikate auszustellen. Das Vorgehen (Erstellen des Zertifikats, Export des Zertifikats) bleibt immer gleich. Für diesen Test nutze ich das bestehende Zertifikats „blog.daniel“.

Das exportierte Client Zertifikat muss mit einem Passwort geschützt werden. Apple fragt beim Import explizit nach einem Passwort. Der Dialog kann nicht übersprungen werden!

Zertifikate einspielen

Wydler LAB03 RSA TLS Root CA 2023-1
Einstellungen -> Allgemein -> VPN und Geräteverwaltung:
Einstellungen -> Allgemein -> Info -> Zertifikatsvertrauenseinstellungen
Wydler LAB03 RSA Radius ICA 2023-1
Einstellungen -> Allgemein -> VPN und Geräteverwaltung:
Client Zertifikat einspielen
Passwort der PFX Datei muss hier eingeben!

VPN Verbindung einrichten (GUI)

Einstellungen -> Allgemein -> VPN und Geräteeinstellungen:
Die Lokale ID muss dem Common Name des Client Zertifikats entsprechen!
Funktionstest der VPN-Verbindung:

Konfiguration Linux Ubuntu 22.04

Natürlich erhalten auch immer mehr Linux Distributionen auch zu Hause Einzug auf den Geräten. Gerade ältere Geräte werden dadurch wieder neues Leben eingehaucht.

VPN Verbindung einrichten (GUI)

Nachfolgende Schritte basieren auf folgenden Rahmenbedingungen:

  • Es ist Ubuntu Desktop (GNOME) installiert.
  • zur Verwaltung des Netzwerk Einstellungen wird NetworkManager genutzt.
Installation der Voraussetzungen:
apt install strongswan libstrongswan-extra-plugins libcharon-extra-plugins network-manager-strongswa
Damit die Änderungen wirksam werden, muss das System neu gestartet werden.
Auch bei Linux Systemen muss das Zertifikat der CA „Wydler LAB03 RSA TLS Root CA 2023-1“ verfügbar sein. Dieses wie gehabt die Weboberfläche im Format .crt exportieren.
Das Client Zertifikat muss hingegen der Einrichtung unter Windows und Apple nicht im Format .p12 bzw. .pfx, sondern als .crt und .key exportiert werden. Auch dies kann über die Weboberfläche der OPNsense durchgeführt werden.
Diese drei Dateien müssen auf das Linux System übertragen werden. Ich nutze dafür FileZilla und nutze für die Übertragung SFTP. Die Dateien müssen im sogenannten Home-Verzeichnisses des Benutzers angelegt werden.
Einrichtung der VPN-Verbindung:
Wichtig ist auch an dieser Stelle, dass der Parameter Identity als Wert der vergebene Common Name des Client Zertifikats eingetragen wird. Anderenfalls wird der Verbindungstest später fehlschlagen.
Funktionstest durchführen:
Falls es wieder erwarten die VPN-Verbindung nicht aufgebaut wird, gibt es natürlich auch Log. Der Befehl hierfür ist:

journalctl -u NetworkManager.service -f

Overviews – Lobby, Status, Lease und Policy

Client Zertifikat zurückziehen

Es kommt der Tag an dem der Zugriff für einen Nutzer gesperrt werden bzw. ein neues Zertifikat ausgestellt werden muss. In jedem Fall empfiehlt es sich, dass Zertifikat auf die Zertifikatssperrliste (CRL) zu setzen.

Zum Zeitpunkt als der Beitrag erstellt worden ist, musste der Dienste für FreeRADIUS neu gestartet werden, damit die Änderung der CRL wirksam wird.
Versucht nun das gesperrte Zertifikat eine Verbindung aufzubauen so findet man in den Logfiles von FreeRADIUS und VPN IPSec entsprechende Einträge.

 

Abonnieren
Benachrichtige mich bei
0 Comments
Inline Feedbacks
View all comments