LDAP-Authentifizierungsserver des ITMZ

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

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);
}
?>