Aus Linux-Magazin 05/2009

Große VPNs einfach verwalten mit OpenVPN und Skripten

Foto: Charite

Individuelle Firewallregeln und Authentifizierungsmechanismen für jeden VPN-User sind mit OpenVPN kein Problem. Admins der renommierten Berliner Universitätsklinik Charité zeigen wie.

Barmherzigkeit (frz. Charité) ist es sicher nicht, die eine der größten Universitätskliniken Europas, die Charité [1] in Berlin, zu freier Software brachte. Wie in Unternehmen üblich, zählten harte Fakten, und in der Health-Care-Branche sind die Ansprüche an Sicherheit besonders hoch. Sichere Verschlüsselung ist da in vielen Fällen unabdingbar, und hier kommen so genannte virtuelle private Netze (VPNs) ins Spiel.

Das VPN der Charite umfasst über 3000 registrierte User, die ein Server mit Dual-Xeon-Prozessor (3,4 GHz, 2 GByte RAM) versorgt. Die Durchschnittslast dieser Maschine beträgt lediglich 0.02, obwohl meist 50 User angemeldet sind, von denen jeder rund 200 KByte pro Minute Datentraffic verursacht. Die klassischen Lösungen für diese Größenordnung verwenden IPsec und gelten als teuer, unhandlich und vor allem für die Firewall-Administration als sehr kompliziert zu verwalten.

Noch vor wenigen Jahren brauchte es für solche Anforderungen teuere Lösungen mit Geräten von Cisco und entsprechend geschulten und ausgebildeten Admins. Dank der freien VPN-Software OpenVPN [2] von James Yonan hat sich das aber nachhaltig geändert. Das Tool bietet einfache Konfiguration, hohe Sicherheit und flexible Scripting-Hooks.

Die mitgelieferte Sample-Konfiguration lässt sich fast beliebig erweitern. Zertifikate, Passwörter, spezielle Routingvorgaben, IP-Pools stehen ebenso zur Verfügung wie das automatische Zuweisen von Netzwerkeinstellungen via DHCP und Windows-spezifische Netzwerk-Funktionen.

OpenVPN: Skripte

Das Beste aber ist: OpenVPN ist skriptbar. Für jeden Benutzer, der sich mit dem Server verbindet, kann der Admin ein eigenes Programm spezifieren. So gibt er dem Client zum Beispiel bestimmte Rechte, setzt Routen und verbietet oder erlaubt über Firewalls wie IPtables den Zugriff auf interne Server. Mit Hilfe solcher Skripte erstellt der Admin ein komplettes, indivuelles Firewallkonzept für das VPN, auch das Masquerading der Tunnel-IPs ist da kein Problem.

Per-User-Authentifizierung

In der Charité bestand zudem die Anforderung, für die externen Benutzer unterschiedliche Authentifizierungsquellen zu nutzen: LDAP, Kerberos, ADS, Passwort- und eine IMAP-gestützte Authentisierung galt es für die VPN-Benutzer umzusetzen. Weil OpenVPN auch auf die Pluggable Authentication Modules zurückgreifen kann, bietet sich dafür PAM-per-User [3] an. Dieses PAM-Modul delegiert die Authentisierung einfach an andere Module, basierend auf der Datei »/etc/pam_per_user.map«.

Zunächst konfiguriert der Admin OpenVPN so, dass es PAM-per-User verwendet. Die Datei »/etc/pam.d/openvpn« sollte dazu so aussehen:

auth       required     pam_per_user.so.1
account    required     pam_permit.so

In »/etc/pam_per_user.map« trägt er dann die für die Benutzer gewünschten PAM-Module ein:

user1 : openvpn-ldap
user2 : openvpn-krb5
user3 : openvpn-imap

In diesem Beispiel authentifiziert sich »user1» gegen ein LDAP-Verzeichnis, weil PAM die Konfiguration der Datei »/etc/pam.d/openvpn-ldap« heranzieht:

