Allgemeine Hinweise
Das ITMZ betreibt LDAP-Authentifizierungsserver, die eine Anmeldung mit einem Benutzerkonto der Active Directory Domäne "uni-rostock.de" für native LDAP-Anwendungen ermöglichen.
Als Software kommt Active Directory Lightweigt Directory Service (AD LDS) zum Einsatz. AD LDS ist eine Active Directory, reduziert auf die LDAP-Fähigkeit und Verzeichnisreplikation. Die Software ist Standardbestandteil von Windows Server. Weitere Informationen unter
Um UNIX-Clients eine Anmeldung zu ermöglichen wurden folgende LDAP-Objektklassen laut RFC2307 in die AD LDS-Server eingepflegt:
- posixAccount
- shadowAccount
- posixGroup
Dadurch ist es UNIX-Clients möglich, eine Authentifizierung ohne aufwendiges Attributmapping mithilfe der UNIX LDAP PAM-Module gegenüber einem AD LDS-Server durchzuführen.
Die AD LDS-Server enthalten Proxy-Konten oder Shadow-Konten, welche nur reine Informationsattribute besitzen, wie z.b. mail oder gid. Die Konten der AD LDS-Server besitzen kein Passwort Attribut. Das Quellkonto in der Active Directory des ITMZ enthält das Passwort.
Folgende Attribute der posixAccount-Klasse sind pro Nutzerobjekt gesetzt:
- cn
- homeDirectory
- gecos
- gidNumber
- givenName
- loginShell
- sn
- uidNumber
- uid
Die Authentifizierung muss mit einem LDAP Simple Bind über SSL oder über Simple Authentication and Security Layer (SASL) erfolgen.
Für die Authentifizierung können Sie Ihr ITMZ-Nutzerkennzeichen benutzen.
Nutzung des LDAP-Servers innerhalb einer Anwendung
Falls Ihre Anwendung Zugriff auf die o.g. Attribute der posixAccount-Klasse benötigt (dies sind in der Regel PAM-basierte Anwendungen, PAM = Pluggable Authentication Modules), dann benötigen Sie die Anmeldedaten eines allgemeinen Nutzerkontos (proxyuser), damit Ihre Anwendung eine Authentifizierung über die LDAP-Server des ITMZ durchführen kann.
Weiter unten in diesem Text finden Sie einige Authentifizierungsbeispiele, welche eine Authentifizierung OHNE das Proxyuser-Konto ermöglichen (z.B. Apache, Active Server Pages und PHP).
Bitte senden Sie eine formlose E-Mail mit kurzer Anwendungsbeschreibung an joerg.maletzky(at)uni-rostock.de, um die dazugehörigen Anmeldedaten zu erhalten.
Adresse und Base DN
Der DNS-Name des Servers lautet:
- ldap.uni-rostock.de
Base DN:
- "ou=people,o=uni-rostock,c=de"
Simple Bind Authentifizierung über SSL:
Beispiel Userid:
- LDAP DN: uid=tester,ou=people,o=uni-rostock,c=de
SASL Authentifizierung per GSS-Negotiate:
Beispiel Userid:
- Kerberos principal name: tester@UNI-ROSTOCK.DE
- NTLM user name: uni-rostock.de\tester
Beispielkonfigurationen
Apache 2.0/2.1
Bevor Sie beginnen, laden Sie sich bitte das Wurzelzertifikat der Telekom-CA herunter und kopieren Sie das Zertifikat in einen lokalen Pfad des Systems auf dem der Apache Webserver läuft.
Das Wurzelzertifikat der Telekom-CA im Base64-Format können Sie hier herunterladen.
Konfiguration mit den Apache Modulen mod_auth_ldap und mod_ldap
Weiterhin müssen die Apache Module mod_auth_ldap und mod_ldap durch die folgenden Zeilen in der httpd.conf geladen werden:
LoadModule ldap_module modules/mod_ldap.so
LoadModule auth_ldap_module modules/mod_auth_ldap.so
Um ein Verzeichnis mithilfe des Authentifizierungsservers zu schützen sind folgende Einträge in der httpd.conf nötig:
Bereitstellung des CA-Zertifikates:
LDAPTrustedCA "/etc/httpd/telekom_rootcert_base64.pem
LDAPTrustedCAType BASE64_FILE
Konfiguration der Abfrage:
<Directory "/verzeichnisname">
Allow from all
AuthLDAPAuthoritative On
AuthLDAPEnabled On
AuthName "Anmeldung an Domain uni-rostock.de"
AuthLDAPURL ldaps://ldap.uni-rostock.de/ou=people,o=uni-rostock,c=de?uid?sub?(objectclass=*)
#Proxy User
AuthLDAPBindDN "uid=xxx,ou=xxx,o=uni-rostock,c=de"
AuthLDAPBindPassword "xxx"
AuthType Basic
Order allow,deny
Require valid-user
</Directory>
Alias /aliasname "/verzeichnisname"
Für den Zugriff auf die Anmeldedaten des Proxy Users s. Lesezugriff auf die Attribute der Nutzerobjekte des LDAP-Servers.
Apache 2.2
Bevor Sie beginnen, laden Sie sich bitte das Wurzelzertifikat der Telekom-CA herunter und kopieren Sie das Zertifikat in einen lokalen Pfad des Systems auf dem der Apache Webserver läuft.
Das Wurzelzertifikat der Telekom-CA im Base64-Format können Sie hier herunterladen.
Konfiguration mit den Apache Modulen mod_auth_basic, mod_authnz_ldap und mod_ldap
Laden der Apache Module mod_auth_basic, mod_authnz_ldap und mod_ldap durch die folgenden Zeilen in der httpd.conf:
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule ldap_module modules/mod_ldap.so
Um ein Verzeichnis mithilfe des Authentifizierungsservers zu schützen sind folgende Einträge in der httpd.conf nötig:
Bereitstellung des CA-Zertifikates:
LDAPTrustedMode SSL
LDAPTrustedGlobalCert CA_BASE64 /etc/httpd/conf/LDAP.cert/telekom_rootcert_base64.pem
Konfiguration der Abfrage:
Allow from all
AuthName "Account Rechenzentrum"
AuthzLDAPAuthoritative Off
AuthBasicProvider ldap
AuthLDAPURL
ldaps://ldap.uni-rostock.de/ou=people,o=uni-rostock,c=de?uid?sub?(objectclass=*)
AuthLDAPBindDN "uid=xxx,ou=xxx,o=uni-rostock,c=de"
AuthLDAPBindPassword "xxx"
AuthType Basic
Order allow,deny
Require valid-user
Für den Zugriff auf die Anmeldedaten des Proxy Users s. Lesezugriff auf die Attribute der Nutzerobjekte des LDAP-Servers.
ASP - Active Server Pages
Folgendes Beispiel wurde dem URZ freundlicherweise von Martin Kofahl zur Verfügung gestellt. Bei Fragen zum Code senden Sie bitte eine Email an martin.kofahluni-rostockde.
<%
Function AuthRZ(ByVal user, ByVal pass, ByRef errstr, ByRef errnum)
const ADS_SECURE_AUTHENTICATION=&h0001
const ADS_USE_SSL=&h0002
user = Trim(user)
If user = "" Then
errstr = "Nutzername wurde nicht angegeben"
AuthRZ = false
Else
ldap = "LDAP://ldap.uni-rostock.de:636/"
basedn = "UID=" & user & ",ou=people,o=uni-rostock,c=de"
login = "UID=" & user & ",ou=people,o=uni-rostock,c=de"
On Error Resume Next
Set dso = GetObject("LDAP:")
Set domain = dso.OpenDSObject(ldap & basedn, _
login, _
pass, _
ADS_USE_SSL)
errinfo=err.number
err.clear
On Error Goto 0
Select Case errinfo
Case "0" 'AUTHENTICATED THROUGH ADSI
errstr = ""
errnum = 0
AuthRZ = true
Case "-2147023570" 'BAD PASSWORD
errstr = "Falscher Benutzername oder falsches Paßwort"
errnum = errinfo
AuthRZ = false
Case "-2147023677" 'TOO MANY TRIES
errstr = "Zu viele fehlerhafte Logins, Account vorübergehend gesperrt"
errnum = errinfo
AuthRZ = false
Case "-2147467259" 'CAN'T CONNECT TO DOMAIN SERVER
errstr = "Keine Verbindung zum Server möglich"
errnum = errinfo
AuthRZ = false
Case Else
errstr = err.description
errnum = errinfo
AuthRZ = false
End Select
End If
Set domain = Nothing
Set dso = Nothing
End Function
If AuthRZ("", "password", errstr, errnum) Then
response.write("ok")
Else
response.write("Fehler: " & errstr)
End If
%>
Linux Fedora
Linux SuSE
Openldap tools
/etc/openldad/ldap.conf:
host ldap.uni-rostock.de
base ou=people,o=uni-rostock,c=de
#The client will not request or check any server certificate.
tls_reqcert never
Hier eine Beispielabfrage für ein installiertes OpenLDAP:
ldapsearch -H ldaps://ldap.uni-rostock.de -D "uid=tester,ou=people,o=uni-rostock,c=de" -W -v -x -b "ou=people,o=uni-rostock,c=de"
Uid ist durch ein Ihnen bekanntes Nutzerkennzeichen zu ersetzen, z.B. tester.
PHP
<?php
// Grundlegende Abfolge bei LDAP ist verbinden, binden, suchen,
// interpretieren des Sucheergebnisses, Verbindung schließen
$ldapsrv = "ldaps://ldap.uni-rostock.de";
echo "LDAP Query Test for $ldapsrv\n";
echo "Verbindung ...";
$ds=ldap_connect($ldapsrv); // muss ein gültiger LDAP Server sein!
echo "Ergebnis der Verbindung: $ds\n";
$attribute = array ('cn','homeDirectory','gecos ','gidNumber','givenName',
'loginShell ','sn','uidNumber','uid' ,'mail'); // (nur einlesbar vom Nutzer selbst)'
if ($ds) {
echo "Bindung ...";
$uid = 'foobar'; # Nutzerid
$pwd = 'foobar'; # Password
$dn = "ou=people,o=uni-rostock,c=de";
$r=ldap_bind($ds,"uid=$uid,$dn", "$pwd");
echo "Ergebnis der Bindung $r\n";
$filter = "(uid=$uid)";
if ($sr=ldap_search($ds, $dn, $filter)) {
if (ldap_count_entries($ds,$sr)) {
for ($x = 0; $x < ldap_count_entries($ds,$sr); $x++) {
if ($x==0) {
$entry = ldap_first_entry($ds, $sr);
}
else {
$entry = ldap_next_entry($ds, $entry);
}
$attrs = ldap_get_attributes($ds, $entry);
for ($i=0; $i<$attrs["count"]; $i++) {
if ($attrs[$i] == 'gecos') {
echo $attrs[$i]." : ". utf8_decode($attrs[$attrs[$i]][0]) ."\n";
}
else {
echo $attrs[$i]." : ". $attrs[$attrs[$i]][0] ."\n";
}
}
}
}
}
ldap_close($ds);
}
?>