29.5. Lightweight Access Directory Protocol (LDAP)

Geschrieben von Tom Rhodes.

Das Lightweight Directory Access Protocol (LDAP) ist ein Protokoll der Anwendungsschicht, das verwendet wird um Objekte mithilfe eines verteilten Verzeichnisdienstes abzurufen, zu verändern und zu authentifizieren. Betrachten Sie es als ein Telefonbuch, das homogene Informationen in mehreren hierarchischen Ebenen speichert. Es wird in Active Directory und OpenLDAP-Netzwerken eingesetzt, in denen Benutzer unter Verwendung eines einzigen Kontos auf diverse interne Informationen zugreifen. Beispielsweise kann E-Mail-Authentifizierung, Abfrage von Kontaktinformationen und Website-Authentifizierung über ein einzelnes Benutzerkonto aus der Datenbank des LDAP-Servers erfolgen.

Dieser Abschnitt enthält eine kompakte Anleitung, um einen LDAP-Server auf einem FreeBSD-System zu konfigurieren. Es wird vorausgesetzt, dass der Administrator bereits einen Plan erarbeitet hat, der verschiedene Punkte umfasst, unter anderem die Art der zu speichernden Informationen, für was die Informationen verwendet werden, welche Benutzer Zugriff auf die Informationen haben und wie die Informationen vor unbefugtem Zugriff geschützt werden.

29.5.1. LDAP Terminologie und Struktur

LDAP verwendet mehrere Begriffe die Sie verstehen sollten bevor Sie die Konfiguration beginnen. Alle Verzeichniseinträge bestehen aus einer Gruppe von Attributen. Jede Attributgruppe enthält einen eindeutigen Bezeichner, der als distinguished name (DN) bekannt ist. Dieser setzt sich normalerweise aus mehreren anderen Attributen, wie dem Relative Distinguished Name (RDN) zusammen. Wie bei Verzeichnissen gibt es auch hier absolute und relative Pfade. Betrachten Sie DN als absoluten Pfad und RDN als relativen Pfad.

