Mit OpenVPN kann ein einfacher Tunnel mit statischen Schlüsseln wie in diesem Artikel beschrieben aufgebaut werden. Diese Methode ist einfach realisierbar, für mehrere Clients ist es aber auf jeden Fall empfehlenswert eine Authentifizierung mittels Private/Public-Keys durchzuführen.
Dadurch kann sowohl die Sicherheit (Geheimhaltung der privaten Schlüssel) als auch die Skalierbarkeit des VPN wesentlich erhöht werden.
Am besten wird ein eigener Rechner verwendet der für das signieren der Schlüssel verantwortlich ist.
Die Public-Key Infrastruktur (PKI) besteht aus folgenden Komponenten:
Die notwendigen Scripts zum erstellen der Schlüssel und Zertifikate befinden sich im Unterverzeichnis easy-rsa des OpenVPN Verzeichnisses. In openSuSE 11.1 ist das Verzeichnis /usr/share/openvpn/easy-rsa.
Eine Beispielkonfiguration befindet sich im Verzeichnis /usr/share/doc/openvpn/examples. Diese kann in das obige Verzeichnis kopiert und dort konfiguriert werden.
In diesem Verzeichnist befindet sich die Datei vars. Deren Inhalt muss zuerst angepasst werden. Dazu die Werte der folgenden Parameter korrekt anpassen:
Es sollte überprüft werden ob das Unterverzeichnis ./keys wichtigen Daten enthält. Alle Schlüssel und Zertifikate in diesem Verzeichnis werden weiter unten gelöscht. Falls die Daten in diesem Verzeichnis noch benötigt werden, müssen sie gesichert werden oder der Parameter KEY_DIR in der Datei vars auf ein anderes Verzeichnis gesetzt werden.
Mit folgenden Befehlen wird die PKI initialisiert:
$ . ./vars $ ./clean-all $ ./build-ca
Nach dem letzten Befehl müssen noch die Daten für das Zertifikat eingegeben werden. Danach kann das Schlüsselpaar für den Server erzeugt werden:
$ ./build-key-server server
Wiederum müssen die Daten wie beim obigen Befehl eingegeben werden. Als CommonName ist server anzugeben. Die beiden abschließenden Fragen sind jeweils mit y zu bestätigen.
Analog zum Server erfolgt die Erstellung der Keys für die Clients:
$ ./build-key <clientname>
Dabei muss für jeden erzeugten Clientschlüssel ein eindeutiger CommonName angegeben werden (z.B.: client1, client2, client3, …). Die beiden abschließenden Fragen sind wiederrum mit y zu bestätigen.
Zum Abschluss müssen für den Server noch die Diffie-Hellman Parameter und der statische Schlüssel für die TLS-Authentifizierung erzeugt werden.
$ ./build-dh $ cd keys $ openvpn --genkey --secret ta.key
Damit stehen im Unterverzeichnis ./keys die zuvor erzeugten Schlüssel und Zertifikate zur Verfügung. Diese können nun auf den Server und die Clients verteilt werden. In diesem Verzeichnis sollten sich nun die Folgenden Dateien befinden:
| Datei | Vorhanden auf | Inhalt | Geheim |
|---|---|---|---|
| ca.crt | Server + Clients | Root CA certificate | nein |
| ca.key | nur am Zertifizierungs-PC | Root CA key | ja |
| dh{n}.pem | nur am Server | Diffie Hellman Parameter | nein |
| server.crt | nurm am Server | Server Certificate | nein |
| server.key | nur am Server | Server Key | ja |
| client1.crt | nur am Client1 | Client1 Certificate | nein |
| client1.key | nur am Client1 | Client1 Key | ja |
| client2.crt | nur am Client2 | Client2 Certificate | nein |
| client2.key | nur am Client2 | Client2 Key | ja |
| client3.crt | nur am Client3 | Client3 Certificate | nein |
| client3.key | nur am Client3 | Client3 Key | ja |
| ta.key | nur am Server | Statischer Key | ja |
Am Server unter Linux muss eine Konfigurationsdatei server.conf erzeugt werden, die in das Verzeichnis /etc/openvpn kopiert wird. Wird Windows als Betriebssystem verwendet, ist das heißt die Konfigurationsdatei server.ovpn und liegt im Verzeichnis C:\Programme\OpenVPN\config Wenn OpenVPN als Dienst ausgeführt wird, lädt der Server automatisch alle Konfigurationsdateien im oben genannten Verzeichnis.
Hier ist ein Beispiel wie der Inhalt dieser Datei aussehen kann:
server <tunnel-networkaddress> 255.255.255.0 dev tap port 1194 proto udp client-to-client keepalive 15 60 comp-lzo tls-server tls-auth ta.key 0 ca ca.crt cert server.crt key server.key dh dh1024.pem verb 3
Weiters müssen auch die folgenden Dateien in dieses Verzeichnis kopiert werden:
Wie beim Server sollten auch am Client die Schlüssel und die Konfigurationsdatei unter Linux ins Verzeichnis /etc/openvpn kopiert werden. Unter Windows heißt das Verzeichnis wieder C:\Programme\OpenVPN\config. Der Name der Schlüssel und der Konfigurationsdatei sollte mit dem Hostnamen des Clients übereinstimmen. Unter Linux muss die Erweiterung .conf und unter Windows .ovpn heißen.
Ein Beispiel für die Konfigurationsdatei:
client
dev tap
route <server-side-networkaddress> <server-side-netmask>
proto udp
remote <server-ip> 1194
resolv-retry infinite
persist-key
persist-tun
ca ca.crt
cert <user>.crt
key <user>.key
tls-client
ns-cert-type server
tls-auth ta.key 1
comp-lzo
verb 3
Die zu kopierenden Schlüssel sind:
Zum Testen kann OpenVPN manuell, mit dem folgenden Befehl, gestartet werden:
$ openvpn <config-file-name>
Dies muss natürlich auf dem Server und auf den Clients erfolgen. Ebenso ist es möglich OpenVPN als Dienst zu starten. Dies erfolgt im Userinterface unter Windows, bzw. durch ein Ausführen der Datei /etc/init.d/openvpn unter Linux.
Wenn OpenVPN als Dienst ausgeführt werden soll empfiehlt es sich noch die folgenden Zeilen an die Konfigurationsdateien anzuhängnen.
daemon status /var/log/openvpn-<config-name>.log
Mit dem Befehl
$ chkconfig openvpn on
wird der openVPN-Dienstes automatisch beim Systemstart gestartet.
Diskussion