OpenVPN
Inhaltsverzeichnis |
Einleitung
OpenVPN ist eine Lösung, um einen Rechner, der mit dem Internet verbunden ist, in das lokale Netzwerk zu holen, ohne dabei ein Sicherheitsrisiko einzugehen.
Warum
Ich verwende OpenVPN, um einigen Freunden Zugang zu meinem Netzwerk zu gewähren, um mit ihnen besser Dateien austauschen zu können, aber auch das ich von überall auf meinen Server und dessen Dienste zugreifen kann wie z.B. Samba, IMAP und diverse andere Dienste.
Funktionsweise
OpenVPN installiert auf dem Rechner eine virtuelle Netzwerkkarte Tun oder Tap. Diese Netzwerkkarte nimmt die kommenden und gehenden Daten und packt sie, dann sendet OpenVPN die diese Daten zum Server bzw. Client dort werden sie wieder entpackt und der virtuellen Netzwerkkarte zur Verfügung gestellt. So entsteht der Eindruck, als wenn beide virtuellen Netzwerkkarten direkt mit einem Kabel verbunden wären.
OpenVPN Läuft für gewönlich auf dem Port 1194 und verwendet UDP Pakete, dies ist aber in der Konfiguration individuell anpassbar.
Installation
Windows
Zuerst wird das Installationspaket (openvpn-2.0*-install.exe) für OpenVPN und den TUN/TAP-Treiber von:
geholt.
Die Installtion erfolgt - wie unter Windows üblich - durch Starten der EXE-Datei und wiederholtem Klicken auf Next.
Danach findet sich das openvpn-Programm unter C:\Programme\OpenVPN\bin.
Als unprivilegierter Benutzer starten
Um den Tunnel als normaler Benutzer aufzubauen müssen die ACLs für den OpenVPN-Dienst angepasst werden. z.B. mit SetACL http://setacl.sourceforge.net/ oder Subinacl.exe http://www.microsoft.com/downloads/details.aspx?FamilyId=E8BA3E56-D8FE-4A91-93CF-ED6985E3927B&displaylang=en
zeigt die ACLs des OpenVPN-Dienstes an:
setacl -on openvpnservice -ot srv -actn list
setzt die ACLs für den OpenVPN-Service, so daß Benutzer den Dienst starten und beenden können:
setacl -on openvpnservice -ot srv -actn ace -ace "n:Benutzer;p:start_stop"
startet den Dienst via Kommandozeile:
sc start OpenVPNService
stoppt den Dienst via Kommandozeile:
sc start OpenVPNService
Linux (Debian)
Die Installation erfolgt unter Debian wie gewohnt mit apt-get
apt-get install openssl openvpn
Client GUI's
- kvpnc (http://home.gna.org/kvpnc/_de_DE/index.html) ein VPN-Clientprogramm für KDE (http://www.kde.org), dass nicht nur in der Lage ist, sich nur mit OpenVPN (http://openvpn.sf.net) zu verbinden sondern auch mit Cisco, PPtP, IPSec (FreeSWAN (http://www.freeswan.org/)/OpenSWAN (http://www.openswan.org/)).
Konfiguration
Einfache Host zu Host Verbindung
Die Host zu Host Verbindung ist wohl die einfachste Möglichkeit ein VPN aufzubauen.
Doch hat dieses Verfahren seine Nachteile in der Einfachheit, so ist nur eine Verbindung zwischen zwei Rechnern pro Konfiguration möglich.
Wenn mehr als ein Rechner eine Verbindung zum Server habe soll, muss man mehrere Konfigurationen schreiben dabei ist aber darauf zu achten das in jeder Konfiguration ein neuer Port für die Verbindung verwendet wird.
Für jede Konfiguration wird später eine Instanz von OpenVPN laufen die wiederum ihre eigene Virtuelle Netzwerkkarte hat, somit wird es irgendwann sehr umständlich für jede Verbindung die Firewall anzupassen und es ist besser dann über eine Server Lösung nach zu denken.
Szenario
Es soll eine VPN Verbindung zwischen zwei Rechnern aufgebaut werden. Dies soll nicht über SSL Zertifikate geschehen sondern über einen so genannten statischen Schlüssel.
Der Server hat die IP-Adresse 192.168.0.1 seine IP-Adresse der Virtuellen Netzwerkkarte soll 192.168.10.1 sein.
Der Client hat die IP-Adresse 192.168.0.2 seine IP-Adresse der Virtuellen Netzwerkkarte soll 192.168.10.2 sein.
openvpn --genkey --secret static.key
Diese Zeile erstellt einen statischen Schlüssel in der Datei static.key
Anschließend sollte die Datei über einen sicheren Weg auf beide Rechner gelangen z.B. über Diskette, USB-Stick oder eine verschlüsselte E-Mail
Server
openvpn --dev tun0 --remote 192.168.0.2 --ifconfig 192.168.10.1 192.168.10.2 --secret static.key
Diese Zeile in der Konsole eingeben um den Tunnel auf dem Server aufzubauen.
Eine Andere Möglichkeit ist es Konfigurationsdateien anzulegen in der alle Parameter für den Aufbau der VPN stehen.
######### # server.conf ######### dev tun0 remote 192.168.0.2 ifconfig 192.168.10.1 192.168.10.2 secret static.key
Client
openvpn --dev tun0 --remote 192.168.0.1 --ifconfig 192.168.10.2 192.168.10.1 --secret static.key
Diese Zeile in der Konsole eingeben um sich zum Tunnel auf dem Server zu verbinden.
Auch beim Client kann eine Konfigurationsdatei angelegt werden
######### # client.conf ######### dev tun0 remote 192.168.0.1 ifconfig 192.168.10.2 192.168.10.1 secret static.key
Host zu Host Verbindung - Server zu server (zwei Router/Netzwerke verbinden)
Senario
Einmal angenommen sie wollen zwei Server miteinander durch das Internet z.b. Router Firma Standort A und Firma Standort B oder halt mein Linux Router und der Linux Router eines Freundes. Zwischen diesen beiden soll der eindruck entstehen als ob alle Computer in beidem Netzwerken zu einem großem geh&oml;ren. Also sollten dann die DNS Server auf beiden Routern die einträge des jewals anderen kennen.
Server
Client
Spezial
DNS Zonen Tabellen Austauschen
DNS Server Netz_A (/etc/bind/named.conf.local)
zone "Netz_A" { type master; file "/etc/bind/db.Netz_A"; allow-transfer { 10.1.1.1; }; }; zone "Netz_B" { type slave; masters { 10.1.1.1; }; };
DNS Server Netz_B (/etc/bind/named.conf.local)
zone "Netz_B" { type master; file "/etc/bind/db.Netz_B"; allow-transfer { 10.2.1.1; }; }; zone "Netz_A" { type slave; masters { 10.2.1.1; }; };
IP Adressen
Wenn Zwei oder noch mehr Netze miteinander verbunden werden kann es vorkommen das beide Seiten die gleichen IP Adressen für ihre Rechner verwenden.
Diese Situation sollte generell vermieden werden! da es immer mit einem erheblichen Aufwand verbunden ist dann noch ein funktionierendes VPN aufzubauen.
Ich habe um dies zu vermeiden einfach ein 10.xxx.xxx.xxx Netz aufgebaut indem jedes Netzwerk eine neue stelle hinter der 10 zugewiesen bekommt.
Also:
Netz_A 10.1.xxx.xxx Netz_B 10.2.xxx.xxx
Global Ändern
Es giebt aber auch die Möglichkeit dem roter zu erklären das er Die netzwerke auf der Eingenden Seite mit einer anderen IP Adresse anzuspechen als der Zielrechner auf der andern Seite hat.
ALs Server für Mehrer Clients
Senario
CA mint OpenSSL
Ab jetzt gehe ich von einem Debian Linux System aus da ich diesen Dienst bisher nur auf meinem eigenen Server eingerichtet habe. Es sollte aber so oder so änlich auf jedem anderen Rechner gehen.
Erstellen von Server-Keys Normalerweise laeuft das erstellen eines Zertifikates in zwei von einander getrennten Schritten ab:
1. Der Betreiber enies Servers erstellt einen privaten Schluessel. Dieser enthaelt den genauen Namen/Bezeichnungen/Daten des Serverbetreibers. Diesen privaten Schluesel nennt man Request.
Befehl: CA.pl -newreq
2. Der Request wird nun an eine CA geschickt, die den Request mit ihrem Schluessel unterschreiben und zurueckschicken. Diesen unterschriebenen privaten Schluessel nennt man Zertifikat.
Befehl: CA.pl -sign
3. Um den Privaten Schluessel vor Missbrauch bei der Uebertragung oder durch die CA zu schuetzen, muss der Request mit einem Passwort geschuetzt sein. Wenn ein Server (z.B. der Apache) jedoch diesen Request verwenden wollte, dann muesste man beim starten des Apache immer das Passwort eingeben. Man kann das Passwort mit dem folgenden Befehl loeschen:
Befehl: openssl rsa < newreq.pem > newkey.pem
Grundlagen
Anlegen einer CA
cd /etc/openvpn
in das Verzeichnis wechseln in dem die CA angelegt werden soll
/usr/lib/ssl/misc/CA.pl -newca
Dieser Befehle legt das Verzeichnis demoCA in /etc/opnenvpn an, in ihm befindet sich nach der Angabe des Passwortes und der Daten der Private Schlüssel.
Das sieht dann ungefähr so aus.
root@debian:~> /usr/lib/ssl/misc/CA.pl -newca CA certificate filename (or enter to create) Making CA certificate ... Generating a 1024 bit RSA private key .......++++++ .++++++ writing new private key to './demoCA/private/cakey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:DE State or Province Name (full name) [Some-State]:Sachsen-Anhalt Locality Name (eg, city) []:Wernigerode Organization Name (eg, company) [Internet Widgits Pty Ltd]: Mein Netzwerk Organizational Unit Name (eg, section) []:VPN Common Name (eg, YOUR name) []:Ansgar Jazdzewski Email Address []:
Anlegen der Zertifikate
Jetzt werden noch Schlüssel und Zertifikate für den Server und die Clients benötigt: (Die Erstellung verläuft für Server und Clients gleich!)
1. Der private Schlüssel und eine Zertifikat-Anforderung:
tux@linux:~> /usr/lib/ssl/misc/CA.pl -newreq Using configuration from /etc/ssl/openssl.cnf Generating a 1024 bit RSA private key ..++++++ ..............................................................................................++++++ writing new private key to 'newreq.pem' Enter PEM pass phrase: Verifying password - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:DE State or Province Name (full name) [Some-State]:Sachsen-Anhalt Locality Name (eg, city) []:Wernigerode Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mein Netzwerk Organizational Unit Name (eg, section) []:VPN Common Name (eg, YOUR name) []:Client-1 Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Request (and private key) is in newreq.pem
erstellt eine Zertifikat-Anfrage inklusive dem privaten Schlüssel in der Datei newreq.pem.
2. Unterschreiben der Zertifikat-Anforderung mit CA-Key:
tux@linux:~> /usr/lib/ssl/misc/CA.pl -signreq Using configuration from /etc/ssl/openssl.cnf 7974:error:0E06D06C:configuration file routines:NCONF_get_string:no value:conf_lib.c:329:group=CA_default name=unique_subject Enter pass phrase for ./demoCA/private/cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Nov 29 13:43:20 2004 GMT Not After : Nov 29 13:43:20 2005 GMT Subject: countryName = DE stateOrProvinceName = Sachsen-Anhalt localityName = Wernigerode organizationName = Mein Netzwerk organizationalUnitName = VPN commonName = Client-1 X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 49:88:2F:9A:D6:E3:90:7F:5C:DE:56:F2:20:26:F9:74:2B:46:D4:7E X509v3 Authority Key Identifier: keyid:C6:AF:33:7D:F2:8F:22:1C:42:D9:F1:AD:7B:73:FE:4C:A2:C1:C8:94 DirName:/C=DE/ST=Berlin/L=Berlin/O=Humboldt-Universitaet zu Berlin/OU=Informatik/CN=Tux-CA serial:00 Certificate is to be certified until Nov 29 13:43:20 2005 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated Signed certificate is in newcert.pem
3. Erzeugen einer PKCS#12-Datei (mit CA- und Client-Zertifikat sowie privatem Schlüssel):
tux@linux:~> /usr/lib/ssl/misc/CA.pl -pkcs12 "Client-1" Enter pass phrase for newreq.pem: Enter Export Password: Verifying - Enter Export Password:
Die resultierende Datei newcert.p12 kann anschließend mit OpenVPN zur Authentifizierung verwendet werden. (newreq.pem und newcert.pem können gelöscht werden.)
Für 1 Server-Zertifikat und n Client-Zertifikate würde man also folgendes aufrufen:
# CA erstellen /usr/lib/ssl/misc/CA.pl -newca # Server-Zertifikat /usr/lib/ssl/misc/CA.pl -newreq /usr/lib/ssl/misc/CA.pl -signreq /usr/lib/ssl/misc/CA.pl -pkcs12 "Server-Zertifikat" mv newcert.p12 server.p12 rm newreq.pem newcert.pem # Client-1-Zertifikat /usr/lib/ssl/misc/CA.pl -newreq /usr/lib/ssl/misc/CA.pl -signreq /usr/lib/ssl/misc/CA.pl -pkcs12 "Client-1-Zertifikat" mv newcert.p12 client-1.p12 rm newreq.pem newcert.pem . . . # Client-n-Zertifikat /usr/lib/ssl/misc/CA.pl -newreq /usr/lib/ssl/misc/CA.pl -signreq /usr/lib/ssl/misc/CA.pl -pkcs12 "Client-n-Zertifikat" mv newcert.p12 client-n.p12 rm newreq.pem newcert.pem
Autorisierung mit OpenLDAP
OpenVPN ist in der Lage durch Plugins verschiedene Autorisierungsdienste zu nutzen z.b. Radius und LDAP, an dieser Stelle möchte ich den Weg für eine LDAP Autorisierung aufzeigen.
Der von LDAP liegt darin das eine Zentrale Verwaltung von Benutzern (auch f¨r andere Dienste) zur Verf¨gung steht.
Installation von OpenLDAP
Die Installation von LDAP unter Debian Linux ist gewohnt einfach mit mit folgendem Befehl.
apt-get install slapd
Konfiguration des LDAP Servers
Der LDAP Server ist ein Verzeichnisserver das heisst es muss eine Baumstrucktur aufgebaut werden die man in ldif Dateien beschreibt.
Generell kann unsere LDAP Server Konfiguration in die folgenden vier Teile zerlegt werden, wobei sich der letzte teil für jeden Benutzer wiederholt.
Anlegen des Stamms zu erkennen an objectClass: top
dn: dc=attanet,dc=de dc: attanet o: attanet objectClass: top objectClass: dcObject objectClass: organization
Anlegen eines neuen Astes mit Namen UserObjects
dn: ou=UserObjects,dc=attanet,dc=de objectClass: top objectClass: organizationalUnit ou: UserObjects
Anlegen des LDAP Administrator
dn: cn=admin,dc=attanet,dc=de cn: admin description: LDAP administrator objectClass: simpleSecurityObject objectClass: organizationalRole userPassword: Geheim
In den Ast UserObjects einen Benutzer "ansgar" einfügen
dn: uid=ansgar, ou=UserObjects,dc=attanet,dc=de objectclass: person objectclass: uidObject cn: Ansgar Jazdzewski sn: Jazdzewski uid: ansgar userPassword: Geheim
Fügt man nun die vier Teil zu einer ldif-Datei zusammen und f¨hrt si mit dem Befehl
slapadd -l /pfad/zur/datei.lidf
aus, dann ergibt sich folgende Struktur.
de | +- attanet -+ | +- UserObject -+ | +- ansgar | +- ... | +- ...
Anpassen der Server Konfiguration
In der Server Konfiguration muß nur die folgende Zeile hinzugefügt werden
auth-user-pass-verify /etc/openvpn/ldapauth.sh via-env
Das Skript zur LDAP Autorisierung
Die Datei /etc/openvpn/ldapauth.sh
#!/bin/sh ldapwhoami -x -h 127.0.0.1 -D uid=$username,ou=UserObjects,dc=attanet,dc=de -w $password if [ $? -eq 0 ]; then echo "LDAP auth OK" exit 0; else echo "LDAP auth ERROR" exit 1; fi
Anpassen der Client Konfiguration
In die Clent Konfiguration muß folgende Zeile eingefügt werden
auth-user-pass
Konfiguration
Server
Client
Links
- http://sarwiki.informatik.hu-berlin.de/OpenVPN_(deutsch) Eine Deutsche Anleitung