Zum Inhalt springen

OpenLDAP

Aus Foxwiki

LDAP-Verzeichnis

OpenLDAP ist eine Umsetzung des LDAP-Protokolls; mit anderen Worten, es ist eine Spezialdatenbank zum Speichern von Verzeichnissen.

  • Im gebräuchlichsten Anwendungsfall macht die Verwendung eines LDAP-Servers es möglich, die Verwaltung von Benutzerkonten und der dazugehörigen Berechtigungen zusammenzufassen.
  • Außerdem lässt sich eine LDAP-Datenbank leicht kopieren, wodurch die Einrichtung mehrerer synchronisierter LDAP-Server möglich wird.
  • Wenn das Netzwerk und die Benutzerzahl schnell anwachsen, kann so die Arbeitslast auf mehrere Server verteilt werden.

LDAP-Daten sind strukturiert und hierarchisch.

  • Die Struktur wird durch „Schemata“ festgelegt, die die Art der Objekte, die die Datenbank speichern kann, zusammen mit einer Liste all ihrer möglichen Attribute beschreiben.
  • Die Syntax, die zum Verweis auf ein bestimmtes Objekt der Datenbank verwendet wird, basiert auf diesen Strukturen, wodurch sich ihre Komplexität erklärt.

Installieren

Das Paket slapd enthält den OpenLDAP-Server.

  • Das Paket ldap-utils umfasst Befehlszeilen-Werkzeuge für die Zusammenarbeit mit LDAP-Servern.

Die Installation von slapd stellt normalerweise nur die Frage nach dem Administratorpasswort und es ist unwahrscheinlich, dass die resultierende Datenbank Ihren Bedürfnissen entspricht.

  • Glücklicherweise können Sie mit einem einfachen dpkg-reconfigure slapd die LDAP-Datenbank mit mehr Details neu konfigurieren: * Konfigurierung des OpenLDAP-Servers auslassen? Natürlich nicht, wir wollen diesen Dienst konfigurieren.
  • DNS-Domain-Name: „falcot.com“.
  • Name der Organisation: „Falcot Corp.“.
  • Ein Verwaltungspasswort muss eingegeben werden.
  • Zu verwendendes Datenbank-Backend: „MDB“.
  • Möchten Sie, dass die Datenbank entfernt wird, wenn slapd gelöscht wird? Nein.
  • Es wäre nicht sinnvoll, den Verlust der Datenbank im Falle eines Versehens zu riskieren.
  • Die alte Datenbank verschieben? Diese Frage wird nur gestellt, wenn die Konfigurierung vorgenommen wird, während eine Datenbank bereits existiert.
  • Antworten Sie nur mit „ja“, wenn Sie tatsächlich wieder mit einer leeren Datenbank beginnen möchten, zum Beispiel, wenn Sie dpkg-reconfigure slapd unmittelbar nach der ersten Installierung ausführen.

ZURÜCK ZU DEN GRUNDLAGEN Das LDIF-Format

Eine LDIF-Datei (LDAP Data Interchange Format) ist eine übertragbare Textdatei, die den Inhalt einer LDAP-Datenbank (oder einen Teil davon) beschreibt; sie kann dazu verwendet werden, die Daten auf einen beliebigen anderen LDAP-Server einzuspeisen.

Eine minimale Datenbank ist jetzt konfiguriert, wie die folgende Anfrage zeigt:

$ ldapsearch -x -b dc=falcot,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=falcot,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# falcot.com
dn: dc=falcot,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Falcot Corp
dc: falcot
# admin, falcot.com
dn: cn=admin,dc=falcot,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Die Anfrage ergibt zwei Objekte: die Organisation selbst und den verwaltenden Benutzer.

Verzeichnis ausfüllen

Da eine leere Datenbank nicht sehr nützlich ist, werden wir alle bestehenden Verzeichnisse in sie einspeisen; hierzu gehören die Benutzer-, Gruppen-, Dienst- und Host-Datenbanken.

Das Paket migrationtools stellt einen Satz von Skripten bereit, die dazu dienen, Daten aus den Standard-Unix-Verzeichnissen (/etc/passwd, /etc/group, /etc/services, /etc/hosts und so weiter) zu extrahieren, diese Daten zu konvertieren und sie in die LDAP-Datenbank einzuspeisen.