auth       required     pam_env.so
auth       required     pam_ldap.so
account    required     pam_ldap.so

Der »user2« dagegen soll Kerberos verwenden, in »/etc/pam.d/openvpn-krb5« steht deshalb der Verweis auf die Kerberos-Bibliothek »pam_krb5.so«. Die eigentliche, bisweilen komplexe Kerberos-Konfiguration erfolgt via »/etc/krb5.conf«.

auth    requisite pam_krb5.so no_ ccache
account required  pam_permit.so

User3 soll sich über seine IMAP-Identität ausweisen. Daher findet sich in »/etc/pam.d/openvpn-imap«:

auth       required     pam_imap.so conf=/etc/pam.d/pam_imap.conf 
account    required     pam_imap.so conf=U/etc/pam.d/pam_imap.conf

Die Datei »/etc/pam.d/pam_imap.conf« spezifiziert, gegen welchen IMAP-Server PAM die übergebenen Username-Passwort-Kombination prüft:

PAM_PasswordString = Password:CertificateFile /usr/share/ssl/certs/imapd.pem 
PAM_Server0 = imapserver.example.com:143
PAM_BlockList = root, admin, Administrator,apache 
PAM_HashEnable = no
PAM_HashFile = /etc/pam_imap.gdbm
PAM_HashDelta = 20

Damit stehen auch Autentifizierungen gegen proprietäre Mechanismen zur Verfügung, solange es nur einen IMAP-Server im LAN gibt, der diese versteht.

Damit alle User sich wie beschrieben anmelden können, bestimmt der Admin als letzten Schritt in der OpenVPN-Konfiguration das PAM-Plugin. In »/etc/openvpn/server.conf« gibt der Parameter »openvpn« in der Zeile »plugin /usr/lib/openvpn/openvpn-auth-pam.so openvpn« an, dass OpenVPN die PAM-Konfigurationsdatei »/etc/pam.d/openvpn« nutzen soll. Auf Clientseite muss in der Konfiguration »auth-user-pass« eingetragen sein, damit der OpenVPN-Client den Benutzer nach Usernamen und Passwort fragt.

Abbildung 1: OpenVPN-graph zeigt den Ein- und Ausgangs-Traffic auf dem VPN-Server detailliert in Tages-, Wochen- oder Monats-Statistiken. .

Abbildung 1: OpenVPN-graph zeigt den Ein- und Ausgangs-Traffic auf dem VPN-Server detailliert in Tages-, Wochen- oder Monats-Statistiken. .

Individuelle Zertifikate

In der Charité erhält jeder Benutzer immer die gleiche statische IP-Adresse für seinen Tunnel-Endpunkt. Dies realisiert in OpenVPN die Option »client-config-dir«:

server 172.48.0.0 255.255.0.0
client-config-dir ccd

Basierend auf dem CN des durch den Client präsentierten X.509-Zertifikates nimmt OpenVPN die Datei: »/etc/openvpn/ccd/CN« für die individuelle Konfiguration des Clients her:

/etc/openvpn/ccd/# cat user1.charite.de
ifconfig-push 172.48.44.41 172.48.44.42
push "redirect-gateway"

Hier weist der Server dem Client mit dem CN »user1.charite.de« die statische IP Adresse 172.48.44.41 zu. Außerdem übermittelt er die Option »redirect-gateway« an den Client, sodass dessen gesamter Netzwerktraffic ab sofort durch den Tunnel geht. Auch explizite Routen darf der Admin hier setzen und an den Client weitergeben:

ifconfig-push 172.48.44.41 172.48.44.42
push "route 10.10.0.0 255.0.0.0"
push "route 192.168.1.0 255.255.0.0"

Dieses Vorgehen empfiehlt sich auch bei UMTS-Karten am Client, mit denen sich die Defaultroute unter Windows sonst nicht ändern lässt.

Routen-Maximum

Allerdings sollte der Server nicht zuviele Routen an den Client übermitteln, der Push-Buffer hat nämlich nur eine maximale Länge von 1024 Byte.

