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.
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=
# 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:1trhodes
,ou=users
,o=example.com
"
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.
FreeBSD integriert keinen LDAP-Server. Beginnen Sie die Konfiguration mit der Installation des Ports oder Pakets net/openldap-server:
#
pkg install openldap-server
Im
Paket sind eine große Anzahl an Optionen aktiviert.
Mit dem Befehl pkg info openldap-server
können diese überprüft werden. Falls die Optionen nicht
ausreichend sind (weil bspw. SQL-Unterstützung benötigt wird),
sollten Sie in Betracht ziehen, den Port mit dem
entsprechenden Framework neu zu übersetzen.
Während der Installation wird für die Daten das
Verzeichnis /var/db/openldap-data
erstellt. Das Verzeichnis für die Ablage der Zertifikate
muss manuell angelegt werden:
#
mkdir /usr/local/etc/openldap/private
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.
Weitere Informationen über Zertifikate und deren Parameter
finden Sie im Abschnitt 13.6, „OpenSSL“. 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.
Die Zertifikatsregistrierungsanforderung muss mit dem
Schlüssel der Zertifizierungsstelle unterschrieben werden, um
als gültiges Zertifikat verwendet zu 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 Daemon, auf dem der OpenLDAP-Server läuft, heißt
slapd
. Die Konfiguration erfolgt über
slapd.ldif
. Die alte
slapd.conf
wird von OpenLDAP nicht mehr
verwendet.
Konfigurationsbeispiele
für slapd.ldif
finden sich auch in
/usr/local/etc/openldap/slapd.ldif.sample
.
Optionen sind in slapd-config(5) dokumentiert. Jeder
Abschnitt in slapd.ldif
wird, wie alle
anderen LDAP-Attributgruppen, durch einen DN eindeutig
identifiziert. Achten Sie darauf, dass keine Leerzeilen
zwischen der Anweisung dn:
und dem
gewünschten Ende des Abschnitts verbleiben. Im folgenden
Beispiel wird TLS verwendet, um einen sicheren Kanal zu
implementieren. Der erste Abschnitt stellt die globale
Konfiguration dar:
# # See slapd-config(5) for details on configuration options. # This file should NOT be world readable. # dn: cn=config objectClass: olcGlobal cn: config # # # Define global ACLs to disable default read access. # olcArgsFile: /var/run/openldap/slapd.args olcPidFile: /var/run/openldap/slapd.pid olcTLSCertificateFile: /usr/local/etc/openldap/server.crt olcTLSCertificateKeyFile: /usr/local/etc/openldap/private/server.key olcTLSCACertificateFile: /usr/local/etc/openldap/ca.crt #olcTLSCipherSuite: HIGH olcTLSProtocolMin: 3.1 olcTLSVerifyClient: never
Hier müssen die Zertifizierungsstelle, das
Serverzertifikat und die privaten Schlüssel des Servers
angegeben werden. Es wird empfohlen, den Clients die Wahl der
Sicherheits-Chiffre zu überlassen und die Option
olcTLSCipherSuite
wegzulassen (inkompatibel
mit anderen TLS-Clients als openssl
).
Mit der Option olcTLSProtocolMin
benötigt
der Server nur eine minimale Sicherheitsstufe.
Diese Option wird empfohlen. Während die Verfizierung für den
Server verpflichtend ist, ist sie es nicht für den Client:
olcTLSVerifyClient: never
.
Der zweite Abschnitt behandelt die Backend-Module und kann wie folgt konfiguriert werden:
# # Load dynamic backend modules: # dn: cn=module,cn=config objectClass: olcModuleList cn: module olcModulepath: /usr/local/libexec/openldap olcModuleload: back_mdb.la #olcModuleload: back_bdb.la #olcModuleload: back_hdb.la #olcModuleload: back_ldap.la #olcModuleload: back_passwd.la #olcModuleload: back_shell.la
Der dritte Abschnitt widmet sich dem Laden der benötigten ldif-Schemata, die von den Datenbanken verwendet werden sollen. Diese Dateien sind essentiell.
dn: cn=schema,cn=config objectClass: olcSchemaConfig cn: schema include: file:///usr/local/etc/openldap/schema/core.ldif include: file:///usr/local/etc/openldap/schema/cosine.ldif include: file:///usr/local/etc/openldap/schema/inetorgperson.ldif include: file:///usr/local/etc/openldap/schema/nis.ldif
Als nächstes folgt der Abschnitt zur Frontend-Konfiguration:
# Frontend settings # dn: olcDatabase={-1}frontend,cn=config objectClass: olcDatabaseConfig objectClass: olcFrontendConfig olcDatabase: {-1}frontend olcAccess: to * by * read # # Sample global access control policy: # Root DSE: allow anyone to read it # Subschema (sub)entry DSE: allow anyone to read it # Other DSEs: # Allow self write access # Allow authenticated users read access # Allow anonymous users to authenticate # #olcAccess: to dn.base="" by * read #olcAccess: to dn.base="cn=Subschema" by * read #olcAccess: to * # by self write # by users read # by anonymous auth # # if no access controls are present, the default policy # allows anyone and everyone to read anything but restricts # updates to rootdn. (e.g., "access to * by * read") # # rootdn can always read and write EVERYTHING! # olcPasswordHash: {SSHA} # {SSHA} is already the default for olcPasswordHash
Ein weiterer Abschnitt ist dem Konfigurations-Backend gewidmet, der einzige Weg, später auf die OpenLDAP-Serverkonfiguration zuzugreifen, ist als globaler Superuser.
dn: olcDatabase={0}config,cn=config objectClass: olcDatabaseConfig olcDatabase: {0}config olcAccess: to * by * none olcRootPW: {SSHA}iae+lrQZILpiUdf16Z9KmDmSwT77Dj4U
Der voreingestellte Benutzername für den Administrator
lautet cn=config
. Geben Sie
slappasswd
in eine Shell ein, wählen Sie
ein Passwort und verwenden Sie seinen Hash in
olcRootPW
. Wenn diese Option jetzt nicht
angegeben ist, kann vor dem Import der
slapd.ldif
niemand später den Abschnitt
global configuration ändern.
Der letzte Abschnitt befasst sich mit dem Datenbank-Backend:
####################################################################### # LMDB database definitions ####################################################################### # dn: olcDatabase=mdb,cn=config objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: mdb olcDbMaxSize: 1073741824 olcSuffix: dc=domain,dc=example olcRootDN: cn=mdbadmin,dc=domain,dc=example # Cleartext passwords, especially for the rootdn, should # be avoided. See slappasswd(8) and slapd-config(5) for details. # Use of strong authentication encouraged. olcRootPW: {SSHA}X2wHvIWDk6G76CQyCMS1vDCvtICWgn0+ # The database directory MUST exist prior to running slapd AND # should only be accessible by the slapd and slap tools. # Mode 700 recommended. olcDbDirectory: /var/db/openldap-data # Indices to maintain olcDbIndex: objectClass eq
Diese Datenbank enthält den
eigentlichen Inhalt des
LDAP-Verzeichnisses. Neben
mdb
sind weitere Versionen
verfügbar. Dessen Superuser, nicht zu verwechseln mit dem
globalen, wird hier konfiguriert: ein Benutzername in
olcRootDN
und der Passworthash in
olcRootPW
; slappasswd
kann wie zuvor benutzt werden.
Dieses Repository
enthält vier Beispiele für slapd.ldif
.
Lesen Sie diese Seite, um eine bestehende
slapd.conf
in
slapd.ldif
zu konvertieren. Beachten
Sie, dass dies einige unbrauchbare Optionen
einführen kann.
Wenn die Konfiguration abgeschlossen ist, muss
slapd.ldif
in ein leeres Verzeichnis
verschoben werden. Folgendes ist die empfohlene
Vorgehensweise:
#
mkdir /usr/local/etc/openldap/slapd.d/
Importieren Sie die Konfigurationsdatenbank:
#
/usr/local/sbin/slapadd -n0 -F /usr/local/etc/openldap/slapd.d/ -l /usr/local/etc/openldap/slapd.ldif
Starten Sie den slapd
-Daemon:
#
/usr/local/libexec/slapd -F /usr/local/etc/openldap/slapd.d/
Die Option -d
kann, wie in slapd(8)
beschrieben, zur Fehlersuche benutzt werden. Stellen Sie
sicher, dass der Server läuft und korrekt arbeitet:
#
ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
# extended LDIF # # LDAPv3 # base <> with scope baseObject # filter: (objectclass=*) # requesting: namingContexts # # dn: namingContexts: dc=domain,dc=example # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
Dem Server muss noch vertraut werden. Wenn dies noch nie zuvor geschehen ist, befolgen Sie diese Anweisungen. Installieren Sie das Paket oder den Port OpenSSL:
#
pkg install openssl
Aus dem Verzeichnis, in dem ca.crt
gespeichert ist (in diesem Beispiel
/usr/local/etc/openldap
), starten
Sie:
#
c_rehash .
Sowohl die CA als auch das Serverzertifikat werden nun in
ihren jeweiligen Rollen korrekt erkannt. Um dies zu
überprüfen, führen die folgenden Befehl aus dem Verzeichnis
der server.crt
aus:
#
openssl verify -verbose -CApath . server.crt
Falls slapd
ausgeführt wurde, muss
der Daemon neu gestartet werden. Wie in
/usr/local/etc/rc.d/slapd
angegeben,
müssen die folgenden Zeilen in
/etc/rc.conf
eingefügt werden, um
slapd
beim Booten ordnungsgemäß
auszuführen:
lapd_enable="YES" slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/"' slapd_sockets="/var/run/openldap/ldapi" slapd_cn_config="YES"
slapd
bietet beim Booten keine
Möglichkeit zur Fehlersuche. Überprüfen Sie dazu
/var/log/debug.log
,
dmesg -a
und
/var/log/messages
.
Das folgende Beispiel fügt die Gruppe
team
und den Benutzer
john
zur
LDAP-Datenbank domain.example
hinzu, die bislang leer ist. Erstellen Sie
zunächst die Datei
domain.ldif
:
#
cat domain.ldif
dn: dc=domain,dc=example objectClass: dcObject objectClass: organization o: domain.example dc: domain dn: ou=groups,dc=domain,dc=example objectClass: top objectClass: organizationalunit ou: groups dn: ou=users,dc=domain,dc=example objectClass: top objectClass: organizationalunit ou: users dn: cn=team,ou=groups,dc=domain,dc=example objectClass: top objectClass: posixGroup cn: team gidNumber: 10001 dn: uid=john,ou=users,dc=domain,dc=example objectClass: top objectClass: account objectClass: posixAccount objectClass: shadowAccount cn: John McUser uid: john uidNumber: 10001 gidNumber: 10001 homeDirectory: /home/john/ loginShell: /usr/bin/bash userPassword: secret
Weitere Informationen finden Sie in der
OpenLDAP-Dokumentation. Benutzen Sie
slappasswd
, um das Passwort
durch einen Hash in
userPassword
zu ersetzen. Der in
loginShell
angegebene Pfad muss in
allen Systemen existieren, in denen
john
sich anmelden darf. Benutzen
Sie schließlich den mdb
-Administrator,
um die Datenbank zu ändern:
#
ldapadd -W -D "cn=mdbadmin,dc=domain,dc=example" -f domain.ldif
Änderungen im Bereich
global configuration können nur vom
globalen Superuser vorgenommen werden. Angenommen die Option
olcTLSCipherSuite: HIGH:MEDIUM:SSLv3
wurde
ursprünglich definiert und soll nun gelöscht werden.
Dazu erstellen Sie zunächst eine Datei mit folgendem
Inhalt:
#
cat
dn: cn=config changetype: modify delete: olcTLSCipherSuiteglobal_mod
Übernehmen Sie dann die Änderungen:
#
ldapmodify -f global_mod -x -D "cn=config" -W
Geben Sie bei Aufforderung das im Abschnitt
configuration backend gewählte
Passwort ein. Der Benutzername ist nicht erforderlich:
Hier repräsentiert cn=config
den DN des zu
ändernden Datenbankabschnitts. Alternativ können Sie mit
ldapmodify
eine einzelne Zeile der
Datenbank löschen, mit ldapdelete
einen
ganzen Eintrag.
Wenn etwas schief geht oder der globale Superuser nicht auf das Konfigurations-Backend zugreifen kann, ist es möglich, die gesamte Konfiguration zu löschen und neu zu schreiben:
#
rm -rf /usr/local/etc/openldap/slapd.d/
slapd.ldif
kann dann bearbeitet und
erneut importiert werden. Bitte folgenden Sie dieser
Vorgehensweise nur, wenn keine andere Lösung verfügbar
ist.
Dies ist nur die Konfiguration des Servers. Auf demselben Rechner kann auch ein LDAP-Client mit eigener, separater Konfiguration betrieben werden.
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>.