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. .