Findet ein Admin im Logfile von OpenVPN Einträge wie folgende, dann hat er dieses Limit überschritten für den genannten User (hier »user1.charite.de«):

Oct 18 16:43:53 ovpn-server[28631]: user1.charite.de/IP.add.res.se:33359 Maximum length of --push buffer (1024) has been exceeded. 

Wie lässt es sich aber verhindern, dass jemand ein fremdes X.509-Zertifikat nutzt? Ein böswilliger Client könnte das Zertifikat »username1.charite.de« präsentieren, aber zur Authentisierung die Daten von »user2« nutzen.

Der OpenVPN-Server muss also bei der Authentisierung prüfen, ob der CN des Zertifikats mit dem Benutzernamen der Authentifizierungsdaten übereinstimmt, und das übernimmt der Parameter »auth-user-pass-verify« in »/etc/openvpn/server.conf«:

auth-user-pass-verify /usr/local/scripts/ucn.pl via-env 

An dieses Perl-Skript gibt OpenVPN über Environment-Variablen Username und CN des Zertifikates. Eine Übergabe via Datei ist ebenfalls möglich. Das entsprechende Skript in Listing 1 ist eher unspektakulär: beim »split()« verbleibt im »common_name_array« als erstes Element der Username, der ja identisch zu dem in der Umgebungsvariable »username« übergebenen sein muss.

Listing 1:
»ucn.pl«

01 #!/usr/bin/perl -t
02 # OpenVPN --auth-user-pass-verify script.
03 # Only authenticate if username equals Ucommon_name.
04 # In OpenVPN config file: auth-user-pass-verify ./ucn.pl via-env
05 $username = $ENV{'username'};
06 $common_name = $ENV{'common_name'};
07 @common_name_array = split(/./, $common_Uname);
08 exit !(length($username) > 0 && Ulength($common_name) > 0 && $username eq U$common_name_array[0]);

Individuelle Firewall-Regeln für jeden Benutzer

Weil jeder User über sein Zertifikat seine eigene statische IP erhält, lassen sich beim Verbindungsaufbau für jeden Client spezifische Firewallregeln applizieren. Auch dafür bringt OpenVPN bereits die Mittel mit. In der »server.conf« geschieht dies über die »learn-address«-Option:

learn-address /usr/local/scripts/ovpnfwconf

OpenVPN ruft dieses Skript mit bis zu drei Parametern auf:

  • »Operation«: »add«,
    »delete« oder »update«. »add«
    kommt bei der Zuweisung einer IP zum Einsatz, zum Beispiel wenn der
    User sich einwählt und eine initiale Adresse erhält. In
    der Charite setzt jetzt ein individuelles Skript sofort die
    Firewallregeln. Wenn der User die Verbindung trennt, greift
    »delete«: OpenVPN verwirft die Client-Adresse, ein
    Skript löscht die Firewallregeln. Bei einem Reconnect des
    Clients übergibt OpenVPN »update«, es funktioniert
    ähnlich wie »delete« mit einem folgenden
    »add«.
  • »Adresse«: Die IP-Adresse im VPN, also jene Adresse
    die OpenVPN mittels »client-config-dir ccd« statisch
    vergeben hat.
  • »Common Name«: Der CN des X.509-Zertifikates.

Das an der Charite verwendete Skript »/usr/local/scripts/ovpnfwconf« ist dabei nur ein Wrapper, der das tatsächliche Skript mit Root-Privilegien aufruft, da IPtables diese benötigt:

#!/bin/sh
/usr/local/bin/bin-id-wrapper /usr/local/scripts/ovpncfg.pl $1 $2 $3 2>&1 | logger -t ovpnfwconf -p daemon.info 

Die eigentliche Arbeit verrichtet »/usr/local/scripts/ovpncfg.pl«, es erzeugt die IPtables-Regeln.

IPtables-Regeln generieren

