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

Von "http://www.lug-wr.de/wiki/index.php/OpenVPN"

Diese Seite wurde bisher 16649 mal abgerufen. Diese Seite wurde zuletzt geändert um 01:04, 14. Jan 2006. Inhalt ist verfügbar unter der GNU Free Documentation License 1.2.