Nachdem das Paket installiert ist, muss die Datei /etc/migrationtools/migrate_common.ph editiert werden; die Optionen IGNORE_UID_BELOW and IGNORE_GID_BELOW müssen aktiviert werden (es genügt, das Kommentarzeichen zu entfernen) und die Variablen DEFAULT_MAIL_DOMAIN/DEFAULT_BASE müssen aktualisiert werden.

Der tatsächliche Übertragungsvorgang wird mit dem Befehl migrate_all_online.sh folgendermaßen ausgeführt:

# cd /usr/share/migrationtools
# PERL5LIB="${PERL5LIB}:/etc/migrationtools" LDAPADD="/usr/bin/ldapadd -c" ETC_ALIASES=/dev/null ./migrate_all_online.sh

Das Skript migrate_all_online.sh stellt einige Fragen zur LDAP-Datenbank, auf die die Daten übertragen werden sollen. Tabelle fasst die Antworten zusammen, die im Fallbeispiel Falcot gegeben wurden.

Antworten auf die vom Skript migrate_all_online.sh gestellten Fragen

Frage Antwort
X.500 Benennungskontext dc=falcot,dc=com
Hostname des LDAP-Servers localhost
Manager-DN cn=admin,dc=falcot,dc=com
Verbindungslegitimation das Verwaltungspasswort
Ein DUAConfigProfil anlegen nein

You might notice that we extend the PERL5LIB variable.

  • This is due to Debian bug report #982666.

→ https://bugs.debian.org/982666

As you might have also noticed, we deliberately ignore migration of the /etc/aliases file, since the standard schema as provided by Debian does not include the structures that this script uses to describe email aliases.

  • Should we want to integrate this data into the directory, the /etc/ldap/schema/misc.schema file should be added to the standard schema.

HILFSPROGRAMM Ein LDAP-Verzeichnis durchsuchen

Das Programm jxplorer (im gleichnamigen Paket) ist ein grafisches Hilfsprogramm, das es ermöglicht, eine LDAP-Datenbank zu durchsuchen und zu editieren.

  • Es ist ein interessantes Programm, das einem Administrator einen guten Überblick über die hierarchische Struktur der LDAP-Daten gibt.

Beachten Sie auch die Verwendung der Option -c des Befehls ldapadd; diese Option bestimmt, dass der Verarbeitungsablauf im Falle eines Fehlers nicht abgebrochen wird.

  • Die Verwendung dieser Option ist notwendig, da die Konvertierung der Datei /etc/services häufig einige Fehler hervorruft, die ohne Gefahr ignoriert werden können.

Konten mit LDAP verwalten

Jetzt, da die LDAP-Datenbank einige nützliche Informationen enthält, ist es an der Zeit diese Daten zu nutzen.

  • Dieser Abschnitt richtet sein Augenmerk darauf, wie ein Linux-System so zu konfigurieren ist, dass die verschiedenen Systemverzeichnisse die LDAP-Datenbank benutzen.

NSS konfigurieren

Das NSS-System (Name Service Switch, siehe Seitenleiste WEITERE SCHRITTENSS und Systemdatenbanken) ist ein modulares System, das Informationen für Systemverzeichnisse festlegen oder einholen kann.

  • Um LDAP als Datenquelle für NSS verwenden zu können, muss das Paket libnss-ldap installiert werden.
  • Bei seiner Installierung werden einige Fragen gestellt; die Antworten sind in Tabelle zusammengefasst.

Configuring the libnss-ldap package:

Frage Antwort
LDAP server URI (Uniform Resource Identifier) ldapi://ldap.falcot.com
Kennzeichnender Name der Suchbasis dc=falcot,dc=com
Zu verwendende LDAP-Version 3
LDAP-Administratorkonto cn=admin,dc=falcot,dc=com
Passwort des LDAP-Administratorkontos das Verwaltungspasswort
Dem LDAP-Administrationskonto erlauben, sich wie lokales Root zu verhalten? yes
Benötigt die LDAP-Datenbank eine Anmeldung? nein

