OpenVPN Server mit DD-WRT: Unterschied zwischen den Versionen

Aus Dario's Home
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: = Zertifikatsbasierter OpenVPN Server unter DDWRT = Hier eine Anleitung um einen OpenVPN Server unter DDWRT einzurichten. == Voraussetzungen == * Router mit [http://www...)
 
 
(27 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
= Zertifikatsbasierter OpenVPN Server unter DDWRT =
+
Hier eine Anleitung um einen zertifikatsbasierten OpenVPN Server unter DDWRT einzurichten.
Hier eine Anleitung um einen OpenVPN Server unter DDWRT einzurichten.
+
__TOC__
== Voraussetzungen ==
+
= Theorie =
 +
== Zertifikate und Schlüssel ==
 +
Bei einem VPN Server hat man generell zwei Möglichkeiten der Autorisierung:
 +
* über einen Schlüssel (preshared key)
 +
* mit Zertifikaten
 +
Es gibt einige Unterschiede, zwischen Zertifikaten und Schlüsseln:
 +
* Nutzt man Zertifikate muss man für neue Nutzer keine Einstellungen am Server verändern.
 +
* Nutzt man preshared keys muss der Schlüssel für jeden Client-Benutzer im VPN-Server eingetragen werden.
 +
* Oft gibt es nur die Möglichkeit ein einziges Passwort festzulegen was dazu führt, dass alle Clients dasselbe Passwort nutzen.
 +
** Will man in diesem Fall einem Client das Nutzungsrecht entziehen, so muss man das Passwort ändern und allen rechtmäßigen Clients das neue Passwort zukommen lassen. Das ist bei einer großen Anzahl von Benutzern eher unpraktisch.
 +
** Nutzt man nur ein Passwort kann man nicht mehr sehen, welche Nutzer sich einloggen bzw. eingeloggt haben, da alle dasselbe Passwort nutzen.
 +
* Bei Zertifikaten muss der Server die Clients vorher nicht kennen, er kennt nur eine Stelle, nämlich die CA (Certificate Authority, Zertifizierungsstelle). Die CA stelt dem User ein Zertifikat aus, welches besagt, dass es einem User erlauft ist den Server zu nutzen.
 +
== Wie geht das mit diesen Zertifikaten? ==
 +
Im Prinzip ist es ganz einfach:
 +
=== Zertifikate erzeugen ===
 +
* jeder Teilnehmer (CA, Server und jeder Benutzer) erzeugen sich (im Idealfall selber) einen asymmetrischen RSA-Schlüssel, bestehend aus einem öffentlichen Schlüssel und einem privaten Schlüssel<BR>
 +
''(in diesem Tutorial werden alle Schlüssel auf einem Computer erzeugt, da ich selber der einzige Nutzer bin und nur verschiedene Geräte habe. Eventuell werde ich später auch einmal schildern, wie man das machen kann, dass Clients ihre Schlüssel selber erzeugen)''
 +
* Die CA hat die Aufgabe einen öffentlichen Schlüssel an eine Identität zu binden, das ist das Zertifikat. <BR>
 +
:Ein Zertifikat für einen User enthält in meinem Beispiel die folgenden Informationen:
 +
:: Seriennummer 3:
 +
:: Ich die CA bestätige, dass
 +
:: der öffentlichen Schlüssel ''Pub_X''
 +
:: dem User ''Y'' gehört.
 +
:: Der User ist aus Deutschland, NRW, Bochum, Firma local, Abteilung it
 +
:: Diese Aussage ist gültig von 1.1.2010 bis zum 1.1.2011
 +
:: ''Unterschrift der CA''
 +
:Dieses Zertifikat wurde unterschrieben mit dem privaten Schlüssel der CA und jeder, der den öffentlichen Schlüssel der CA kennt, kann dieses Zertifikat prüfen. Erstellen und Verändern kann man es nur mit dem privaten Schlüssel der CA.<BR>
 +
:Es gibt auch noch Zertifikate für den VPN-Server und die CA selber, das Zertifikat der CA besagt:
 +
:: Seriennummer 1:
 +
:: Ich die CA bestätige, dass
 +
:: der öffentlichen Schlüssel ''Pub_Z''
 +
:: mir selber gehört.
 +
:: Ich bin aus Deutschland, NRW, Bochum, Firma local, Abteilung it
 +
:: Diese Aussage ist gültig von 1.1.2010 bis zum 1.1.2020
 +
:: ''Unterschrift der CA''
 +
:Das Zertifikat des Servers besagt:
 +
:: Seriennummer 2:
 +
:: Ich die CA bestätige, dass
 +
:: der öffentlichen Schlüssel ''Pub_S''
 +
:: Dem VPN-Server ''S'' gehört.
 +
:: Der VPN-Server ist aus Deutschland, NRW, Bochum, Firma local, Abteilung it
 +
:: Diese Aussage ist gültig von 1.1.2010 bis zum 1.1.2015
 +
:: ''Unterschrift der CA''
 +
 
 +
=== Zertifikatsbasierte Anmeldung ===
 +
Soll nun eine Verbindung zu einem VPN-Server aufgebaut werden geht das im Prinzip so:
 +
* ''Client:''
 +
:: "Hallo VPN Server ich bin der Client ''X'', hier mein Zertifikat ''Cert_X''."
 +
* ''Server:''
 +
:: Prüft das Zertifikat mit dem öffentlichen Schlüssel der CA
 +
:: "Alles OK, ich weiss jetzt dass der Client ''X'' den öffentlichen Schlüssel ''Pub_X'' hat."
 +
:: "Aber das kann mir ja jeder sagen, dass sind ja alles öffentliche Informationen."
 +
:: "Wenn Du mir jetzt noch beweisen kannst, dass Du auch den privaten Schlüssel ''Priv_X'' von Client ''X'' hast, dann glaube ich, dass ich mit Client ''X'' spreche."
 +
:: "Dazu habe hier mir mal eine Zufallszahl ''Z'' ausgedacht und diese mit ''Pub_X'' verschlüsselt, nur mir ''Priv_X'' kann man die entschlüsseln. So lieber Client, bitte zeig mir mal, dass Du das kannst, hier ist sie: ''enc(z)''."
 +
* ''Client:''
 +
:: entschlüsselt ''enc(z)'' mit seinem privaten Schlüssel ''Priv_X''
 +
:: "Nichts leichter als das, hier ist die Zufallszahl: ''Z''"
 +
* ''Server:''
 +
:: Prüft, ob Z wirklich Z ist
 +
:: "Prima, ich lass dich jetzt rein."
 +
Das ist grob das Prinzip, das Zeigt, warum der Server den Client vorher nicht kennen muss und sich trotzdem Sicher sein kann, mit dem Client zu reden. Um jetzt noch Angriffe vom Man-in-the-Middle auszuschließen ist das Protokoll ein wenig komplizierter, worauf ich an dieser Stelle nicht eingehen möchte.
 +
Auch hat der Client die Möglichkeit das selbe Verfahren noch mal mit dem Server durchzuführen, um sicher zu stellen, dass er auch wirklich mit dem Server verbunden ist.
 +
 
 +
=== User sperren ===
 +
Das ist eine nicht so triviale Sache, denn der User hat ja das Zertifikat und der Server kennt den User ja gar nicht. Will man nun einen User sperren, erzeugt die CA eine sogenannte Certificate Revocation List (CRL). Da steht dann drin:
 +
:: Certificate Revocation List
 +
:: Ich die CA teile mit, das die Zertifikate mit den folgenden Seriennummern ungültig sind:
 +
:: Seriennummer 4
 +
:: Seriennummer 5
 +
:: ''Unterschrift der CA''
 +
Diese Liste muss nun allen vorliegen, die ein Zertifikat der CA prüfen sollen. Das ist in erster Linie der VPN-Server, wenn die Clients auch die Zertifikate der Server prüfen, müssten auch diese zugriff auf die jeweils aktuelle Version der CRL haben.
 +
'''Wichtig:''' Um eine solche Liste später erzeugen zu können, muss die CA natürlich wissen, welche Zertifikate Sie überhaupt ausgestellt hat, denn Sie kann das Zertifikat nur wiederrufen, wenn sie dessen Seriennummer kennt.
 +
 
 +
= Voraussetzungen =
 +
Genug Theorie, legen wir los mit dem praktischen Teil. Besorgt Euch folgendes:
 
* Router mit [http://www.dd-wrt.com DDWRT Firmware] mit VPN Unterstützung, ich nutze v24-sp2 (10/10/09) mega (SVN revision 13064)
 
* Router mit [http://www.dd-wrt.com DDWRT Firmware] mit VPN Unterstützung, ich nutze v24-sp2 (10/10/09) mega (SVN revision 13064)
 
* [http://xca.sourceforge.net XCA Zertifikatsverwaltung], ich nutze die Windows Version Version : 0.8.1
 
* [http://xca.sourceforge.net XCA Zertifikatsverwaltung], ich nutze die Windows Version Version : 0.8.1
== PKI erzeugen ==
+
* [http://openvpn.se/ OpenVPN GUI for Windows]
 +
= PKI erzeugen =
 
Hier werden Schlüssel und Zertifikate erzeugt.
 
Hier werden Schlüssel und Zertifikate erzeugt.
=== XCA laden und installieren ==
+
== XCA laden und installieren ==
* Zuerst XCA [http://sourceforge.net/projects/xca/ hier] herrunterladen.
+
* Zuerst XCA [http://sourceforge.net/projects/xca/ hier] herunterladen.
 
* Dann XCA installieren, das kann wohl jeder selbst.
 
* Dann XCA installieren, das kann wohl jeder selbst.
 
* XCA Starten
 
* XCA Starten
=== Datenbank anlegen ===
+
== Datenbank anlegen ==
 
XCA speichert alle Schlüssel und Zertifikate in einer Datenbank, die zuerst angelegt werden muss, was mit ''Datei/New Database'' initiiert wird. Dann einen Namen für die Datenbank angeben und ein Passwort vergeben. Nur mit dieser Datei und dem Passwort kann man später Veränderungen vornehmen, also gut merken. Achtung: Das Passwort aber auch nicht zu leicht wählen, denn wer die Datei und Passwort hat erzeugt sich selber Zertifikate und kann sich dann auch am VPN-Server anmelden (ohne Veränderungen am VPN-Server vornehmen zu müssen - das ist übrigens der Sinn der Zertifikate)
 
XCA speichert alle Schlüssel und Zertifikate in einer Datenbank, die zuerst angelegt werden muss, was mit ''Datei/New Database'' initiiert wird. Dann einen Namen für die Datenbank angeben und ein Passwort vergeben. Nur mit dieser Datei und dem Passwort kann man später Veränderungen vornehmen, also gut merken. Achtung: Das Passwort aber auch nicht zu leicht wählen, denn wer die Datei und Passwort hat erzeugt sich selber Zertifikate und kann sich dann auch am VPN-Server anmelden (ohne Veränderungen am VPN-Server vornehmen zu müssen - das ist übrigens der Sinn der Zertifikate)
=== XCA Optionen ===
+
{| {{prettytablecenternoboarder}}
 +
|-----
 +
|[[Bild:NewDatabase.png|thumb|200px|New Database]]
 +
|[[Bild:NewDatabase_Name.png|thumb|200px|New Database Name]]
 +
|[[Bild:NewDatabase_Pass.png|thumb|200px|Password for Database]]
 +
|-----
 +
|}
 +
== XCA Optionen ==
 
Unter ''Datei/Optionen'' SHA-256 als ''Standard Hash Algorithmus'' einstellen.
 
Unter ''Datei/Optionen'' SHA-256 als ''Standard Hash Algorithmus'' einstellen.
=== Templates erstellen ===
+
{| {{prettytablecenternoboarder}}
 +
|-----
 +
|[[Bild:XCA_Options.png|thumb|200px|Default Hash: SSH-256]]
 +
|-----
 +
|}
 +
== Vorlagen erstellen ==
 
Damit man später vieles einfacher hat legen wir nun zuerst Templates an. Kann man drüber streiten, ob das für die CA und die Server sinnvoll ist, für die Clients lohnt es sich auf jeden Fall. Unter der Lasche ''Vorlagen'' den Knopf ''Neues Template'' und dann zuerst die CA Vorlage:  
 
Damit man später vieles einfacher hat legen wir nun zuerst Templates an. Kann man drüber streiten, ob das für die CA und die Server sinnvoll ist, für die Clients lohnt es sich auf jeden Fall. Unter der Lasche ''Vorlagen'' den Knopf ''Neues Template'' und dann zuerst die CA Vorlage:  
 
* Preset Template Values: '''CA'''
 
* Preset Template Values: '''CA'''
Zeile 28: Zeile 115:
 
* Erweiterungen
 
* Erweiterungen
 
** Zeitspanne: '''10 Jahre'''  
 
** Zeitspanne: '''10 Jahre'''  
 +
{| {{prettytablecenternoboarder}}
 +
|-----
 +
|[[Bild:Template_CA_1.png|thumb|200px|Vorlage CA 1]]
 +
|[[Bild:Template_CA_2.png|thumb|200px|Vorlage CA 2]]
 +
|[[Bild:Template_CA_3.png|thumb|200px|Vorlage CA 3]]
 +
|[[Bild:Template_CA_4.png|thumb|200px|Vorlage CA 4]]
 +
|-----
 +
|}
 
Dann die Vorlage für den Server:
 
Dann die Vorlage für den Server:
 
* Preset Template Values: '''HTTPS_server'''
 
* Preset Template Values: '''HTTPS_server'''
Zeile 41: Zeile 136:
 
* Erweiterungen
 
* Erweiterungen
 
** Zeitspanne: '''5 Jahre'''  
 
** Zeitspanne: '''5 Jahre'''  
 +
{| {{prettytablecenternoboarder}}
 +
|-----
 +
|[[Bild:Template_Server_1.png|thumb|200px|Vorlage Server 1]]
 +
|[[Bild:Template_Server_2.png|thumb|200px|Vorlage Server 2]]
 +
|[[Bild:Template_Server_3.png|thumb|200px|Vorlage Server 3]]
 +
|[[Bild:Template_Server_4.png|thumb|200px|Vorlage Server 4]]
 +
|-----
 +
|}
 
Zuletzt die Vorlage für die Clients:
 
Zuletzt die Vorlage für die Clients:
 
* Preset Template Values: '''HTTPS_client'''
 
* Preset Template Values: '''HTTPS_client'''
Zeile 54: Zeile 157:
 
* Erweiterungen
 
* Erweiterungen
 
** Zeitspanne: '''365 Tage'''
 
** Zeitspanne: '''365 Tage'''
 +
{| {{prettytablecenternoboarder}}
 +
|-----
 +
|[[Bild:Template_Client_1.png|thumb|200px|Vorlage Client 1]]
 +
|[[Bild:Template_Client_2.png|thumb|200px|Vorlage Client 2]]
 +
|[[Bild:Template_Client_3.png|thumb|200px|Vorlage Client 3]]
 +
|[[Bild:Template_Client_4.png|thumb|200px|Vorlage Client 4]]
 +
|-----
 +
|}
 +
== Zertifikate erstellen ==
 +
Jetzt können wir die Zertifikate erstellen, dabei erzeugen wir gleichzeitig die Schlüssel.<BR>
 +
Wir fangen an mit dem '''Root-Zertifikat''', dazu unter der Lasche ''Zertifikate'' den Knopf ''Neues Zertifikat''.
 +
* Herkunft
 +
** '''Erstelle ein Selbst signiertes Zertifikat mit der Seriennummer 1'''
 +
** Signatur Algorithmus '''SHA-256'''
 +
** Vorlage für das neue Zertifikat: '''Vorlage_CA'''
 +
** '''Knopf Übernehmen drücken''' (das füllt die restlichen Felder mit denen der Vorlage aus)
 +
* Besitzer
 +
** Interner Name: '''root_ca'''
 +
** Länder Code: DE
 +
** Bundesland, Kreis: NRW
 +
** Ort: BOCHUM
 +
** Firma: local
 +
** Firmenabteilung: it
 +
** Üblicher Name:  '''root_ca'''
 +
** E-Mail Adresse: xca@mail.com
 +
* Knopf '''Erstelle einen neuen Schlüssel''' drücken
 +
** Name: '''root_ca_key'''
 +
** SchlüsselTyp: '''RSA'''
 +
** Schlüssellänge: '''1024 bit''' (auch 2048 bit sind möglich, benötigen dann aber mehr Speicher im NVRAM des Routers)
 +
* Knopf '''Erstellen''' drücken
 +
* Erweiterungen
 +
** Zeitspanne: '''10 Jahre'''
 +
* Nochmal unter Herkunft den Signatur Algorithmus prüfen
 +
** Signatur Algorithmus '''SHA-256'''
 +
** '''OK'''
 +
{| {{prettytablecenternoboarder}}
 +
|-----
 +
|[[Bild:RootCA_1.png|thumb|200px|Root CA Zertifikat: Herkunft]]
 +
|[[Bild:RootCA_2.png|thumb|200px|Root CA Zertifikat: Besitzer]]
 +
|[[Bild:RootCA_3.png|thumb|200px|Root CA Zertifikat: Neuer Schlüssel]]
 +
|-----
 +
|}
 +
Jetzt das Zertifikat für den '''VPN-Server'''
 +
* Herkunft
 +
** Verwende das Zertifikat zum Unterschreiben: '''root_ca'''
 +
** Signatur Algorithmus '''SHA-256'''
 +
** Vorlage für das neue Zertifikat: '''Vorlage_Server'''
 +
** '''Knopf Übernehmen drücken'''
 +
* Besitzer
 +
** Interner Name: '''vpn_server'''
 +
** Länder Code: DE
 +
** Bundesland, Kreis: NRW
 +
** Ort: BOCHUM
 +
** Firma: local
 +
** Firmenabteilung: it
 +
** Üblicher Name:  '''vpn_server'''
 +
** E-Mail Adresse: xca@mail.com
 +
* Knopf '''Erstelle einen neuen Schlüssel''' drücken
 +
** Name: '''vpn_server_key'''
 +
** SchlüsselTyp: '''RSA'''
 +
** Schlüssellänge: '''1024 bit''' (alternativ 2048 bit)
 +
* Knopf '''Erstellen''' drücken
 +
* Erweiterungen
 +
** Zeitspanne: '''5 Jahre'''
 +
* Nochmal unter Herkunft den Signatur Algorithmus prüfen
 +
** Signatur Algorithmus '''SHA-256'''
 +
** '''OK'''
 +
{| {{prettytablecenternoboarder}}
 +
|-----
 +
|[[Bild:ServerCert_1.png|thumb|200px|Server Zertifikat: Herkunft]]
 +
|[[Bild:ServerCert_3.png|thumb|200px|Server Zertifikat: Besitzer]]
 +
|[[Bild:ServerCert_2.png|thumb|200px|Server Zertifikat: Neuer Schlüssel]]
 +
|-----
 +
|}
 +
Für jeden '''Client''', der sich einwählen soll jetzt ein eigenes Zertifikat
 +
* Herkunft
 +
** Verwende das Zertifikat zum Unterschreiben: '''root_ca'''
 +
** Signatur Algorithmus '''SHA-256'''
 +
** Vorlage für das neue Zertifikat: '''Vorlage_Client'''
 +
** '''Knopf Übernehmen drücken'''
 +
* Besitzer
 +
** Interner Name: '''vpn_client1'''
 +
** Länder Code: DE
 +
** Bundesland, Kreis: NRW
 +
** Ort: BOCHUM
 +
** Firma: local
 +
** Firmenabteilung: it
 +
** Üblicher Name:  '''vpn_client1'''
 +
** E-Mail Adresse: xca@mail.com  '''hier könnte auch die E-Mail Adresse des entsprechenden Users eingegeben werden'''
 +
* Knopf '''Erstelle einen neuen Schlüssel''' drücken
 +
** Name: '''vpn_client1_key'''
 +
** SchlüsselTyp: '''RSA'''
 +
** Schlüssellänge: '''1024 bit''' (alternativ 2048 bit)
 +
* Knopf '''Erstellen''' drücken
 +
* Erweiterungen
 +
** Zeitspanne: '''365 Tage'''
 +
* Nochmal unter Herkunft den Signatur Algorithmus prüfen
 +
** Signatur Algorithmus '''SHA-256'''
 +
** '''OK'''
 +
So können Zertifikate für weitere User (vpn_client2, vpn_client3) erzeugt werden.
 +
{| {{prettytablecenternoboarder}}
 +
|-----
 +
|[[Bild:ClientCert_1.png|thumb|200px|Client Zertifikat: Herkunft]]
 +
|[[Bild:ClientCert_2.png|thumb|200px|Client Zertifikat: Besitzer]]
 +
|[[Bild:ClientCert_3.png|thumb|200px|Client Zertifikat: Neuer Schlüssel]]
 +
|-----
 +
|}
 +
Fertig, wir haben nur drei Zertifikate erstellt
 +
{| {{prettytablecenternoboarder}}
 +
|-----
 +
|[[Bild:AllCert.png|thumb|200px|Alle Zertifikate]]
 +
|-----
 +
|}
 +
 +
== Schlüssel exportieren ==
 +
Für jeden Client müssen wir nun seinen eigenen Schlüssel exportieren, dazu
 +
* ''Private Schlüssel'' den Client Schlüssel auswählen
 +
* Export anklicken
 +
** Dateiname: '''c:\vpn_clientN_key.pem''' (oder beliebigen anderen Pfad)
 +
** Exportformat: '''PEM'''
 +
** Den privaten Teil des Schlüssels mit exportieren '''JA'''
 +
** Exportieren als PKCS#8 '''NEIN'''
 +
** Den Schlüssel mit einem Passwort sichern '''JA''' (das Passwort muss der Client beim Verbindungsaufbau eingeben)
 +
** '''OK'''
 +
* Passwort
 +
** Passwort zweimal eingeben
 +
{| {{prettytablecenternoboarder}}
 +
|-----
 +
|[[Bild:Client_Key_Export_1.png|thumb|200px|Client Key wählen]]
 +
|[[Bild:Client_Key_Export_2.png|thumb|200px|Schlüssel Export Einstellungen]]
 +
|[[Bild:Client_Key_Export_3.png|thumb|200px|Passwort eingeben]]
 +
|-----
 +
|}
 +
Den Schlüssel für den Server exportieren:
 +
* ''Private Schlüssel'' den Server Schlüssel auswählen
 +
* Export anklicken
 +
** Dateiname: '''c:\vpn_server_key.pem''' (oder beliebigen anderen Pfad)
 +
** Exportformat: '''PEM'''
 +
** Den privaten Teil des Schlüssels mit exportieren '''JA'''
 +
** Exportieren als PKCS#8 '''NEIN'''
 +
** Den Schlüssel mit einem Passwort sichern '''NEIN''' (wir können beim Booten des DDWRT kein Passwort eingeben)
 +
** '''OK'''
 +
{| {{prettytablecenternoboarder}}
 +
|-----
 +
|[[Bild:Server_Key_Export.png|thumb|200px|Server Key Export Einstellungen]]
 +
|-----
 +
|}
 +
== Zertifikate exportieren ==
 +
Jetzt müssen noch alle drei Zertifikate exportiert werden, dazu die Zertifikate nacheinander auswählen und auf Export klicken:
 +
* '''root_ca'''
 +
** Dateiname: '''c:\root_ca.crt''' (oder beliebigen anderen Pfad)
 +
** Exportformat: '''PEM'''
 +
* '''vpn_server'''
 +
** Dateiname: '''c:\vpn_server.crt'''
 +
** Exportformat: '''PEM'''
 +
* '''vpn_clientN'''
 +
** Dateiname: '''c:\vpn_clientN.crt'''
 +
** Exportformat: '''PEM'''
 +
{| {{prettytablecenternoboarder}}
 +
|-----
 +
|[[Bild:Export_Cert_1.png|thumb|200px|Zertifikat wählen]]
 +
|[[Bild:Export_Cert_2.png|thumb|200px|Root CA Zertifikat Export]]
 +
|[[Bild:Export_Cert_3.png|thumb|200px|Server Zertifikat Export]]
 +
|[[Bild:Export_Cert_4.png|thumb|200px|Client Zertifikat Export]]
 +
|-----
 +
|}
 +
== Diffie-Hellman Parameter erzeugen ==
 +
Zusammen mit XCA sollte OPENSSL installiert worden sein und sich auch im Pfad befinden, sodass wir auf der Kommandozeile folgenden Befehl ausführen können um die Diffie-Hellman Parameter zu erzeugen. Das ist nötig, weil das sehr lange dauert und der User bei der Anmeldung nicht ewig warten soll. Die Parameter sind geheim und nur für den VPN-Server bestimmt.
 +
'''C:\>openssl dhparam -outform PEM -out dh1024.pem 1024'''
 +
Loading 'screen' into random state - done
 +
Generating DH parameters, 1024 bit long safe prime, generator 2
 +
This is going to take a long time
 +
...................................................................+............
 +
................................................................................
 +
[einige weitere Zeilen]
 +
..................++*++*++*
 +
Für 2048 Bit kann selbstverständlich auch 2048 angegeben werden.
 +
 +
== Ergebnis ==
 +
Jetzt sind wir fertig und haben wir die folgenden sechs Dateien (4 + 2 je Client) erzeugt:
 +
dh1024.pem
 +
root_ca.crt
 +
vpn_server.crt
 +
vpn_server_key.pem
 +
vpn_client1.crt
 +
vpn_client1_key.pem
 +
= OpenVpn Server unter DDWRT konfigurieren =
 +
Jetzt müssen die erzeugten Daten auf den Router kopiert werden, dazu sollte man sicher sein im NVRAM noch genug Platz zu haben. Den Verfügbaren Platz kann im WEB-Interface unter Administration/Command mit dem Kommando '''nvram show | grep size''' ermitteln. Laut
 +
[http://www.dd-wrt.com/wiki/index.php/VPN_%28the_easy_way%29_v24%2B DDWRT Wiki] werden bei einer Schlüssellänge von 1024 Bit ca. 5200 Byte benötigt und bei 2048 Bit ca. 6000 Byte.
 +
== Services/VPN ==
 +
* Start OpenVPN: '''Enable'''
 +
* Start type: '''Wan Up'''
 +
* Public Server Cert: Inhalt von '''root_ca.crt''' per copy&pase einfügen
 +
* Public Client Cert: Inhalt von '''vpn_server.crt''' einfügen
 +
* Private Client Key: Inhalt von '''vpn_server_key.pem''' einfügen
 +
* DH PEM: Inhalt von '''dh1024.pem''' einfügen
 +
* OpenVPN Config
 +
push "route 192.168.66.0 255.255.255.0"
 +
server 192.168.77.0 255.255.255.0
 +
verb 5
 +
dev tun0
 +
proto udp
 +
keepalive 10 120
 +
dh /tmp/openvpn/dh.pem
 +
ca /tmp/openvpn/ca.crt
 +
cert /tmp/openvpn/cert.pem
 +
key /tmp/openvpn/key.pem
 +
* '''Apply Settings'''
 +
Hierbei eventuell die beiden ersten Zeilen anpassen:
 +
push "route 192.168.66.0 255.255.255.0"
 +
192.168.66.0 ist der '''Adressbereich des LAN''' mit dem der VPN-Client hinterher verbunden werden soll.
 +
server 192.168.77.0 255.255.255.0
 +
192.168.77.0 ist der '''Adressbereich aus dem der VPN-Client seine IP bekommt'''
 +
== Administration/Command  ==
 +
Jetzt müssen noch Firewall regeln konfiguriert werden:
 +
iptables -I INPUT 2 -i vlan1 -p udp --dport 1194 -j ACCEPT
 +
iptables -I INPUT 2 -i tun0 -j ACCEPT
 +
iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
 +
iptables -I FORWARD -i tun0 -o br0 -j ACCEPT
 +
und dann den Button '''Save Firewall''' drücken.
 +
= Client mit OpenVPN GUI konfigurieren =
 +
Auf dem Windows Rechner OpenVPN GUI installieren. Am einfachsten konfiguriert man OpenVPN GUI indem man die folgenden Dateien direkt in das Config Verzeichnis '''c:\Programme\OpenVPN\config\''' kopiert:
 +
root_ca.crt
 +
vpn_client1.crt
 +
vpn_client1_key.pem
 +
Dazu erzeugt man im selben Verzeichnis eine Datei mit der Endung ovpn, zum Beispiel '''home.ovpn''' mit dem Inhalt:
 +
# (Internet-)Adresse des VPN Servers
 +
remote ''meineadresse.dyndns.org''
 +
ns-cert-type server
 +
client
 +
dev tun0
 +
proto udp
 +
resolv-retry infinite
 +
nobind
 +
persist-key
 +
persist-tun
 +
float
 +
ca root_ca.crt
 +
cert vpn_client1.crt
 +
key vpn_client1_key.pem
 +
verb 3
 +
= Verbindung aufbauen =
 +
Rechtsklick auf das kleine Traysymbol '''Connect'''
 +
= Verbindung aufbauen =
 +
Rechtsklick auf das kleine Traysymbol '''Disconnect'''

Aktuelle Version vom 7. März 2011, 16:50 Uhr

Hier eine Anleitung um einen zertifikatsbasierten OpenVPN Server unter DDWRT einzurichten.

Theorie

Zertifikate und Schlüssel

Bei einem VPN Server hat man generell zwei Möglichkeiten der Autorisierung:

  • über einen Schlüssel (preshared key)
  • mit Zertifikaten

Es gibt einige Unterschiede, zwischen Zertifikaten und Schlüsseln:

  • Nutzt man Zertifikate muss man für neue Nutzer keine Einstellungen am Server verändern.
  • Nutzt man preshared keys muss der Schlüssel für jeden Client-Benutzer im VPN-Server eingetragen werden.
  • Oft gibt es nur die Möglichkeit ein einziges Passwort festzulegen was dazu führt, dass alle Clients dasselbe Passwort nutzen.
    • Will man in diesem Fall einem Client das Nutzungsrecht entziehen, so muss man das Passwort ändern und allen rechtmäßigen Clients das neue Passwort zukommen lassen. Das ist bei einer großen Anzahl von Benutzern eher unpraktisch.
    • Nutzt man nur ein Passwort kann man nicht mehr sehen, welche Nutzer sich einloggen bzw. eingeloggt haben, da alle dasselbe Passwort nutzen.
  • Bei Zertifikaten muss der Server die Clients vorher nicht kennen, er kennt nur eine Stelle, nämlich die CA (Certificate Authority, Zertifizierungsstelle). Die CA stelt dem User ein Zertifikat aus, welches besagt, dass es einem User erlauft ist den Server zu nutzen.

Wie geht das mit diesen Zertifikaten?

Im Prinzip ist es ganz einfach:

Zertifikate erzeugen

  • jeder Teilnehmer (CA, Server und jeder Benutzer) erzeugen sich (im Idealfall selber) einen asymmetrischen RSA-Schlüssel, bestehend aus einem öffentlichen Schlüssel und einem privaten Schlüssel

(in diesem Tutorial werden alle Schlüssel auf einem Computer erzeugt, da ich selber der einzige Nutzer bin und nur verschiedene Geräte habe. Eventuell werde ich später auch einmal schildern, wie man das machen kann, dass Clients ihre Schlüssel selber erzeugen)

  • Die CA hat die Aufgabe einen öffentlichen Schlüssel an eine Identität zu binden, das ist das Zertifikat.
Ein Zertifikat für einen User enthält in meinem Beispiel die folgenden Informationen:
Seriennummer 3:
Ich die CA bestätige, dass
der öffentlichen Schlüssel Pub_X
dem User Y gehört.
Der User ist aus Deutschland, NRW, Bochum, Firma local, Abteilung it
Diese Aussage ist gültig von 1.1.2010 bis zum 1.1.2011
Unterschrift der CA
Dieses Zertifikat wurde unterschrieben mit dem privaten Schlüssel der CA und jeder, der den öffentlichen Schlüssel der CA kennt, kann dieses Zertifikat prüfen. Erstellen und Verändern kann man es nur mit dem privaten Schlüssel der CA.
Es gibt auch noch Zertifikate für den VPN-Server und die CA selber, das Zertifikat der CA besagt:
Seriennummer 1:
Ich die CA bestätige, dass
der öffentlichen Schlüssel Pub_Z
mir selber gehört.
Ich bin aus Deutschland, NRW, Bochum, Firma local, Abteilung it
Diese Aussage ist gültig von 1.1.2010 bis zum 1.1.2020
Unterschrift der CA
Das Zertifikat des Servers besagt:
Seriennummer 2:
Ich die CA bestätige, dass
der öffentlichen Schlüssel Pub_S
Dem VPN-Server S gehört.
Der VPN-Server ist aus Deutschland, NRW, Bochum, Firma local, Abteilung it
Diese Aussage ist gültig von 1.1.2010 bis zum 1.1.2015
Unterschrift der CA

Zertifikatsbasierte Anmeldung

Soll nun eine Verbindung zu einem VPN-Server aufgebaut werden geht das im Prinzip so:

  • Client:
"Hallo VPN Server ich bin der Client X, hier mein Zertifikat Cert_X."
  • Server:
Prüft das Zertifikat mit dem öffentlichen Schlüssel der CA
"Alles OK, ich weiss jetzt dass der Client X den öffentlichen Schlüssel Pub_X hat."
"Aber das kann mir ja jeder sagen, dass sind ja alles öffentliche Informationen."
"Wenn Du mir jetzt noch beweisen kannst, dass Du auch den privaten Schlüssel Priv_X von Client X hast, dann glaube ich, dass ich mit Client X spreche."
"Dazu habe hier mir mal eine Zufallszahl Z ausgedacht und diese mit Pub_X verschlüsselt, nur mir Priv_X kann man die entschlüsseln. So lieber Client, bitte zeig mir mal, dass Du das kannst, hier ist sie: enc(z)."
  • Client:
entschlüsselt enc(z) mit seinem privaten Schlüssel Priv_X
"Nichts leichter als das, hier ist die Zufallszahl: Z"
  • Server:
Prüft, ob Z wirklich Z ist
"Prima, ich lass dich jetzt rein."

Das ist grob das Prinzip, das Zeigt, warum der Server den Client vorher nicht kennen muss und sich trotzdem Sicher sein kann, mit dem Client zu reden. Um jetzt noch Angriffe vom Man-in-the-Middle auszuschließen ist das Protokoll ein wenig komplizierter, worauf ich an dieser Stelle nicht eingehen möchte. Auch hat der Client die Möglichkeit das selbe Verfahren noch mal mit dem Server durchzuführen, um sicher zu stellen, dass er auch wirklich mit dem Server verbunden ist.

User sperren

Das ist eine nicht so triviale Sache, denn der User hat ja das Zertifikat und der Server kennt den User ja gar nicht. Will man nun einen User sperren, erzeugt die CA eine sogenannte Certificate Revocation List (CRL). Da steht dann drin:

Certificate Revocation List
Ich die CA teile mit, das die Zertifikate mit den folgenden Seriennummern ungültig sind:
Seriennummer 4
Seriennummer 5
Unterschrift der CA

Diese Liste muss nun allen vorliegen, die ein Zertifikat der CA prüfen sollen. Das ist in erster Linie der VPN-Server, wenn die Clients auch die Zertifikate der Server prüfen, müssten auch diese zugriff auf die jeweils aktuelle Version der CRL haben. Wichtig: Um eine solche Liste später erzeugen zu können, muss die CA natürlich wissen, welche Zertifikate Sie überhaupt ausgestellt hat, denn Sie kann das Zertifikat nur wiederrufen, wenn sie dessen Seriennummer kennt.

Voraussetzungen

Genug Theorie, legen wir los mit dem praktischen Teil. Besorgt Euch folgendes:

PKI erzeugen

Hier werden Schlüssel und Zertifikate erzeugt.

XCA laden und installieren

  • Zuerst XCA hier herunterladen.
  • Dann XCA installieren, das kann wohl jeder selbst.
  • XCA Starten

Datenbank anlegen

XCA speichert alle Schlüssel und Zertifikate in einer Datenbank, die zuerst angelegt werden muss, was mit Datei/New Database initiiert wird. Dann einen Namen für die Datenbank angeben und ein Passwort vergeben. Nur mit dieser Datei und dem Passwort kann man später Veränderungen vornehmen, also gut merken. Achtung: Das Passwort aber auch nicht zu leicht wählen, denn wer die Datei und Passwort hat erzeugt sich selber Zertifikate und kann sich dann auch am VPN-Server anmelden (ohne Veränderungen am VPN-Server vornehmen zu müssen - das ist übrigens der Sinn der Zertifikate)

New Database
New Database Name
Password for Database

XCA Optionen

Unter Datei/Optionen SHA-256 als Standard Hash Algorithmus einstellen.

Default Hash: SSH-256

Vorlagen erstellen

Damit man später vieles einfacher hat legen wir nun zuerst Templates an. Kann man drüber streiten, ob das für die CA und die Server sinnvoll ist, für die Clients lohnt es sich auf jeden Fall. Unter der Lasche Vorlagen den Knopf Neues Template und dann zuerst die CA Vorlage:

  • Preset Template Values: CA
  • Besitzer
    • Interner Name: Vorlage_CA
    • Länder Code: DE
    • Bundesland, Kreis: NRW (bzw. Euer Bundesland)
    • Ort: BOCHUM (bzw. Euren Ort)
    • Firma: local
    • Firmenabteilung: it
    • Üblicher Name: (leer lassen)
    • E-Mail Adresse: xca@mail.com (oder die eigene Adresse)
  • Erweiterungen
    • Zeitspanne: 10 Jahre
Vorlage CA 1
Vorlage CA 2
Vorlage CA 3
Vorlage CA 4

Dann die Vorlage für den Server:

  • Preset Template Values: HTTPS_server
  • Besitzer
    • Interner Name: Vorlage_Server
    • Länder Code: DE
    • Bundesland, Kreis: NRW (bzw. Euer Bundesland)
    • Ort: BOCHUM (bzw. Euren Ort)
    • Firma: local
    • Firmenabteilung: it
    • Üblicher Name: (leer lassen)
    • E-Mail Adresse: xca@mail.com (oder die eigene Adresse)
  • Erweiterungen
    • Zeitspanne: 5 Jahre
Vorlage Server 1
Vorlage Server 2
Vorlage Server 3
Vorlage Server 4

Zuletzt die Vorlage für die Clients:

  • Preset Template Values: HTTPS_client
  • Besitzer
    • Interner Name: Vorlage_Client
    • Länder Code: DE
    • Bundesland, Kreis: NRW (bzw. Euer Bundesland)
    • Ort: BOCHUM (bzw. Euren Ort)
    • Firma: local
    • Firmenabteilung: it
    • Üblicher Name: (leer lassen)
    • E-Mail Adresse: xca@mail.com (oder die eigene Adresse)
  • Erweiterungen
    • Zeitspanne: 365 Tage
Vorlage Client 1
Vorlage Client 2
Vorlage Client 3
Vorlage Client 4

Zertifikate erstellen

Jetzt können wir die Zertifikate erstellen, dabei erzeugen wir gleichzeitig die Schlüssel.
Wir fangen an mit dem Root-Zertifikat, dazu unter der Lasche Zertifikate den Knopf Neues Zertifikat.

  • Herkunft
    • Erstelle ein Selbst signiertes Zertifikat mit der Seriennummer 1
    • Signatur Algorithmus SHA-256
    • Vorlage für das neue Zertifikat: Vorlage_CA
    • Knopf Übernehmen drücken (das füllt die restlichen Felder mit denen der Vorlage aus)
  • Besitzer
    • Interner Name: root_ca
    • Länder Code: DE
    • Bundesland, Kreis: NRW
    • Ort: BOCHUM
    • Firma: local
    • Firmenabteilung: it
    • Üblicher Name: root_ca
    • E-Mail Adresse: xca@mail.com
  • Knopf Erstelle einen neuen Schlüssel drücken
    • Name: root_ca_key
    • SchlüsselTyp: RSA
    • Schlüssellänge: 1024 bit (auch 2048 bit sind möglich, benötigen dann aber mehr Speicher im NVRAM des Routers)
  • Knopf Erstellen drücken
  • Erweiterungen
    • Zeitspanne: 10 Jahre
  • Nochmal unter Herkunft den Signatur Algorithmus prüfen
    • Signatur Algorithmus SHA-256
    • OK
Root CA Zertifikat: Herkunft
Root CA Zertifikat: Besitzer
Root CA Zertifikat: Neuer Schlüssel

Jetzt das Zertifikat für den VPN-Server

  • Herkunft
    • Verwende das Zertifikat zum Unterschreiben: root_ca
    • Signatur Algorithmus SHA-256
    • Vorlage für das neue Zertifikat: Vorlage_Server
    • Knopf Übernehmen drücken
  • Besitzer
    • Interner Name: vpn_server
    • Länder Code: DE
    • Bundesland, Kreis: NRW
    • Ort: BOCHUM
    • Firma: local
    • Firmenabteilung: it
    • Üblicher Name: vpn_server
    • E-Mail Adresse: xca@mail.com
  • Knopf Erstelle einen neuen Schlüssel drücken
    • Name: vpn_server_key
    • SchlüsselTyp: RSA
    • Schlüssellänge: 1024 bit (alternativ 2048 bit)
  • Knopf Erstellen drücken
  • Erweiterungen
    • Zeitspanne: 5 Jahre
  • Nochmal unter Herkunft den Signatur Algorithmus prüfen
    • Signatur Algorithmus SHA-256
    • OK
Server Zertifikat: Herkunft
Server Zertifikat: Besitzer
Server Zertifikat: Neuer Schlüssel

Für jeden Client, der sich einwählen soll jetzt ein eigenes Zertifikat

  • Herkunft
    • Verwende das Zertifikat zum Unterschreiben: root_ca
    • Signatur Algorithmus SHA-256
    • Vorlage für das neue Zertifikat: Vorlage_Client
    • Knopf Übernehmen drücken
  • Besitzer
    • Interner Name: vpn_client1
    • Länder Code: DE
    • Bundesland, Kreis: NRW
    • Ort: BOCHUM
    • Firma: local
    • Firmenabteilung: it
    • Üblicher Name: vpn_client1
    • E-Mail Adresse: xca@mail.com hier könnte auch die E-Mail Adresse des entsprechenden Users eingegeben werden
  • Knopf Erstelle einen neuen Schlüssel drücken
    • Name: vpn_client1_key
    • SchlüsselTyp: RSA
    • Schlüssellänge: 1024 bit (alternativ 2048 bit)
  • Knopf Erstellen drücken
  • Erweiterungen
    • Zeitspanne: 365 Tage
  • Nochmal unter Herkunft den Signatur Algorithmus prüfen
    • Signatur Algorithmus SHA-256
    • OK

So können Zertifikate für weitere User (vpn_client2, vpn_client3) erzeugt werden.

Client Zertifikat: Herkunft
Client Zertifikat: Besitzer
Client Zertifikat: Neuer Schlüssel

Fertig, wir haben nur drei Zertifikate erstellt

Alle Zertifikate

Schlüssel exportieren

Für jeden Client müssen wir nun seinen eigenen Schlüssel exportieren, dazu

  • Private Schlüssel den Client Schlüssel auswählen
  • Export anklicken
    • Dateiname: c:\vpn_clientN_key.pem (oder beliebigen anderen Pfad)
    • Exportformat: PEM
    • Den privaten Teil des Schlüssels mit exportieren JA
    • Exportieren als PKCS#8 NEIN
    • Den Schlüssel mit einem Passwort sichern JA (das Passwort muss der Client beim Verbindungsaufbau eingeben)
    • OK
  • Passwort
    • Passwort zweimal eingeben
Client Key wählen
Schlüssel Export Einstellungen
Passwort eingeben

Den Schlüssel für den Server exportieren:

  • Private Schlüssel den Server Schlüssel auswählen
  • Export anklicken
    • Dateiname: c:\vpn_server_key.pem (oder beliebigen anderen Pfad)
    • Exportformat: PEM
    • Den privaten Teil des Schlüssels mit exportieren JA
    • Exportieren als PKCS#8 NEIN
    • Den Schlüssel mit einem Passwort sichern NEIN (wir können beim Booten des DDWRT kein Passwort eingeben)
    • OK
Server Key Export Einstellungen

Zertifikate exportieren

Jetzt müssen noch alle drei Zertifikate exportiert werden, dazu die Zertifikate nacheinander auswählen und auf Export klicken:

  • root_ca
    • Dateiname: c:\root_ca.crt (oder beliebigen anderen Pfad)
    • Exportformat: PEM
  • vpn_server
    • Dateiname: c:\vpn_server.crt
    • Exportformat: PEM
  • vpn_clientN
    • Dateiname: c:\vpn_clientN.crt
    • Exportformat: PEM
Zertifikat wählen
Root CA Zertifikat Export
Server Zertifikat Export
Client Zertifikat Export

Diffie-Hellman Parameter erzeugen

Zusammen mit XCA sollte OPENSSL installiert worden sein und sich auch im Pfad befinden, sodass wir auf der Kommandozeile folgenden Befehl ausführen können um die Diffie-Hellman Parameter zu erzeugen. Das ist nötig, weil das sehr lange dauert und der User bei der Anmeldung nicht ewig warten soll. Die Parameter sind geheim und nur für den VPN-Server bestimmt.

C:\>openssl dhparam -outform PEM -out dh1024.pem 1024
Loading 'screen' into random state - done
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
...................................................................+............
................................................................................
[einige weitere Zeilen]
..................++*++*++*

Für 2048 Bit kann selbstverständlich auch 2048 angegeben werden.

Ergebnis

Jetzt sind wir fertig und haben wir die folgenden sechs Dateien (4 + 2 je Client) erzeugt:

dh1024.pem 
root_ca.crt
vpn_server.crt
vpn_server_key.pem
vpn_client1.crt
vpn_client1_key.pem

OpenVpn Server unter DDWRT konfigurieren

Jetzt müssen die erzeugten Daten auf den Router kopiert werden, dazu sollte man sicher sein im NVRAM noch genug Platz zu haben. Den Verfügbaren Platz kann im WEB-Interface unter Administration/Command mit dem Kommando nvram show | grep size ermitteln. Laut DDWRT Wiki werden bei einer Schlüssellänge von 1024 Bit ca. 5200 Byte benötigt und bei 2048 Bit ca. 6000 Byte.

Services/VPN

  • Start OpenVPN: Enable
  • Start type: Wan Up
  • Public Server Cert: Inhalt von root_ca.crt per copy&pase einfügen
  • Public Client Cert: Inhalt von vpn_server.crt einfügen
  • Private Client Key: Inhalt von vpn_server_key.pem einfügen
  • DH PEM: Inhalt von dh1024.pem einfügen
  • OpenVPN Config
push "route 192.168.66.0 255.255.255.0"
server 192.168.77.0 255.255.255.0
verb 5
dev tun0
proto udp
keepalive 10 120
dh /tmp/openvpn/dh.pem
ca /tmp/openvpn/ca.crt
cert /tmp/openvpn/cert.pem
key /tmp/openvpn/key.pem
  • Apply Settings

Hierbei eventuell die beiden ersten Zeilen anpassen:

push "route 192.168.66.0 255.255.255.0"

192.168.66.0 ist der Adressbereich des LAN mit dem der VPN-Client hinterher verbunden werden soll.

server 192.168.77.0 255.255.255.0

192.168.77.0 ist der Adressbereich aus dem der VPN-Client seine IP bekommt

Administration/Command

Jetzt müssen noch Firewall regeln konfiguriert werden:

iptables -I INPUT 2 -i vlan1 -p udp --dport 1194 -j ACCEPT
iptables -I INPUT 2 -i tun0 -j ACCEPT
iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
iptables -I FORWARD -i tun0 -o br0 -j ACCEPT

und dann den Button Save Firewall drücken.

Client mit OpenVPN GUI konfigurieren

Auf dem Windows Rechner OpenVPN GUI installieren. Am einfachsten konfiguriert man OpenVPN GUI indem man die folgenden Dateien direkt in das Config Verzeichnis c:\Programme\OpenVPN\config\ kopiert:

root_ca.crt
vpn_client1.crt
vpn_client1_key.pem

Dazu erzeugt man im selben Verzeichnis eine Datei mit der Endung ovpn, zum Beispiel home.ovpn mit dem Inhalt:

# (Internet-)Adresse des VPN Servers
remote meineadresse.dyndns.org 
ns-cert-type server
client
dev tun0
proto udp
resolv-retry infinite
nobind
persist-key
persist-tun
float
ca root_ca.crt
cert vpn_client1.crt
key vpn_client1_key.pem
verb 3

Verbindung aufbauen

Rechtsklick auf das kleine Traysymbol Connect

Verbindung aufbauen

Rechtsklick auf das kleine Traysymbol Disconnect