Bundesamt für Sicherheit in der Informationstechnik

M 4.384 Sichere Konfiguration von OpenLDAP

Verantwortlich für Initiierung: IT-Sicherheitsbeauftragter, Leiter IT

Verantwortlich für Umsetzung: Administrator

In dieser Maßnahme wird beschrieben, wie der slapd-Server korrekt konfiguriert wird, damit er die ihm zugedachten Aufgaben sicher erfüllt. Um die Sicherheit der Daten eines Verzeichnisdienstes zu gewährleisten, sind auch die verwendeten Client-Anwendungen sicher zu konfigurieren. Dies können, müssen aber nicht, die ldap*-Werkzeuge von Open LDAP sein. Auf die Vielfalt der verfügbaren Werkzeuge kann in den IT-Grundschutz-Katalogen nicht eingegangen werden. Umso wichtiger ist es, den slapd-Server sicher zu konfigurieren, um sich nicht auf die Sicherheitseinstellungen der verwendeten Clients verlassen zu müssen.

Verschiedene Konfigurationswege

Bei OpenLDAP bestehen seit der Version 2.3 zwei verschiedene Wege, um den slapd-Server zu konfigurieren. Der klassische Weg ist, alle Einstellungen in die Datei "slapd.conf" einzutragen. Die Datei wird von OpenLDAP auf Unix- und Linux-Systemen unter usr/local/etc/openldap/slapd.conf abgelegt, kann sich aber auch an anderen Orten befinden, beispielsweise wenn distributionsspezifische Installationspakete verwendet werden. In OpenLDAP 2.3 ist zusätzlich das "slapd-config" Format eingeführt worden. Hierbei handelt es sich um eine hierarchische Datenbank, die unterhalb von /usr/local/etc/openldap/slapd.d bzw. an einem distributionsspezifischen Ort in Form von LDIF-Dateien gespeichert wird.

Der wesentliche Vorteil von "slapd-config" gegenüber "slapd.conf" ist die Möglichkeit, die Konfiguration zur Laufzeit zu verändern, während der slapd-Server bei jeder Änderung in der slapd.conf neu gestartet werden muss. Im Zusammenhang mit der Datenbank "slapd-config" wird deshalb auch von der Online-Konfiguration oder seltener von der RunTimeConfiguration (RTC) gesprochen. Die Online-Konfiguration ist mit dem fest eingestellten Suffix "CN=config" Teil des Verzeichnisbaums im slapd-Server. Bei der Planung ist der Konfigurationsweg auszuwählen und dann beizubehalten. Es ist ferner zu beachten, dass die in der Datei "slapd.conf" sichtbaren Einstellungen nicht gültig sind, wenn die Datenbank "slapd-config" verwendet wird.

Benutzerrechte auf Betriebssystemebene

Während Änderungen der "slapd.conf" umgesetzt werden, indem die Datei editiert wird, sind Änderungen der Online-Konfiguration über Änderungsbefehle im Rahmen des Protokolls LDAP zu initiieren. Daraus folgt, dass ein Administrator bei der Konfiguration via "slapd.conf" Zugriff auf das Dateisystem des IT-Systems benötigt, auf dem der slapd-Server betrieben wird. Dem Systembenutzer, in dessen Kontext der slapd-Server läuft, sollten dagegen nur Leserechte auf die Datei gewährt werden. Für die Konfiguration mittels der Datenbank "slapd-config" ist ein Benutzeraccount im Verzeichnisdienst ausreichend, allerdings muss der Systembenutzer, in dessen Kontext der slapd-Server ausgeführt wird, für das Datenbankverzeichnis schreibberechtigt sein. Wurde OpenLDAP mit root-Berechtigungen installiert und eingerichtet, sind anschließend die Berechtigungen auf das Verzeichnis oftmals falsch gesetzt. Dies kann zur falschen Einschätzung führen, dass der Betrieb des slapd-Servers root-Berechtigungen erfordern würde.

Aufbau der Konfiguration

Die Konfigurationseinstellungen werden in OpenLDAP als Direktiven bezeichnet. Es gibt globale Direktiven, Backend-Direktiven und Datenbank-Direktiven. Die globalen Direktiven werden in Abgrenzung zu den Backends und Datenbanken gelegentlich auch als Frontend-Direktiven bezeichnet. Die Direktiven bauen hierarchisch aufeinander auf: Globale bzw. Frontend-Direktiven können von Backend-Direktiven verdrängt werden und diese wiederum von Datenbank-Direktiven. Direktiven haben teilweise Sub-Direktiven, in denen weitere Einstellungen zur jeweiligen Direktive vorgenommen werden. Dies ist insbesondere bei Backends und Overlays der Fall, die durch eine Direktive aufgerufen und durch Sub-Direktiven konfiguriert werden.

Umwandlung von slapd.conf in slapd-config

Zwischen den Direktiven beider Konfigurationswege besteht eine eindeutige Beziehung, wobei dem jeweiligen Attribut in der Datenbank "slapd-config" in der Regel die Buchstaben "olc" vorangestellt sind (für Online Configuration). So entspricht "backend" in der "slapd.conf" dem Ausdruck "olcBackend" in der Datenbank "slapd-config". Jedes slap*-Werkzeug von OpenLDAP ist in der Lage, eine klassische Konfiguration in eine Online-Konfiguration umzuwandeln, indem mit dem Parameter "-f" die Position von "slapd.conf" angegeben wird und mit dem Parameter "-F" das Zielverzeichnis von der Datenbank "slapd-config". Ein Beispiel ist: slaptest -f /usr/local/etc/openldap/slapd.conf -F /usr/local/etc/openldap/slapd.d.

Unabhängig von der gewählten Konfigurationsmethode muss jede neue oder geänderte Konfiguration mit dem Werkzeug slaptest darauf geprüft werden, ob sie syntaktisch korrekt ist. Dies ist zu tun, bevor der slapd-Server mit der neuen Konfiguration gestartet wird. Bei Änderungen am laufenden System im Rahmen der Online-Konfiguration weist der slapd-Server unzulässige Konfigurationsänderungen ab. Wichtig ist, alle Konfigurationseinstellungen zu dokumentieren, damit sie sich im Notfall schnell reproduzieren lassen.

slapd.conf

Die Datei "slapd.conf" entspricht in ihrer Syntax dem in RFC  2849 definierten LDAP Data Interchange Format (LDIF), das die Administratoren kennen sollten. Die Konfigurationsdatei "slapd.conf" beginnt mit globalen Direktiven. Die globalen Direktiven enthalten die Schema-Spezifikationen. Da die Einbindung von Schemas in die slapd.conf sehr umfangreich werden kann, wird empfohlen, für ein Schema eine eigene lokale Datei zu erstellen und diese mit "include" in der Konfigurationsdatei "slapd.conf" aufzurufen. Auf die globalen Direktiven folgen gegebenenfalls Backend-Direktiven, sofern diese verwendet werden. Sie werden mit der Direktive "backend <typ>" eingeleitet, wobei <typ> das Backend angibt, d. h. dessen Typbezeichnung ohne das Suffix "back-". Ein Beispiel ist "backend hdb". Die dann folgenden Direktiven gelten nicht mehr global, sondern nur für alle Datenbanken dieses Typs. Datenbank-Direktiven werden mit der Direktive "database <typ>" eingeleitet, wobei <typ> analog zu den Backends den Datenbanktyp festlegt. Die folgenden Direktiven gelten dann nur für diese Datenbank. Zu beachten ist, dass der Typ einer bestehenden Datenbank nicht einfach geändert werden darf, indem der Datenbank-Aufruf angepasst wird. Dies hat keinen Einfluss auf die bestehenden Datenstrukturen, die für verschiedene Datenbanktypen unterschiedlich sein können.

slapd-config

Im Konfigurations-Teilbaum der Datenbank "slapd-config" werden globale Direktiven als Werte im Bereich "CN=config" oder in der speziellen Dummy-Datenbank "olcDatabase=frontend, CN=config" eingetragen. Schemas sind Kindelemente des Teilbaums "CN=schema, CN=config". Backends und Datenbanken sind wiederum Kindelemente von "CN=config". Die initiale Konfiguration kann erzeugt werden, indem eine bestehende Konfigurationsdatei "slapd.conf" umgewandelt wird oder indem das Suffix "CN=config" mit seinen Elementen im Format LDIF erstellt und mittels "slapadd" in den Verzeichnisdienst importiert wird. Zu beachten ist, dass die "slap-config"-Konfiguration nicht geändert werden darf, indem die LDIF-Dateien im Datenbank-Verzeichnis "slapd.d" angepasst werden. Dabei werden die als operationelle Attribute geführten Zeitstempel nicht aktualisiert. Der slapd-Server bemerkt diese Änderungen deshalb nicht und setzt sie nicht um.

Overlays

Overlays werden in der Konfigurationsdatei "slapd.conf" entweder bei den globalen Direktiven aufgerufen oder in einem Datenbank-Abschnitt. Overlays sollten erst nach allen anderen datenbankspezifischen Direktiven aufgerufen werden, um Fehlkonfigurationen zu vermeiden, bei denen Datenbank-Direktiven als Sub-Direktiven des Overlays interpretiert werden. In der Datenbank "slapd-config" sind Overlays Kindelemente von "CN=config" (für globale Overlays) oder des Datenbank-Elements (für datenbankspezifische Overlays). Da die genaue Wirkung von Overlays von der Reihenfolge ihres Aufrufs abhängen kann, sind Overlays sorgfältig in die Konfiguration einzufügen. In der Konfigurationsdatei "slapd.conf" werden die Overlays in umgekehrter Reihenfolge der Nennung innerhalb der Datei aufgerufen.

Im Folgenden werden einige grundlegende und sicherheitsspezifische Direktiven aufgeführt, deren Vorgabewerte bei der Konfiguration kontrolliert und gegebenenfalls angepasst werden sollten. Weitere Direktiven befinden sich im OpenLDAP Administrator's Guide sowie den Manpages.

  • suffix bzw. olcSuffix (Datenbank-Direktive)

Dies ist die wichtigste Sub-Direktive eines Datenbank-Aufrufs. Mit ihr wird festgelegt, welcher Teil des Verzeichnisses in der jeweiligen Datenbank abzulegen ist, z. B. "DC=bsi, DC=bund, DC=de". Soll eine Datenbank einen untergeordneten Teilbaum aufnehmen, so muss diese Datenbank vor der übergeordneten Datenbank aufgerufen werden. Zum Beispiel muss "DC=grundschutz, DC=bsi, DC=bund, DC=de" vor "DC=bsi, DC=bund, DC=de" definiert werden, da sonst immer die übergeordnete Datenbank selektiert wird.

  • include (nur slapd.conf)

In dieser Direktive kann auf Dateien außerhalb der Konfigurationsdatei "slapd.conf" verwiesen werden, deren Inhalt dann bei der Auswertung der "slapd.conf" an die Stelle der Direktive tritt. Die Direktive wird empfohlen, um beispielsweise Schema-Definitionen und Zugriffskontrolllisten separat zu verwalten. Die Direktive kann auch in diesen externen Dateien verwendet werden. Der slapd-Server erkennt allerdings keine Ringverweise, was zum Einlesen einer scheinbar unendlich großen Konfiguration führen kann ("slapd.conf" enthält "include ACL1.conf", "ACL1.conf" enthält "include ACL2.conf", "ACL2.conf" enthält "include ACL1.conf"). In einem solchen Fall ist der slapd-Server nicht nutzbar, gegebenenfalls wird der Betrieb des kompletten IT-Systems durch den Ressourcenbedarf des slapd-Servers gestört. Es ist ebenfalls darauf zu achten, dass die für den Betrieb des slapd-Servers verwendete Benutzerkennung ein Leserecht auf die externen Dateien eingeräumt bekommt. Wenn eine "slapd.conf"-Konfiguration in eine "slapd-config"-Konfiguration umgewandelt wird, werden die über "include" eingefügten Dateien einbezogen.

  • idleTimeout bzw. olcIdleTimeout (globale Direktive)

Über diese Direktive wird ein Wert in Sekunden festgelegt, nachdem für eine ungenutzte Verbindung zu einem Client ein "unbind" erzwungen wird. Diese Direktive ist in der Voreinstellung mit 0 belegt und dadurch deaktiviert. Es wird empfohlen, hier einen Wert größer Null zu setzen, damit ungenutzte Verbindungen zu nicht ordnungsgemäß heruntergefahrenen Clients oder zu verlassenen Workstations nicht für Angriffe verwendet werden können. Der Wert sollte sorgsam festgelegt werden und die in der Institution übliche Nutzung nicht behindern. Sinnvoll ist z. B. ein Wert kleiner 900, damit ungenutzte Verbindungen nach spätestens 15 Minuten Inaktivität getrennt werden.

  • referral bzw. olcReferral (globale Direktive)

Diese Direktive benennt einen LDAP-Server, den der slapd-Server an einen anfragenden Client zurückmeldet, wenn der slapd-Server die vom Client gewünschte Operation nicht selbst durchführen kann. Die Direktive sollte mit einem übergeordneten LDAP-Server belegt werden, sofern ein solcher vorhanden ist, um die Verfügbarkeit zu verbessern. Es ist darauf zu achten, keine Ringverweise zwischen gleichberechtigten Servern einzurichten, da dies von einigen Client-Anwendungen nicht bemerkt wird.

  • readonly bzw. olcReadonly (Datenbank-Direktive)

Mit dieser Direktive wird eine Datenbank in einen Nur-Lese-Zustand versetzt.

  • rootDN bzw. olcRootDN und rootPW bzw. olcRootPW (Datenbank-Direktiven)

Über diese beiden Direktiven werden eine administrative Benutzerkennung für die jeweilige Datenbank und das zugehörige Passwort festgelegt. Limits oder Zugriffsbeschränkungen (siehe M 4.387 Sichere Vergabe von Zugriffsrechten auf OpenLDAP ) haben auf diese Benutzerkennung keine Auswirkungen. Die sichere Ablage eines Passwortes, wie in der Maßnahme M 4.388 Sichere Authentisierung gegenüber OpenLDAP beschrieben, ist auch für das Passwort des "rootDN" durchzuführen.

  • sizeLimit bzw. olcSizeLimit (globale Direktive)

Die Direktive schränkt die Anzahl von Ergebnissen für Suchoperationen ein. Der Vorgabewert für die Direktive beträgt 500. Der Wert ist zu prüfen und gegebenenfalls anzupassen, er sollte aber nicht auf "unlimited" gesetzt werden, um Denial-of-Service-Attacken auf den Verzeichnisdienst zu erschweren und vollständige Kopien der Datenbank durch unberechtigte Benutzer zu verhindern.

  • timeLimit bzw. olcTimeLimit (globale Direktive)

Mit dieser Direktive wird die Zeit in Sekunden angegeben, bevor eine Suche abgebrochen wird. Der Vorgabewert für die Direktive beträgt 3600. Der Wert ist zu prüfen und gegebenenfalls anzupassen, er sollte aber nicht auf "unlimited" gesetzt werden, weil er sonst Denial-of-Service-Attacken auf den Verzeichnisdienst erleichtert.

  • limits bzw. olcLimits (Datenbank-Direktive)

Diese Direktive erlaubt Einschränkungen analog zu sizeLimit und timeLimit auf Datenbankebene. In diesem Fall werden globale Limits nicht beachtet. Hier sind auch Limits pro Benutzer möglich. Die Benutzerangabe erfolgt dabei analog zur Benutzerangabe im Rahmen von Zugriffskontrolllisten (siehe M 4.387 Sichere Vergabe von Zugriffsrechten auf OpenLDAP ). Es wird empfohlen, benutzerspezifische Limits zu setzen, um beispielsweise nicht authentisierte Benutzer von der Erkundung der Verzeichnisstruktur abzuhalten oder Einschränkungen zu lockern, wenn sie die Replikation behindern.

Weitere Direktiven werden in anderen Maßnahmen zu OpenLDAP angesprochen, insbesondere in der Maßnahme M 4.385 Konfiguration der durch OpenLDAP verwendeten Datenbank .

Prüffragen:

  • Sind für die Konfiguration von OpenLDAP via slapd.conf die korrekten Berechtigungen auf Betriebssystemebene gesetzt?

  • Werden die Vorgabewerte aller relevanten Konfigurationsdirektiven von OpenLDAP geprüft und gegebenenfalls angepasst?

  • Werden die Sub-Direktiven von Backends und Overlays von OpenLDAP in die Konfiguration einbezogen?

  • Werden angemessene Zeit- und Größenbeschränkungen für die Suche innerhalb von OpenLDAP festgelegt?

  • Wird die Konfiguration des slapd-Servers nach jeder Änderung mit dem Werkzeug slaptest geprüft und nachvollziehbar dokumentiert?

Stand: 13. EL Stand 2013