Das hier vorgestellte Verfahren funktioniert bei mir unter OpenBSD 4.4 hervorragend.
Als erstes wird das notwendige Paket installiert: pkg_add login_ldap-3.51
Die Routine zieht weitere benötigte Pakete, wie z.B. den OpenLDAP Client selbständig nach.
Nach der Installation wird in der Datei /etc/login.conf ein Eintrag nach folgendem Muster hinzugefügt: ldap:\ :auth=-ldap:\ :x-ldap-server=ldap.rs.de:\ :x-ldap-basedn=ou=openvpn-users,dc=rs,dc=de:\ :x-ldap-filter=(&(objectclass=posixAccount)(uid=%u)):\ :x-ldap-binddn=cn=Manager,dc=rs,dc=de:\ :x-ldap-bindpw=geheim:\ :tc=default:
Hierbei sind selbstverständlich die Werte entsprechend der LDAP-Umgebung anzupassen. Nun wird zum Test auf dem LDAP-Server ein Account "meiserh" mit einem Passwort angelegt und, sofern obige Konfiguration übernommen wurde, auch eine OU namens openvpn-users (man merkt schon was ich eigentlich damit machen will). meiserh ist selbstverständlich in dieser OU.
Ist das erledigt, so kann man den Erfolg mit folgender Zeile testen: /usr/libexec/auth/login_-ldap -d -s login meiserh ldap
Ein erfolgloser Versuch, z.B. wegen eines falschen Passwortes liefert in der letzten Zeile reject Ein erfolgreicher Versuch hingegen authorize zurück.
Nutzen kann man das Ganze unter anderem mit folgendem Script:
#!/bin/sh # success = 0 , error = 1 LOGENABLE=1 LOGCLASS=OpenVPN-LDAPAuth DEBUGENABLE=1
LDAP_LOGIN=/usr/libexec/auth/login_-ldap
if [ ${#username} -lt 1 ] then if [ ${LOGENABLE} -eq 1 ] then logger -t $LOGCLASS "Username ${username} too short (${#username} chars)" fi exit 1; fi
if [ ${#password} -lt 1 ] then if [ ${LOGENABLE} -eq 1 ] then logger -t $LOGCLASS "Password for user ${username} too short (${#password} chars)" fi exit 1; fi
# check against ldap-server RESPONSE=`$LDAP_LOGIN -d -s login -p ${password} ${username} ldap 2>/dev/null 3>&1` if [ ${DEBUGENABLE} -eq 1 ] then logger -t $LOGCLASS "username: ${username} login attempt at `date "+DATE: %Y-%m-%d - TIME: %H:%M:%S"`" logger -t $LOGCLASS "response was ${RESPONSE}" fi if [ ${#RESPONSE} -lt 1 ] then logger -t $LOGCLASS "something went wrong! no response from authenticator" exit 1; fi if [ ${RESPONSE} != "authorize" ] then exit 1; else exit 0; fi
Hierbei wird das Script login_ldap (http://sourceforge.net/projects/login-ldap/) missbraucht. Damit man auf der Kommandozeile das Passwort übergeben kann, muß der Debug-Modus (-d) aktiviert werden. Da wir aber lediglich einen Rückgabewert (0 bei erfolgreicher Authentifizierung, ansonsten 1) haben wollen, wird der Rückgabekanal 3 auf stdout umgeleitet und damit ansonsten jede andere Ausgabe unterdrückt.
Dieses Script kann man dann hervorragend für OpenVPN einsetzen. |