Authentifizierung am Server
Aus OpenVPN Wiki
Einleitung
Die Authentifizierung am OpenVPN Server ist ein zusätzlicher Schutzmechanismus.
Achtung: Dieser Schutz ist ohne Verschlüsselung sinnlos, da Username und Passwort unverschlüsselt übertragen werden! Es ist in jedem Fall zu empfehlen, die zusätzliche Authentifizierung nur in Verbindung mit der zertifikatbasierten Authentifizierung und Verschlüsselung zu nutzen.
Voraussetzungen
- OpenVPN im Servermodus oder P2P
- Ein Programm, ausführbares Shellscript oder OpenVPN-Plugin, das die Authentifizerung durchführen kann (siehe unten).
Authentifizierungsscript
Ein oft gemachter Irrtum ist, dass OpenVPN eine Benutzerdatenbank enthält wo gegen es die User authentifiziert. OpenVPN enthält nur den Code um das Username/Passwort-Paar vom Client zu empfangen und an ein externes Programm (oder an ein Plugin) zu übergeben.
Das Script oder Programm muss das Username/Passwort-Paar entweder aus einer Datei lesen können oder über die Umgebungsvariablen. Weiters ist zu beachten, dass das Script oder Programm mit den Rechten des OpenVPN Daemon/Service ausgeführt wird.
Wenn die Authentifikation erfolgreich war, muss das Script Exitcode 0 an OpenVPN zurückgeben; schlägt sie fehl, Exit Code != 0.
Einbinden des Scripts oder Programms
In die Server.conf muss lediglich eine Zeile ergänzt werden:
auth-user-pass-verify /path/to/auth-script.sh via-env
oder
auth-user-pass-verify /path/to/auth-script.sh via-file
Beispiel für ein Auth-Script (via-env)
#!/bin/sh ALLOWED_USER="alice" ALLOWED_PASS="ecila" if [ "$username" == "$ALLOWED_USER" ] && [ "$password" == "$ALLOWED_PASS" ] then exit 0 fi exit 1
Hier ein Beispiel für Windowsuser (via-env)
@echo off set n_user=%username% %password%; find /n "%n_user%" X:\Programme\OpenVPN\list.txt >result.txt for /f "skip=1" %%a in (result.txt) do set n=%%a if "%n%"=="----------" exit 1 exit 0
1. Den Editor öffnen
2. Den Inhalt kopieren und im Editor einfügen
3. Datei>Speichern unter>Alle Dateien und als auth.bat unter X:\Programme\OpenVPN\ abspeichern ("X" gilt für das Laufwerk auf dem sich die OpenVPN-Installation befindet)
4. Nun müssen wir natürlich noch ein Textfile erstellen, in dem wir die entsprechenden Usernamen und die dazu gehörigen Passwörter festlegen. In dem Script haben wir den Pfad und Dateinamen für diese Passwortliste festgelegt X:\Programme\OpenVPN\list.txt!
Dass sollte anhand dieses Beipiels verdeutlicht werden:
steffen steff1203; >>>>(steffen=Username steff1203=Passwort)<<<<nur zur Verdeutlichung!!! erich erich1212; manuela manu2405; etc. etc. etc.
5. Nun Speichern als list.txt im Verzeichnis X:\Programme\OpenVPN\
!!!!WICHTIG!!!!
Der im Script angegebene Pfad und der Dateiname müssen zutreffen,
ansonsten endet die Geschichte logischerweise in einer Fehlermeldung
VB-Script zur Active Directory Authentifizierung (via-env oder -file)
Es muß noch der Domänenname geändert werden sowie weiter unten nochmal bei "dc="
'This script is mixing both auth methods (via-env and via-file)
'found here: http://openvpn.net/archive/openvpn-users/2006-09/msg00046.html
' and here: http://www.zerina.de/wiki/index.php/Authentifizierung_am_Server
' Run the script with the filename as parameter to use by-file, without any parameters to use by-env
Dim strUsername
Dim strPassword
Dim strArgs
Dim erro
Dim DomainName
Dim WshShell
Dim fso
DomainName = "YOURDOMAINNAME\"
Const ADS_SCOPE_SUBTREE = 2
On Error Resume Next
' Get username and password either from the command line vars
' or from a file which path was specified as a parameter
Set objArgs = WScript.Arguments
If objArgs.Count > 0 Then
getCredentialsByFile(objArgs(0))
else
getCredentialsByEnvironment()
end if
'Check if we can bind to the ldap server using the above credentials
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Properties("User ID") = strUsername
objConnection.Properties("Password") = strPassword
objConnection.Properties("Encrypt Password") = TRUE
objConnection.Properties ("ADSI Flag") = 1
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.Properties("Sort On") = "Name"
objCommand.CommandText = "SELECT Name FROM 'LDAP://dc=YOUR,dc=DOMAIN,dc=NAME' WHERE objectCategory='user'"
Set objRecordSet = objCommand.Execute
'Return our result
if Err <> 0 Then
erro = 1
else
erro = 0
end if
wscript.quit (erro)
private sub getCredentialsByEnvironment()
SET WshShell = CreateObject ("WScript.Shell")
strUsername = DomainName + WshShell.Environment("Process")("username")
strPassword = WshShell.Environment("Process")("password")
end sub
private sub getCredentialsByFile(filePath)
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(filePath) Then
Set f = fso.OpenTextFile(filePath, 1)
strUsername = DomainName + f.ReadLine
strPassword = f.ReadLine
f.close
end if
end sub
Einbinden in die Server.ovpn und der Client.ovpn
Serverseite:
Wir öffnen die Server.ovpn (oder wie auch immer eure Serverconfig heißt) und fügen dieser folgendes hinzu:
auth-user-pass-verify X:\\Programme\\OpenVPN\\auth.bat via-env
Clientseite:
Wir öffnen die Client.ovpn (oder wie auch immer eure Clientconfig heißt) und fügen dieser folgendes hinzu:
auth-user-pass
Beispielkonfiguration auf Basis einer Ethernetbridge (Netzwerkbrücke)
Server
port 1194 proto udp dev tap tun-mtu 1492 fragment 1300 dev-node tap #Name des Tap-Device# server-bridge 192.168.xxx.xx 255.255.255.0 192.168.xxx.xxx 192.168.xxx.xxx tls-server ca C:\\Programme\\OpenVPN\\easy-rsa\\keys\\ca.crt cert C:\\Programme\\OpenVPN\\easy-rsa\\keys\\server.crt key C:\\Programme\\OpenVPN\\easy-rsa\\keys\\server.key dh C:\\Programme\\OpenVPN\\easy-rsa\\keys\\dh1024.pem # Wenn ihr keinen ta.key erstellt habt, # dann bitte diese Zeile auskommentieren # Um einen zu erstellen in Start>Ausführen>cmd und ins entsprechende Verzeichnis navigieren, # nun folgendes eingeben "openvpn --genkey --secret ta.key" # Auf der Serverseite die "0" und auf der Clientseite die "1" verwenden tls-auth C:\\Programme\\OpenVPN\\easy-rsa\\keys\\ta.key 0 auth-user-pass-verify C:\\Programme\\OpenVPN\\auth.bat via-env client-to-client keepalive 10 120 comp-lzo max-clients 10 persist-key persist-tun status openvpn-status.log #legt ein Status Logfile an! Wenn nicht gewünscht, dann auskommentieren# # !!!!Dieser Eintrag ist nur wirksam in Verbindung mit dem # OpenVPN-Usermanger http://openvpn.mertech.com.au/!!!! # Sehr Sinnvoll bei Game-Servern mit mehreren Clienten # die "pass.txt" ist optional management 192.168.xxx.xx 1194 pass.txt verb 6 mute 20
Client
client dev tap dev-node client #Name der Tap-Device# proto udp port 1194 tun-mtu 1492 fragment 1300 remote beispiel.dyndns.org tls-client ca C:\\Programme\\OpenVPN\\easy-rsa\\keys\\ca.crt cert C:\\Programme\\OpenVPN\\easy-rsa\\keys\\client2.crt key C:\\Programme\\OpenVPN\\easy-rsa\\keys\\client2.key # Wenn ihr keinen ta.key erstellt habt, # dann bitte diese Zeile auskommentieren tls-auth C:\\Programme\\OpenVPN\\easy-rsa\\keys\\ta.key 1 auth-user-pass ns-cert-type server nobind keepalive 10 120 persist-key persist-tun comp-lzo verb 3 mute 20