Das Skript kann beliebig komplex sein, Listing 2 skizziert grob, was beim Anlegen der Regeln passiert, wobei »$IP« die statisch zugewiesene IP des VPN-Clients ist.

Listing 2: Firewallregeln
anlegen

01 # Eine eigene Tabelle für den User anlegen
02 iptables -N chain-$IP
03 # In der Forward-Table ist diese das Sprungziel für die Source-IP des Users:
04 iptables -I FORWARD -s $IP -j chain-$IP
05 #ESTABLISHED-Connections einfach ohne weiteres Matching durchlassen:
06 iptables -A chain-$IP -s $IP -m state --state RELATED,ESTABLISHED -j ACCEPT
07 # Nun folgen individuelle Regeln für den Benutzer, beispielsweise den Zugriff auf den Zielrechner $destHost, Port $destPort und das Protokoll $destProto:
10 iptables -A chain-$IP -p $destProto -s $IP -d $destHost --dport $destPort -j ACCEPT
11 # Oder dasselbe mit mehreren Ports mit --dports:
12 iptables -A chain-$IP -m multiport -p $destProto -s $IP -d $destHost --dports $destPort -j ACCEPT
14 # Vollzugriff auf einen Host:
15 iptables -A chain-$IP -s $IP -d $destHost -j ACCEPT
16 # Abschließend den ICMP-Traffic erlauben:
17 iptables -A chain-$IP -p icmp -s $IP -j ACCEPT
18 # und alles weitere verbieten:
19 iptables -A chain-$IP -s $IP -j DROP

Nach der Übergabe der Delete-Operation erfolgt das Löschen der Regeln und der Flush der Tabellen mit Kommandos wie:

iptables -D FORWARD -s $IP -j chain-$IP
iptables -F chain-$IP
iptables -X chain-$IP

Um etwa abschätzen zu können, wie viel Traffic ein User mit seiner Applikation über den VPN-Tunnel schickt, protokolliert OpenVPN beim Verbindungsaufbau die Anzahl der gesendeten und empfangenen Bytes, wenn der Admin noch die folgende Zeile in der Konfigurationsdatei einträgt:

client-disconnect /usrIlocal/scripts/ovpntraffic 

Das hier von OpenVPN bei der Trennung vom Client aufgerufene Disconnect-Skript »ovpntraffic«:

#!/bin/sh
echo $common_name: bytes_sent: $bytes_received bytes_received: $bytes_sent | logger -t ovpncfg.pl -p daemon.info 

protokolliert lediglich die Inhalte der OpenVPN-Umgebungsvariablen »$common_name«, »$bytes_received« und »$bytes_sent« an den Syslog-Daemon.

OpenVPN e.V.: Peine und
Notare

Auf der Cebit 2009 erfolgte die Gründung des europaweiten OpenVPN e. V. [8]. Dieser Verein möchte Anwendern und Admins ein Forum bieten, in dem sich Spezialisten austauschen, gemeinsam Lösungen finden und bei Bedarf professionellen Support erhalten. Das Linux Magazin hat zwei Vorstände nach Beispielen gefragt, wo OpenVPN seine Stärken im professionellen Einsatz beweist.

Tokens für Notare

Daniel Salcher, Vorstandsvorsitzender: “Zahlreiche Notare verwenden OpenVPN, sowohl zur Fernwartung als auch für den Client-Zugriff auf Samba, FTP, SSH und VNC. Gerade in dem Bereich spielt die Datensicherheit eine große Rolle. Deshalb kommt hier die Token-Authentifizierung mit Hilfe von Aladdin Etoken zum Einsatz. Das lässt sich in OpenVPN mit nur einer Zeile in die Konfiguration einbinden und steht für Windows und Linux zur Verfügung.

Auf einem Windows-OpenVPN-Server mit installierter Aladdin-Software reicht zum Beispiel:

cryptoapicert "THUMB:0b 58 43 44 3d 45 xx bb e5 55 22 xx 2b 2f 26 ba 56 89 7c 36" 

