Authentifizierung am Server

Aus OpenVPN Wiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

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
Persönliche Werkzeuge