Die Datei /etc/nsswitch.conf muss nun angepasst werden, um NSS so zu konfigurieren, dass es das neu installierte ldap-Modul benutzt.

  • Sie können das in /usr/share/doc/libnss-ldap/examples/nsswitch.ldap enthaltene Beispiel verwenden oder Ihre bestehende Konfiguration bearbeiten.
/etc/nsswitch.conf
#ident $Id: nsswitch.ldap,v 2.4 2003/10/02 02:36:25 lukeh Exp $
#
# An example file that could be copied over to /etc/nsswitch.conf; it
# uses LDAP conjunction with files.
#
# "hosts:" and "services:" in this file are used only if the
# /etc/netconfig file has a "-" for nametoaddr_libs of "inet" transports.

# the following lines obviate the "+" entry in /etc/passwd and /etc/group.
passwd:         files ldap
shadow:         files ldap
group:          files ldap

# consult DNS first, we will need it to resolve the LDAP host. (If we
# can't resolve it, we're in infinite recursion, because libldap calls
# gethostbyname(). 
  • Careful!)
hosts:          dns ldap

# LDAP is nominally authoritative for the following maps.
services:   ldap [NOTFOUND=return] files
networks:   ldap [NOTFOUND=return] files
protocols:  ldap [NOTFOUND=return] files
rpc:        ldap [NOTFOUND=return] files
ethers:     ldap [NOTFOUND=return] files

# no support for netmasks, bootparams, publickey yet.
netmasks:   files
bootparams: files
publickey:  files
automount:  files

# I'm pretty sure nsswitch.conf is consulted directly by sendmail,
# here, so we can't do much here. Instead, use bbense's LDAP
# rules ofr sendmail.
aliases:    files
sendmailvars:   files

# Note: there is no support for netgroups on Solaris (yet)
netgroup:   ldap [NOTFOUND=return] files

Das ldap-Modul wird normalerweise vor den anderen aufgenommen und wird daher zuerst abgefragt.

  • Eine beachtenswerte Ausnahme stellt der hosts-Dienst dar, da zunächst der DNS befragt werden muss (um ldap.falcot.com aufzulösen), bevor mit dem LDAP-Server Verbindung aufgenommen werden kann.
  • Ohne diese Ausnahme würde eine Anfrage nach einem Hostnamen an den LDAP-Server gerichtet; dies würde eine Namensauflösung für den LDAP-Server auslösen, und so weiter in einer unendlichen Schleife.

Falls der LDAP-Server als maßgeblich angesehen werden soll (und die lokalen vom Modul files benutzten Dateien ignoriert werden sollen), können die Dienste mit der folgenden Syntax konfiguriert werden:

dienst: ldap [NOTFOUND=return] files.

Falls der gesuchte Eintrag in der LDAP-Datenbank nicht vorhanden ist, wird die Anfrage die Antwort „nicht vorhanden“ ergeben, selbst wenn er in einer der lokalen Dateien vorhanden ist; diese lokalen Dateien werden nur benutzt, wenn der LDAP-Service abgeschaltet ist.

PAM konfigurieren

Dieser Abschnitt beschreibt die Konfiguration von PAM (siehe Seitenleiste HINTER DEN KULISSEN[1]/etc/environmentund /etc/default/locale), die es Anwendungen ermöglicht, die gegenüber der LDAP-Datenbank erforderlichen Authentifizierungen vorzunehmen.

VORSICHT Fehlerhafte Authentifizierung
Die Änderung der von verschiedenen Programmen verwendeten standardmäßigen PAM-Konfiguration ist ein heikler Vorgang. 
  • Ein Fehler kann zu einer fehlerhaften Authentifizierung führen, die das Anmelden verhindern kann.
  • Eine gute Vorsichtsmaßnahme besteht daher darin, eine Root-Konsole offen zu halten.
  • So können mit geringem Aufwand eventuell auftretende Konfigurierungsfehler behoben und Dienste neu gestartet werden.

Das LDAP-Modul für PAM wird von dem Paket libpam-ldap bereitgestellt.

  • Beim Installieren dieses Pakets werden einige Fragen gestellt, die denen bei libnss-ldap ähnlich sind; einige Konfigurationsparameter (wie zum Beispiel die URI des LDAP-Servers) werden sogar mit dem Paket libnss-ldap gemeinsam benutzt.
  • Die Antworten sind in Tabelle zusammengefasst.
Konfigurierung von libpam-ldap
Frage Antwort
Dem LDAP-Administrationskonto erlauben, sich wie lokales Root zu verhalten? Ja.
  • Dies ermöglicht es, den normalen passwd-Befehl zur Änderung von Passwörtern zu verwenden, die in der LDAP-Datenbank gespeichert sind.
Erfordert die LDAP-Datenbank eine Anmeldung? nein
LDAP account for root: cn=admin,dc=falcot,dc=com
LDAP administrative password: das Verwaltungspasswort der LDAP-Datenbank
Local encryption algorithm to use for passwords: crypt
PAM profiles to enable: LDAP Authentication is among the enabled profiles

Durch das Installieren von libpam-ldap wird die standardmäßige PAM-Konfiguration, die in den Dateien /etc/pam.d/common-auth, /etc/pam.d/common-password und /etc/pam.d/common-account festgelegt ist, automatisch angepasst.

  • Dieser Vorgang verwendet das spezielle Hilfsprogramm pam-auth-update (vom Paket libpam-runtime bereitgestellt).
  • Dieses Programm kann auch vom Administrator eingesetzt werden, falls er PAM-Module aktivieren oder deaktivieren möchte.

LDAP-Datenaustausch absichern

Standardmäßig überträgt das LDAP-Protokoll im Klartext über das Netzwerk; dies gilt auch für die (verschlüsselten) Passwörter.

  • Da die verschlüsselten Passwörter aus dem Netzwerk entnommen werden können, werden sie anfällig für Wörterbuchangriffe sein.
  • Dies kann durch den Einsatz einer zusätzlichen Verschlüsselungsschicht verhindert werden; die Aktivierung dieser Schicht ist das Thema dieses Abschnitts.

Den Server konfigurieren

Der erste Schritt besteht darin, ein Schlüsselpaar für den LDAP-Server zu erstellen (bestehend aus einem öffentlichen Schlüssel und einem privaten Schlüssel).

  • Die Falcot-Administratoren verwenden wieder easy-rsa, um es zu erzeugen (siehe Abschnitt 10.2.2, „Public-Key-Infrastrultur: easy-rsa).
  • Wenn Sie ./easyrsa build-server-full ldap.falcot.com nopass ausführen, werden Sie nach dem "Common Name" gefragt.
  • Die Antwort auf diese Frage muss der vollqualifizierte Hostname für den LDAP-Server sein; in unserem Fall ldap.falcot.com.

Dieser Befehl erstellt ein Zertifikat in der Datei pki/issued/ldap.falcot.com.crt; der dazugehörige private Schlüssel wird in der Datei pki/private/ldap.falcot.com.key abgespeichert.

Jetzt müssen diese Schlüssel an ihrem Standard-Platz installiert werden, und wir müssen dafür Sorge tragen, dass die private Datei vom LDAP-Sever gelesen werden kann, der unter der Userkennung openldap läuft:

# adduser openldap ssl-cert
Adding user `openldap' to group `ssl-cert' ...
Adding user openldap to group ssl-cert
Done.
# mv pki/private/ldap.falcot.com.key /etc/ssl/private/ldap.falcot.com.key
# chown root.ssl-cert /etc/ssl/private/ldap.falcot.com.key
# chmod 0640 /etc/ssl/private/ldap.falcot.com.key
# mv pki/issued/ldap.falcot.com.crt /etc/ssl/certs/ldap.falcot.com.pem
# chown root.root /etc/ssl/certs/ldap.falcot.com.pem
# chmod 0644 /etc/ssl/certs/ldap.falcot.com.pem

Der Hintergrundprozess slapd muss ebenfalls dazu gebracht werden, diese Schlüssel für die Verschlüsselung zu verwenden.

  • Die Konfiguration des LDAP-Servers wird dynamisch verwaltet: Die Konfiguration kann mit normalen LDAP-Vorgänge innerhalb der Objekt-Hierarchie cn=config aktualisiert werden und der Server aktualisiert /etc/ldap/slapd.d in Echtzeit, um die Konfiguration anhaltend zu machen. Ldapmodify ist also das geeignete Werkzeug, um die Konfiguration zu aktualisieren:
slapd für eine Verschlüsselung konfigurieren
# cat >ssl.ldif <<END
dn: cn=config
changetype: modify
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap.falcot.com.key
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
END
# ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
# systemctl restart slapd.service
# ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config -s base | grep TLS
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
olcTLSCertificateKeyFile: /etc/ssl/certs/ldap.falcot.com.key
WERKZEUG ldapvi um ein LDAP-Verzeichnis zu editieren

With ldapvi, you can display an LDIF output of any part of the LDAP directory, make some changes in the text editor, and let the tool do the corresponding LDAP operations for you.

Es ist deshalb eine komfortable Methode, die Konfiguration des LDAP-Servers einfach durch Ändern der Hierarchie cn=config auf dem Laufenden zu halten.

# ldapvi -Y EXTERNAL -h ldapi:/// -b cn=config

Der letzte Schritt zur Aktivierung der Verschlüsselung besteht darin, die Variable SLAPD_SERVICES in der Datei /etc/default/slapd zu ändern.

  • Wir gehen dabei auf Nummer Sicher und deaktivieren nicht abgesichertes LDAP vollständig.
/etc/default/slapd
# Default location of the slapd.conf file or slapd.d cn=config directory. 
  • If
# empty, use the compiled-in default (/etc/ldap/slapd.d with a fallback to
# /etc/ldap/slapd.conf).
SLAPD_CONF=

# System account to run the slapd server under. 
  • If empty the server
# will run as root.
SLAPD_USER="openldap"

# System group to run the slapd server under. 
  • If empty the server will
# run in the primary group of its user.
SLAPD_GROUP="openldap"

# Path to the pid file of the slapd server. 
  • If not set the init.d script
# will try to figure it out from $SLAPD_CONF (/etc/ldap/slapd.d by
# default)
SLAPD_PIDFILE=

# slapd normally serves ldap only on all TCP-ports 389. 
  • slapd can also
# service requests on TCP-port 636 (ldaps) and requests via unix
# sockets.
# Example usage:
# SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"
SLAPD_SERVICES="ldaps:/// ldapi:///"

# If SLAPD_NO_START is set, the init script will not start or restart
# slapd (but stop will still work).  Uncomment this if you are
# starting slapd via some other means or if you don't want slapd normally
# started at boot.
#SLAPD_NO_START=1

# If SLAPD_SENTINEL_FILE is set to path to a file and that file exists,
# the init script will not start or restart slapd (but stop will still
# work).  Use this for temporarily disabling startup of slapd (when doing
# maintenance, for example, or through a configuration management system)
# when you don't want to edit a configuration file.
SLAPD_SENTINEL_FILE=/etc/ldap/noslapd

# For Kerberos authentication (via SASL), slapd by default uses the system
# keytab file (/etc/krb5.keytab).  To use a different keytab file,
# uncomment this line and change the path.
#export KRB5_KTNAME=/etc/krb5.keytab

# Additional options to pass to slapd
SLAPD_OPTIONS=""

Den Client konfigurieren

Auf der Client-Seite muss die Konfiguration der Module libpam-ldap und libnss-ldap angepasst werden um einen ldaps:// URI zu nutzen zu können.

LDAP clients also need to be able to authenticate the server.

  • In an X.509 public key infrastructure, public certificates are signed by the key of a certificate authority (CA).
  • With easy-rsa, the Falcot administrators have created their own CA and they now need to configure the system to trust the signatures of Falcot's CA.
  • This can be done by putting the CA certificate in /usr/local/share/ca-certificates and running update-ca-certificates.
# cp pki/ca.crt /usr/local/share/ca-certificates/falcot.crt
# update-ca-certificates
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...

Adding debian:falcot.pem
done.
done.

Nicht zuletzt kann der voreingestellte URI und die Basis-DN, die von diversen Kommandozeilen-Tools verwendet werden, können in /etc/ldap/ldap.conf geändert werden.

  • Das erspart einiges an Tipparbeit.
/etc/ldap/ldap.conf
#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

#BASE   dc=example,dc=com
#URI    ldap://ldap.example.com ldap://ldap-provider.example.com:666

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

# TLS certificates (needed for GnuTLS)
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt

Quelle: https://debian-handbook.info/browse/de-DE/stable/sect.ldap-directory.html