Beispielsweise könnte ein LDAP-Eintrag wie folgt aussehen. Dieses Beispiel sucht nach dem Eintrag für das angegebene Benutzerkonto (uid), Organisationseinheit (ou und Organisation (o):

% ldapsearch -xb "uid=trhodes,ou=users,o=example.com"
# extended LDIF

#
# LDAPv3
# base <uid=trhodes,ou=users,o=example.com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#


# trhodes, users, example.com
dn: uid=trhodes,ou=users,o=example.com
mail: trhodes@example.com
cn: Tom Rhodes
uid: trhodes
telephoneNumber: (123) 456-7890

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries:1

Die Einträge in diesem Beispiel zeigen die Werte für die Attribute dn, mail, cn, uid und telephoneNumber. Das Attribut cn ist der RDN.

Weitere Informationen über LDAP und dessen Terminologie finden Sie unter http://www.openldap.org/doc/admin24/intro.html.

29.5.2. Konfiguration eines LDAP-Servers

FreeBSD integriert keinen LDAP-Server. Beginnen Sie die Konfiguration durch die Installation des Ports oder Pakets net/openldap24-server. Da der Port viele konfigurierbare Optionen hat, ist es empfehlenswert zu prüfen, ob die Installation des Pakets ausreichend ist. Wenn Sie irgendwelche Optionen ändern möchten, ist es besser den Port zu übersetzen. In den meisten Fällen sollten die Standardwerte ausreichend sein. Wenn Sie jedoch SQL-Unterstützung benötigen, muss diese Option aktiviert und der Port nach den Anweisungen in Abschnitt 5.5, „Benutzen der Ports-Sammlung“ übersetzt werden.

Als nächstes muss ein Verzeichnis für Daten sowie ein Verzeichnis für die Zertifikate erstellt werden:

# mkdir /var/db/openldap-data
# mkdir /usr/local/etc/openldap/private

Kopieren Sie die Konfigurationsdatei der Datenbank:

# cp /usr/local/etc/openldap/DB_CONFIG.example /var/db/openldap-data/DB_CONFIG

Im nächsten Schritt wird die Zertifizierungsstelle konfiguriert. Die folgenden Befehle müssen in /usr/local/etc/openldap/private ausgeführt werden. Dies ist wichtig, da die Dateiberechtigungen restriktiv gesetzt werden und Benutzer keinen direkten Zugriff auf diese Daten haben sollten. Geben Sie folgenden Befehl ein, um die Zertifizierungsstelle zu erstellen und folgen Sie den Anweisungen:

# openssl req -days 365 -nodes -new -x509 -keyout ca.key -out ../ca.crt

Diese Einträge sind frei wählbar, mit Ausnahme von Common Name. Hier muss etwas anderes als der Hostname des Systems eingetragen werden. Wenn ein selbstsigniertes Zertifikat verwendet wird, stellen Sie dem Hostnamen einfach das Präfix CA für die Zertifizierungsstelle voran.

Die nächste Aufgabe besteht darin, einen Zertifikatsregistrierungsanforderung (CSR) sowie einen privaten Schlüssel zu erstellen. Geben Sie folgenden Befehl ein und folgen Sie den Anweisungen:

# openssl req -days 365 -nodes -new -keyout server.key -out server.csr

Stellen Sie hierbei sicher, dass Common Name richtig eingetragen wird. Anschließend muss der Schlüssel signiert werden:

# openssl x509 -req -days 365 -in server.csr -out ../server.crt -CA ../ca.crt -CAkey ca.key -CAcreateserial

Der letzte Schritt für die Erstellung der Zertifikate besteht darin, die Client-Zertifikate zu erstellen und zu signieren:

# openssl req -days 365 -nodes -new -keyout client.key -out client.csr
# openssl x509 -req -days 3650 -in client.csr -out ../client.crt -CAkey ca.key

Achten Sie wieder auf das Attribut Common name. Stellen Sie außerdem sicher, dass bei diesem Verfahren acht (8) neue Dateien erzeugt worden sind. Der nächste Schritt besteht darin, /usr/local/etc/openldap/slapd.conf zu editieren und folgende Optionen hinzuzufügen:

TLSCipherSuite HIGH:MEDIUM:+SSLv3
TLSCertificateFile /usr/local/etc/openldap/server.crt
TLSCertificateKeyFile /usr/local/etc/openldap/private/server.key
TLSCACertificateFile /usr/local/etc/openldap/ca.crt

Danach bearbeiten Sie /usr/local/etc/openldap/ldap.conf und fügen folgende Zeilen hinzu:

TLS_CACERT /usr/local/etc/openldap/ca.crt
TLS_CIPHER_SUITE HIGH:MEDIUM:+SSLv3

Kommentieren Sie die folgenden Einträge aus und setzen Sie sie auf die gewünschten Werte: BASE, URI, SIZELIMIT und TIMELIMIT. Setzen Sie bei URI ldap:// und ldaps:// ein. Fügen Sie danach zwei Einträge ein, die auf die Zertifizierungsstelle verweisen. Wenn Sie fertig sind, sollten die Einträge wie folgt aussehen:

BASE    dc=example,dc=com
URI     ldap:// ldaps://

SIZELIMIT       12
TIMELIMIT       15

TLS_CACERT /usr/local/etc/openldap/ca.crt
TLS_CIPHER_SUITE HIGH:MEDIUM:+SSLv3

Anschließend sollte das Standardpasswort für den Server geändert werden:

# slappasswd -h "{SHA}" >> /usr/local/etc/openldap/slapd.conf

Dieser Befehl wird nach einem Passwort fragen und, wenn der Prozess nicht fehlschlägt, ein Passwort-Hash an das Ende von slapd.conf hinzufügen. Es werden verschiedene Hash-Formate unterstützt. Weitere Informationen hierzu finden Sie in der Manualpage von slappasswd.

Als nächstes bearbeiten Sie /usr/local/etc/openldap/slapd.conf und fügen folgende Zeilen hinzu:

password-hash {sha}
allow bind_v2

Das Suffix in dieser Datei muss BASE aus /usr/local/etc/openldap/ldap.conf entsprechen. Zudem sollte die Option rootdn ebenfalls gesetzt werden. Ein guter Wert ist beispielsweise cn=Manager. Bevor die Datei gespeichert wird, setzen Sie die Passwortausgabe von slappasswd hinter die Option rootpw. Das Endergebnis sollte in etwa wie folgt aussehen:

TLSCipherSuite HIGH:MEDIUM:+SSLv3
TLSCertificateFile /usr/local/etc/openldap/server.crt
TLSCertificateKeyFile /usr/local/etc/openldap/private/server.key
TLSCACertificateFile /usr/local/etc/openldap/ca.crt
rootpw {SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=

Aktivieren Sie abschließend OpenLDAP in /etc/rc.conf und setzen Sie die URI:

slapd_enable="YES"
slapd_flags="-4 -h ldaps:///"

An dieser Stelle kann der Server gestartet und getestet werden:

# service slapd start

Wenn alles richtig konfiguriert ist, sollte eine Suche im Verzeichnis, wie in diesem Beispiel, eine erfolgreiche Verbindung mit einer Antwort liefern:

# ldapsearch -Z
# extended LDIF

#
# LDAPv3
# base <dc=example,dc=com> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL

# search result
search: 3
result: 32 No such object

# numResponses: 1

Anmerkung:

Wenn der Befehl fehlschlägt, aber die Konfiguration richtig aussieht, stoppen Sie den slapd-Dienst. Starten Sie anschließend den Dienst mit Debugging-Optionen:

# service slapd stop
# /usr/local/libexec/slapd -d -1

Sobald der Dienst antwortet, kann das Verzeichnis mit dem Befehl ldapadd bestückt werden. In diesem Beispiel gibt es eine Datei mit einer Liste von Benutzern, die diesem Verzeichnis hinzugefügt werden. Die Einträge sollten das folgende Format haben:

dn: dc=example,dc=com
objectclass: dcObject
objectclass: organization
o: Example
dc: Example

dn: cn=Manager,dc=example,dc=com
objectclass: organizationalRole
cn: Manager

Um diese Datei zu importieren, geben Sie den Dateinamen an. Bei dem folgenden Befehl werden Sie wieder zur Eingabe des Passworts aufgefordert, das Sie zuvor eingegeben haben. Die Ausgabe sollte wie folgt aussehen:

# ldapadd -Z -D "cn=Manager,dc=example,dc=com" -W -f import.ldif
Enter LDAP Password:
adding new entry "dc=example,dc=com"

adding new entry "cn=Manager,dc=example,dc=com"

Stellen Sie mit einer Suche auf dem Server sicher, dass die Daten importiert wurden. Nutzen Sie dazu ldapsearch:

% ldapsearch -Z
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=com> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# example.com
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
o: Example
dc: Example

# Manager, example.com
dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole
cn: Manager

# search result
search: 3
result: 0 Success

# numResponses: 3
# numEntries: 2

An dieser Stelle sollte der Server konfiguriert sein und ordnungsgemäß funktionieren.

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.

Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.