und schon kann sich der Gegenüber via Etoken authentifizieren.”

Vereinsvorstand Markus Keese berichtet vom OpenVPN-Setup bei der deutschen Gesellschaft zum Bau und Betrieb von Endlagern für Abfallstoffe in Peine, dem Betreiber des Erkundungsbergwerkes Gorleben:

Nuklearlager mit Genua-Connection

“Wir haben bei der DBE ein Web-VPN abgelöst und durch eine in die Regelsätze der Genua-Firewall integrierte OpenVPN-Lösung ersetzt. Eine PKI verwaltet die auf verschlüsselten USB-Sticks hinterlegten Client-Zertifikate. So kontrolliert die DBE mit individuellen Firewallregeln den Remote-Zugriff auf ihre Server. ”

Traffic Control und Management-Interface

Auf Basis von Mailgraph [4] von David Schweikert haben die Admins der Charite OpenVPNgraph [5] geschrieben, das mittels RRDtool Betriebsdaten wie die Anzahl der gleichzeitig aktiven User, die Menge der gesendeten und empfangenen Daten protokolliert und grafisch darstellt (Abbildung 1). Im Uniklinikum zeigen sich so über die Woche durchschnittlich 45 bis 50 Benutzer simlutan mit einem Datendurchsatz von 15 bis 20 KByte proMinute (vom Client zum Server) und 145 bis 160 KByte proMinute vom Server zum Client. Die verwendeten Bandbreiten sind also sehr niedrig.

OpenVPN bringt auch ein eigenes Management-Interface zur Steuerung und Überwachung mit, das sich auch mit Telnet ansprechen lässt. In der Konfigurationsdatei aktiviert es der Eintrag:

management 127.0.0.1 7505

für lokale Zugriffe auf dem Port 7505. Interessierte Admins greifen mit »telnet localhost 7505« darauf zu und erhalten in der folgenden Shell mit dem Befehl »help« umfangreiche Hilfe.

Als Client für diese Schnittstelle existiert das in Perl geschriebene OpenVPNcontrol [6], das in Tabellenform Source IP, Username, VPN-IP, Datentransfermenge und Loginzeit anzeigt.

Besonders praktisch erweist sich der »Force Logoff«-Knopf, mit dem der Admin ausgewählte Clients vom VPN trennt. Mehr Details zu den umfangreichen Funktionen des Management-Interfaces finden Interessierte in der Online-Dokumentation auf der Projektwebseite [7].

Enterprise-Ready

OpenVPN hat sich im Einsatz in großen Unternehmen und Organisationen bewährt. Wer das nicht glaubt, findet im Kasten “OpenVPN e.V.: Peine und Notare” oder Artikeln des Linux-Magazins [9] und der Linux Technical Review [10] weitere Beispiele.

Dass das freie VPN-Tool einen derart großen Funktionsumfang mit einer simplen Konfiguration bei gleichzeitig hoher Sicherheit kombiniert, scheint wie die Quadratur des Kreises.

Infos

[1] Die Charité: [http://www.charite.de]

[2] OpenVPN: [http://www.openvpn.net]

[3] PAM Per User:[http://www.feep.net/PAM/pam_per_user]

[4] Mailgraph:[http://mailgraph.schweikert.ch]

[5] OpenVPNgraph::[http://www.computerbeschimpfung.de/openvpngraph.tar.gz]

[6] OpenVPN-Control:[http://sourceforge.net/projects/openvpn-control]

[7] Details zum Management-Interface von OpenVPN: [http://openvpn.net/index.php/documentation/miscellaneous/management-interface.html]

[8] OpenVPN e. V.: [http://www.openvpn.eu]

[9] Markus Feilner, “OpenVPN mit Zertifikaten”, Linux-Magazin Sonderheft 02/2008 S. 94.

[10] Markus Feilner, “IPSec oder OpenVPN?”, Linux Technical Review 08 – Security, S. 44.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben