LDAP-Anbindung einrichten

Warnung

Für die Einrichtung der LDAP-Anbindung benötigen Sie derzeit root-Zugriff auf Ihren Server. Die Nutzung dieser Anleitung setzt grundlegende Kenntnisse über Begrifflichkeiten von LDAP voraus. Sollten Sie Unterstützung benötigen, wenden Sie sich bitte an unseren Kundendienst.

Um eigenen Diensten die Nutzung von LDAP zu erlauben, müssen Sie die Konfigurationsdatei /etc/iserv/ldapusers bearbeiten.

Warnung

Die Konfigurationsdatei wird von iconf verwaltet. Nach jeglichen Änderungen müssen Sie iconf save /etc/iserv/ldapusers ausführen, da eigene Einträge ansonsten bei der nächsten Ausführung von iservchk überschrieben werden.

Format der Konfigurationsdatei

Hinweis

Weitere Hinweise zum Format der Konfigurationsdatei finden Sie im einleitenden Kommentar am Anfang.

Die Einträge in der Datei müssen einem der folgenden Formate entsprechen:

{username}:+{fieldName}:{client-ip-address}
{username}::{client-ip-address}
{username}:+{fieldName}
{username}

Alle Angaben in den geschweiften Klammern stellen Platzhalter dar und müssen durch passende Werte ersetzt werden.

Dabei entspricht {username} dem Common Name (CN) des Root-Distinguished-Names (Root-DN) der Zugangsdaten des Bind-Benutzers für den externen Dienst. Hier können Sie einen beliebigen Wert wählen. Benutzen Sie hier etwas, dass das System beschreibt, welches die LDAP-Datenbank des IServ nutzen soll. Zum Beispiel nas-sekretariat für ein NAS-Gerät.

Hinweis

Bitte beachten Sie, dass der Bind-Benutzer nur Lesezugriff auf das LDAP-Verzeichnis erhält. Das Editieren der Einträge, zum Beispiel für das Hinterlegen von Konfigurationseinstellungen, ist mit den Zugangsdaten nicht möglich.

Mit +{fieldName} können Sie bei Bedarf den Zugriff auf zusätzliche Attribute der Einträge im LDAP gestatten, die standardmäßig nicht freigegeben sind. Zum Beispiel können Sie durch die Angabe von +userPassword zusätzlich Zugriff auf den Passwort-Hash der IServ-Benutzer zulassen. Dies ist zum Beispiel notwendig, falls der Dienst, den Sie anbinden möchten, das Passwort des Benutzers selbst überprüft und deshalb Zugriff auf das Attribut benötigt. Mehrere zusätzliche Attribute können mit einem Komma getrennt angegeben werden. Wird diese Angabe weggelassen, erhält der Bind-Benutzer nur Zugriff auf allgemeine Informationen wie den Anzeigennamen (siehe Abschnitt „Verfügbare LDAP-Attribute“ unten).

Mit {client-ip-address} geben Sie die IP-Adressbereiche an, über die der angelegte Benutzer auf das LDAP-Verzeichnis zugreifen kann. An dieser Stelle werden IPv4- und IPv6-Adressen unterstützt. Wenn dieser Wert weggelassen wird, ist der LDAP-Benutzer nur lokal auf dem Portalserver und nicht über das Netzwerk nutzbar. Hier können entweder einzelne IP-Adressen wie 10.0.0.10 und 2001:db8:85a3:8d3::1 (empfohlen) oder auch bei Bedarf auch ganze IP-Adressbereiche im CIDR-Format (beispielsweise 10.0.0.0/8 und 2001:db8:85a3:8d3::/64) angegeben werden. Mehrere Werte werden mit einem Komma getrennt.

Verwenden Sie beispielsweise folgenden Eintrag, um den Benutzer nas-sekretariat anzulegen, ihm den Zugriff auf die Passwort-Hashes der IServ-Benutzer zu gestatten und den Zugriff von der IP-Adresse 10.0.0.10 zu erlauben:

nas-sekretariat:+userPassword:10.0.0.10

Hinweise zum Anlegen eigener Einträge in der Konfigurationsdatei

Fügen Sie Ihre eigenen Einträge ausschließlich hinter dem Block

#
# Please add additional user definitions after this comment and remember to save
# the file with iconf save.
#

ein, um Konflikte mit künftigen Updates von IServ zu vermeiden. Die Einträge über diesem Block werden dynamisch vom System eingetragen und verwaltet. Sie sollten nicht verändert werden.

Übernehmen der Änderungen

Speichern Sie Ihre Änderungen an der Konfigurationsdatei mit dem Befehl iconf save /etc/iserv/ldapusers. Führen Sie zum Übernehmen der Änderungen den Befehl iservchk ldap ferm aus. Dabei wird, sofern erforderlich, die Konfiguration der Firewall und des LDAP-Servers angepasst und letzterer gegebenenfalls neu gestartet.

Zugangsdaten für die Nutzung des LDAP-Servers

Hinweis

Exemplarisch finden Sie im folgenden Abschnitt eine Liste der Begriffe und wie Sie die nötigen Werte für diese auslesen. Die Bezeichnungen entstammen einem exemplarischen Test-System. Die Bezeichnung im Konfigurationsdialog der Software, die für die Anbindung an den LDAP-Servers des IServs konfiguriert wird, kann möglicherweise abweichen.

  • LDAP-Server-Hostname: Hier sollte in der Regel die Domain Ihres IServs nutzbar sein, wenn die Software es erfordert, kann aber auch die IP-Adresse des Servers genutzt werden.

  • LDAP-Sicherheit: ldaps (LDAP mit SSL). Die Optionen ldap+tls (LDAP mit StartTLS) und ldap (LDAP ohne Verschlüsselung) werden nicht unterstützt.

  • LDAP-Port: 10636. Bitte beachten Sie: Der Standardport 636 ist momentan IServ-seitig für zukünftige Verwendung reserviert, daher ist der LDAP-Server über einen alternativen Port erreichbar. Wenn Ihre Software keine Möglichkeit besitzt, einen alternativen Port für LDAP anzugeben, wenden Sie sich bitte an uns.

  • Base-DN: Den vom LDAP-Server auf dem IServ genutzten Base-DN können Sie auf dem IServ aus der Datei /var/lib/iserv/server-openldap/ldapdn auslesen.

  • Root-DN (Bind-Benutzer): Dies ist der Benutzer, mit dem sich die Software gegen das LDAP-Verzeichnis authentifiziert. Der vollständige Root-DN lautet cn={username},ou=ldap,{basedn}. {username} ersetzen Sie mit dem Benutzernamen, den Sie in der Konfigurationsdatei eingetragen haben, den Wert für {basedn} können Sie wie beschrieben aus der Datei /var/lib/iserv/server-openldap/ldapdn auslesen. Bitte prüfen Sie in der Dokumentation Ihrer Software, ob der Base-DN in den Root-DN mit eingetragen werden muss oder ob die Eingabe der ergänzenden Werte genügt.

  • Root-DN-Kennwort (Bind-Kennwort): IServ generiert für jeden Bind-Benutzer, der in der Konfigurationsdatei eingetragen wird, nach einem Aufruf von iservchk ein sicheres Passwort. Dieses wird auf dem Server unter /var/lib/iserv/server-openldap/pwd/{username}.pwd gespeichert, wobei {username} dem Benutzernamen aus der Konfigurationsdatei entspricht.

  • Benutzer-DN: Der vollständige Benutzer-DN lautet ou=users,{basedn}. Bitte prüfen Sie in der Dokumentation Ihrer Software, ob der Base-DN in den Benutzer-DN mit eingetragen werden muss.

  • Gruppen-DN: Der vollständige Gruppen-DN lautet ou=groups,{basedn}. Bitte prüfen Sie in der Dokumentation Ihrer Software, ob der Base-DN in den Benutzer-DN mit eingetragen werden muss.

Objekt-Klassen

IServ-Benutzer im LDAP-Verzeichnis gehören derzeit folgenden Objekt-Klassen an:

  • inetOrgPerson

  • organizationalPerson

  • posixAccount

  • shadowAccount

  • top

IServ-Gruppen im LDAP-Verzeichnis gehören derzeit folgenden Objekt-Klassen an:

  • posixGroup

  • top

Verfügbare LDAP-Attribute

Die folgenden Attribute sind über das LDAP-Verzeichnis abrufbar:

Benutzer

  • dn: Distinguished Name des LDAP-Objektes (automatisch basierend auf dem Eintrag generiert).

  • uidNumber: Die Unix-Benutzer-ID des Benutzers.

  • gidNumber: Die primäre Unix-Gruppen-ID des Benutzers.

  • objectClass: Die Objekt-Klassen des LDAP-Eintrags (siehe vorheriger Abschnitt).

  • shadowExpire: Gibt den Zeitpunkt an, an dem der Benutzerzugang abläuft. Wird nicht von der Weboberfläche ausgewertet.

  • shadowInactive: Gibt an, ob der Benutzer aktiviert oder deaktiviert wurde.

  • shadowLastChange: Letzte Änderung des Benutzer-Passwortes. 0 bedeutet an dieser Stelle, dass das Passwort noch nicht gesetzt wurde.

  • shadowMin: Relativer Zeitraum in Tagen nach einer Passwortänderung, an der das Passwort wieder geändert werden darf (Standardwert ist bei IServ immer 0). Wird nicht von der Weboberfläche ausgewertet.

  • shadowMax: Relativer Zeitraum in Tagen nach einer Passwortänderung, an der das Passwort wieder geändert werden muss (Standardwert ist bei IServ immer 99999). Wird nicht von der Weboberfläche ausgewertet.

  • shadowWarning: Relativer Zeitraum in Tagen vor einer nötigen Passwortänderung, an dem auf diese hingewiesen wird. Wird nicht von der Weboberfläche ausgewertet.

  • sn: Nachname des Benutzers.

  • givenName: Vorname des Benutzers.

  • gecos: Aus Vor- und Nachname zusammengesetzer vollständiger Name des Benutzers.

  • uid: Unix-Benutzername des Benutzers.

  • cn: Common Name des Benutzers, entspricht bei IServ dem Unix-Benutzernamen.

  • homeDirectory: Unix-Heimatverzeichnis des Benutzers.

  • userPassword: Das gehashte Unix-Benutzerpasswort des Benutzers.*

  • mail: Die IServ-E-Mail-Adresse des Benutzers.

* Attribut muss explizit in /etc/iserv/ldapusers für den Bind-Benutzer für Lesezugriff freigeschaltet werden (siehe oben).

Gruppen

  • dn: Distinguished Name des LDAP-Objektes (automatisch basierend auf dem Eintrag generiert).

  • cn: Common Name der Gruppe, entspricht bei IServ dem Unix-Gruppennamen.

  • userPassword: Das gehashte Unix-Gruppenpasswort der Gruppe. Wird nicht verwendet und von IServ nicht gesetzt.*

  • memberUid: Die Unix-Benutzernamen der Gruppenmitglieder.

  • gidNumber: Die Unix-Gruppen-ID der Gruppe.

* Attribut muss explizit in /etc/iserv/ldapusers für den Bind-Benutzer für Lesezugriff freigeschaltet werden (siehe oben).

Anbindung für einen Bind-Benutzer testen

Der Bind-Benutzer kann wie folgt getestet werden:

Dabei sind folgende Variablen zu ersetzen:

BINDUSER="Bind-User aus /etc/iserv/ldapusers"
LDAPDN=$(cat /var/lib/iserv/server-openldap/ldapdn)
BINDPASSWORD=$(cat /var/lib/iserv/server-openldap/pwd/${BINDUSER}.pwd)

Beispiel:

BINDUSER="nas-sekretariat"
LDAPDN="dc=mein-iserv,dc=de"
BINDPASSWORD="TY14QGIEtbQKNWacC8wev1dXSk0TrfA1eLvSXKqFrpCtrwXpXaAT2UKtco73gd2x"

Die Daten, die dem Bind-Benutzer zur Verfügung gestellt werden, können mit folgenden Befehl direkt geprüft werden:

ldapsearch -o ldif-wrap=no -H ldaps://mein-iserv.de:10636  \
     -D "cn=${BINDUSER},ou=ldap,${LDAPDN}" \
     -w ${BINDPASSWORD} \
     -b "cn=${iservuser},ou=users,${LDAPDN}"

${iservuser} ist durch den Accountnamen eines beliebigen IServ-Benutzers zu ersetzen, dessen Daten exemplarisch angezeigt werden sollen.

Um die Daten für eine Gruppe exemplarisch auszugeben, kann folgender Befehl genutzt werden:

ldapsearch -o ldif-wrap=no -H ldaps://mein-iserv.de:10636 \
     -D "cn=${BINDUSER},ou=ldap,${LDAPDN}" \
     -w ${BINDPASSWORD} \
     -b "cn=${iservgroup},ou=groups,${LDAPDN}"

Dabei gelten dieselben Ersetzungen, wie beim vorherigen Befehl: Statt ${iservuser} muss hier allerdings ${iservgroup} durch den Accountnamen der IServ-Gruppe ersetzt werden.

Beispielausgaben

mein-iserv.de ~ # ldapsearch -o ldif-wrap=no -H ldaps://mein-iserv.de \
     -D "cn=binduser,ou=ldap,$(cat /var/lib/iserv/server-openldap/ldapdn)" \
     -w $(cat /var/lib/iserv/server-openldap/pwd/binduser.pwd) \
     -b "cn=example.user,ou=users,$(cat /var/lib/iserv/server-openldap/ldapdn)"
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
# extended LDIF
#
# LDAPv3
# base <cn=example,user,ou=users,dc=mein-iserv,dc=de> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# example.user, users, mein-iserv.de
dn: cn=example.user,ou=users,dc=mein-iserv,dc=de
sn: User
uid: example.user
shadowInactive: -1
shadowMin: -1
shadowWarning: 7
shadowMax: 99999
homeDirectory: /home/example.user
givenName: Example
loginShell: /usr/sbin/nologin
shadowExpire: -1
shadowLastChange: 0
cn: example.user
gidNumber: 11453
userPassword:: e2NyeXB0fSE=
shadowFlag: 0
uidNumber: 11453
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
gecos: Example User
mail: example.user@mein-iserv.de

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
mein-iserv.de ~ # ldapsearch -o ldif-wrap=no -H ldaps://mein-iserv.de \
     -D "cn=binduser,ou=ldap,$(cat /var/lib/iserv/server-openldap/ldapdn)" \
     -w $(cat /var/lib/iserv/server-openldap/pwd/binduser.pwd) \
     -b "cn=admins,ou=groups,$(cat /var/lib/iserv/server-openldap/ldapdn)"
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
# extended LDIF
#
# LDAPv3
# base <cn=admins,ou=groups,dc=mein-iserv,dc=de> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# examplegroup, groups, mein-iserv.de
dn: cn=admins,ou=groups,dc=mein-iserv,dc=de
objectClass: posixGroup
objectClass: top
cn: admins
userPassword:: e2NyeXB0fXg=
gidNumber: 1001
memberUid: example.user

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1