Inhaltsverzeichnis

OpenLDAP Server unter CentOS 7.x installieren und einrichten

OpenLDAP Logo

Zur zentralen Nutzerdatenverwaltung und -pflege für unseren verschiedenen Dienste, wie z.B. Webanwendungen, bedienen wir uns eines LDAP-Verzeichnisdienstes, genauer gesagt dem OpenLDAP.

LDAP ist ein Netzwerkprotokoll, dient zur Bereitstellung von Verzeichnisdiensten und vermittelt dabei die Kommunikation zwischen dem LDAP-Clients mit dem Directory Server.

Viele wertvolle Information und Konfigurationsbeispiele sind auf der Seite OpenLDAP Software 2.4 Administrator's Guide zu finden.

Installation

OpenLDAP - Server

Die Installation unseres OpenLDAP-Servers gestaltet sich recht einfach, das das notwendige Programmpaket openldap-servers als RPM aus dem Base-Repository unserer CentOS-Installation zur Verfügung gestellt wird. Die Installation selbst erfolgt mit dem Paketverwaltungs-Utility yum von CentOS 7.

 # yum install openldap-servers -y

Neben dem Server-Part openldap-server werden noch ein zusätzliches Paket welches zum Betrieb des Servers benötigt ist, installiert. Was uns die einzelnen Programmpakete mitbringen, erkunden wir bei Bedarf mit der Option qil beim Programm rpm.

openldap-servers

 # rpm -qil openldap-servers
Name        : openldap-servers
Version     : 2.4.39
Release     : 6.el7
Architecture: x86_64
Install Date: Tue 14 Jul 2015 04:57:08 PM CEST
Group       : System Environment/Daemons
Size        : 4887528
License     : OpenLDAP
Signature   : RSA/SHA256, Sat 14 Mar 2015 09:22:49 AM CET, Key ID 24c6a8a7f4a80eb5
Source RPM  : openldap-2.4.39-6.el7.src.rpm
Build Date  : Fri 06 Mar 2015 05:36:42 AM CET
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.openldap.org/
Summary     : LDAP server
Description :
OpenLDAP is an open-source suite of LDAP (Lightweight Directory Access
Protocol) applications and development tools. LDAP is a set of
protocols for accessing directory services (usually phone book style
information, but other information is possible) over the Internet,
similar to the way DNS (Domain Name System) information is propagated
over the Internet. This package contains the slapd server and related files.
/etc/openldap/check_password.conf
/etc/openldap/schema
/etc/openldap/schema/collective.ldif
/etc/openldap/schema/collective.schema
/etc/openldap/schema/corba.ldif
/etc/openldap/schema/corba.schema
/etc/openldap/schema/core.ldif
/etc/openldap/schema/core.schema
/etc/openldap/schema/cosine.ldif
/etc/openldap/schema/cosine.schema
/etc/openldap/schema/duaconf.ldif
/etc/openldap/schema/duaconf.schema
/etc/openldap/schema/dyngroup.ldif
/etc/openldap/schema/dyngroup.schema
/etc/openldap/schema/inetorgperson.ldif
/etc/openldap/schema/inetorgperson.schema
/etc/openldap/schema/java.ldif
/etc/openldap/schema/java.schema
/etc/openldap/schema/misc.ldif
/etc/openldap/schema/misc.schema
/etc/openldap/schema/nis.ldif
/etc/openldap/schema/nis.schema
/etc/openldap/schema/openldap.ldif
/etc/openldap/schema/openldap.schema
/etc/openldap/schema/pmi.ldif
/etc/openldap/schema/pmi.schema
/etc/openldap/schema/ppolicy.ldif
/etc/openldap/schema/ppolicy.schema
/etc/openldap/slapd.conf
/etc/openldap/slapd.conf.bak
/etc/openldap/slapd.d
/etc/sysconfig/slapd
/usr/lib/systemd/system/slapd.service
/usr/lib/tmpfiles.d/slapd.conf
/usr/lib64/openldap/accesslog-2.4.so.2
/usr/lib64/openldap/accesslog-2.4.so.2.10.2
/usr/lib64/openldap/accesslog.la
/usr/lib64/openldap/auditlog-2.4.so.2
/usr/lib64/openldap/auditlog-2.4.so.2.10.2
/usr/lib64/openldap/auditlog.la
/usr/lib64/openldap/back_dnssrv-2.4.so.2
/usr/lib64/openldap/back_dnssrv-2.4.so.2.10.2
/usr/lib64/openldap/back_dnssrv.la
/usr/lib64/openldap/back_ldap-2.4.so.2
/usr/lib64/openldap/back_ldap-2.4.so.2.10.2
/usr/lib64/openldap/back_ldap.la
/usr/lib64/openldap/back_meta-2.4.so.2
/usr/lib64/openldap/back_meta-2.4.so.2.10.2
/usr/lib64/openldap/back_meta.la
/usr/lib64/openldap/back_null-2.4.so.2
/usr/lib64/openldap/back_null-2.4.so.2.10.2
/usr/lib64/openldap/back_null.la
/usr/lib64/openldap/back_passwd-2.4.so.2
/usr/lib64/openldap/back_passwd-2.4.so.2.10.2
/usr/lib64/openldap/back_passwd.la
/usr/lib64/openldap/back_perl-2.4.so.2
/usr/lib64/openldap/back_perl-2.4.so.2.10.2
/usr/lib64/openldap/back_perl.la
/usr/lib64/openldap/back_relay-2.4.so.2
/usr/lib64/openldap/back_relay-2.4.so.2.10.2
/usr/lib64/openldap/back_relay.la
/usr/lib64/openldap/back_shell-2.4.so.2
/usr/lib64/openldap/back_shell-2.4.so.2.10.2
/usr/lib64/openldap/back_shell.la
/usr/lib64/openldap/back_sock-2.4.so.2
/usr/lib64/openldap/back_sock-2.4.so.2.10.2
/usr/lib64/openldap/back_sock.la
/usr/lib64/openldap/check_password.so.1.1
/usr/lib64/openldap/collect-2.4.so.2
/usr/lib64/openldap/collect-2.4.so.2.10.2
/usr/lib64/openldap/collect.la
/usr/lib64/openldap/constraint-2.4.so.2
/usr/lib64/openldap/constraint-2.4.so.2.10.2
/usr/lib64/openldap/constraint.la
/usr/lib64/openldap/dds-2.4.so.2
/usr/lib64/openldap/dds-2.4.so.2.10.2
/usr/lib64/openldap/dds.la
/usr/lib64/openldap/deref-2.4.so.2
/usr/lib64/openldap/deref-2.4.so.2.10.2
/usr/lib64/openldap/deref.la
/usr/lib64/openldap/dyngroup-2.4.so.2
/usr/lib64/openldap/dyngroup-2.4.so.2.10.2
/usr/lib64/openldap/dyngroup.la
/usr/lib64/openldap/dynlist-2.4.so.2
/usr/lib64/openldap/dynlist-2.4.so.2.10.2
/usr/lib64/openldap/dynlist.la
/usr/lib64/openldap/memberof-2.4.so.2
/usr/lib64/openldap/memberof-2.4.so.2.10.2
/usr/lib64/openldap/memberof.la
/usr/lib64/openldap/pcache-2.4.so.2
/usr/lib64/openldap/pcache-2.4.so.2.10.2
/usr/lib64/openldap/pcache.la
/usr/lib64/openldap/ppolicy-2.4.so.2
/usr/lib64/openldap/ppolicy-2.4.so.2.10.2
/usr/lib64/openldap/ppolicy.la
/usr/lib64/openldap/refint-2.4.so.2
/usr/lib64/openldap/refint-2.4.so.2.10.2
/usr/lib64/openldap/refint.la
/usr/lib64/openldap/retcode-2.4.so.2
/usr/lib64/openldap/retcode-2.4.so.2.10.2
/usr/lib64/openldap/retcode.la
/usr/lib64/openldap/rwm-2.4.so.2
/usr/lib64/openldap/rwm-2.4.so.2.10.2
/usr/lib64/openldap/rwm.la
/usr/lib64/openldap/seqmod-2.4.so.2
/usr/lib64/openldap/seqmod-2.4.so.2.10.2
/usr/lib64/openldap/seqmod.la
/usr/lib64/openldap/smbk5pwd-2.4.so.2
/usr/lib64/openldap/smbk5pwd-2.4.so.2.10.2
/usr/lib64/openldap/smbk5pwd.la
/usr/lib64/openldap/sssvlv-2.4.so.2
/usr/lib64/openldap/sssvlv-2.4.so.2.10.2
/usr/lib64/openldap/sssvlv.la
/usr/lib64/openldap/syncprov-2.4.so.2
/usr/lib64/openldap/syncprov-2.4.so.2.10.2
/usr/lib64/openldap/syncprov.la
/usr/lib64/openldap/translucent-2.4.so.2
/usr/lib64/openldap/translucent-2.4.so.2.10.2
/usr/lib64/openldap/translucent.la
/usr/lib64/openldap/unique-2.4.so.2
/usr/lib64/openldap/unique-2.4.so.2.10.2
/usr/lib64/openldap/unique.la
/usr/lib64/openldap/valsort-2.4.so.2
/usr/lib64/openldap/valsort-2.4.so.2.10.2
/usr/lib64/openldap/valsort.la
/usr/libexec/openldap/check-config.sh
/usr/libexec/openldap/convert-config.sh
/usr/libexec/openldap/functions
/usr/libexec/openldap/generate-server-cert.sh
/usr/libexec/openldap/upgrade-db.sh
/usr/sbin/slapacl
/usr/sbin/slapadd
/usr/sbin/slapauth
/usr/sbin/slapcat
/usr/sbin/slapd
/usr/sbin/slapdn
/usr/sbin/slapindex
/usr/sbin/slappasswd
/usr/sbin/slapschema
/usr/sbin/slaptest
/usr/share/doc/openldap-servers-2.4.39
/usr/share/doc/openldap-servers-2.4.39/README.back_perl
/usr/share/doc/openldap-servers-2.4.39/README.check_pwd
/usr/share/doc/openldap-servers-2.4.39/README.schema
/usr/share/doc/openldap-servers-2.4.39/README.smbk5pwd
/usr/share/doc/openldap-servers-2.4.39/SampleLDAP.pm
/usr/share/doc/openldap-servers-2.4.39/allmail-en.png
/usr/share/doc/openldap-servers-2.4.39/allusersgroup-en.png
/usr/share/doc/openldap-servers-2.4.39/config_dit.png
/usr/share/doc/openldap-servers-2.4.39/config_local.png
/usr/share/doc/openldap-servers-2.4.39/config_ref.png
/usr/share/doc/openldap-servers-2.4.39/config_repl.png
/usr/share/doc/openldap-servers-2.4.39/delta-syncrepl.png
/usr/share/doc/openldap-servers-2.4.39/dual_dc.png
/usr/share/doc/openldap-servers-2.4.39/guide.html
/usr/share/doc/openldap-servers-2.4.39/intro_dctree.png
/usr/share/doc/openldap-servers-2.4.39/intro_tree.png
/usr/share/doc/openldap-servers-2.4.39/ldap-sync-refreshandpersist.png
/usr/share/doc/openldap-servers-2.4.39/ldap-sync-refreshonly.png
/usr/share/doc/openldap-servers-2.4.39/n-way-multi-master.png
/usr/share/doc/openldap-servers-2.4.39/push-based-complete.png
/usr/share/doc/openldap-servers-2.4.39/push-based-standalone.png
/usr/share/doc/openldap-servers-2.4.39/refint.png
/usr/share/doc/openldap-servers-2.4.39/set-following-references.png
/usr/share/doc/openldap-servers-2.4.39/set-memberUid.png
/usr/share/doc/openldap-servers-2.4.39/set-recursivegroup.png
/usr/share/man/man5/slapd-bdb.5.gz
/usr/share/man/man5/slapd-config.5.gz
/usr/share/man/man5/slapd-dnssrv.5.gz
/usr/share/man/man5/slapd-hdb.5.gz
/usr/share/man/man5/slapd-ldap.5.gz
/usr/share/man/man5/slapd-ldbm.5.gz
/usr/share/man/man5/slapd-ldif.5.gz
/usr/share/man/man5/slapd-mdb.5.gz
/usr/share/man/man5/slapd-meta.5.gz
/usr/share/man/man5/slapd-monitor.5.gz
/usr/share/man/man5/slapd-ndb.5.gz
/usr/share/man/man5/slapd-null.5.gz
/usr/share/man/man5/slapd-passwd.5.gz
/usr/share/man/man5/slapd-perl.5.gz
/usr/share/man/man5/slapd-relay.5.gz
/usr/share/man/man5/slapd-shell.5.gz
/usr/share/man/man5/slapd-sock.5.gz
/usr/share/man/man5/slapd-sql.5.gz
/usr/share/man/man5/slapd.access.5.gz
/usr/share/man/man5/slapd.backends.5.gz
/usr/share/man/man5/slapd.conf.5.gz
/usr/share/man/man5/slapd.overlays.5.gz
/usr/share/man/man5/slapd.plugin.5.gz
/usr/share/man/man5/slapo-accesslog.5.gz
/usr/share/man/man5/slapo-auditlog.5.gz
/usr/share/man/man5/slapo-chain.5.gz
/usr/share/man/man5/slapo-collect.5.gz
/usr/share/man/man5/slapo-constraint.5.gz
/usr/share/man/man5/slapo-dds.5.gz
/usr/share/man/man5/slapo-dyngroup.5.gz
/usr/share/man/man5/slapo-dynlist.5.gz
/usr/share/man/man5/slapo-memberof.5.gz
/usr/share/man/man5/slapo-pbind.5.gz
/usr/share/man/man5/slapo-pcache.5.gz
/usr/share/man/man5/slapo-ppolicy.5.gz
/usr/share/man/man5/slapo-refint.5.gz
/usr/share/man/man5/slapo-retcode.5.gz
/usr/share/man/man5/slapo-rwm.5.gz
/usr/share/man/man5/slapo-sock.5.gz
/usr/share/man/man5/slapo-sssvlv.5.gz
/usr/share/man/man5/slapo-syncprov.5.gz
/usr/share/man/man5/slapo-translucent.5.gz
/usr/share/man/man5/slapo-unique.5.gz
/usr/share/man/man5/slapo-valsort.5.gz
/usr/share/man/man8/slapacl.8.gz
/usr/share/man/man8/slapadd.8.gz
/usr/share/man/man8/slapauth.8.gz
/usr/share/man/man8/slapcat.8.gz
/usr/share/man/man8/slapd.8.gz
/usr/share/man/man8/slapdn.8.gz
/usr/share/man/man8/slapindex.8.gz
/usr/share/man/man8/slappasswd.8.gz
/usr/share/man/man8/slapschema.8.gz
/usr/share/man/man8/slaptest.8.gz
/usr/share/openldap-servers
/usr/share/openldap-servers/DB_CONFIG.example
/usr/share/openldap-servers/slapd.ldif
/var/lib/ldap
/var/run/openldap

libtool-ltdl

 # rpm -qil libtool-ltdl
Name        : libtool-ltdl
Version     : 2.4.2
Release     : 20.el7
Architecture: x86_64
Install Date: Tue 14 Jul 2015 04:57:06 PM CEST
Group       : System Environment/Libraries
Size        : 67790
License     : LGPLv2+
Signature   : RSA/SHA256, Fri 04 Jul 2014 05:21:50 AM CEST, Key ID 24c6a8a7f4a80eb5
Source RPM  : libtool-2.4.2-20.el7.src.rpm
Build Date  : Tue 10 Jun 2014 02:10:05 AM CEST
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.gnu.org/software/libtool/
Summary     : Runtime libraries for GNU Libtool Dynamic Module Loader
Description :
The libtool-ltdl package contains the GNU Libtool Dynamic Module Loader, a
library that provides a consistent, portable interface which simplifies the
process of using dynamic modules.

These runtime libraries are needed by programs that link directly to the
system-installed ltdl libraries; they are not needed by software built using
the rest of the GNU Autotools (including GNU Autoconf and GNU Automake).
/usr/lib64/libltdl.so.7
/usr/lib64/libltdl.so.7.3.0
/usr/share/doc/libtool-ltdl-2.4.2
/usr/share/doc/libtool-ltdl-2.4.2/COPYING.LIB

OpenLDAP - Client

Da wir auf unserem Server später auch auf Hilfsprogramme des openldap-clients zurückgreifen wollen, installieren wir auch noch dieses Paket.

Auch dieses Paket wird mit Hilfe der Paketverwaltungshilfsprogarmmes yum installieren.

 # yum install openldap-clients -y

Was uns dieses Programmpaket mitbringt, ermitteln wir bei Bedarf mit der Option qil beim Programm rpm.

 # rpm -qil openldap-clients
Name        : openldap-clients
Version     : 2.4.39
Release     : 6.el7
Architecture: x86_64
Install Date: Tue 14 Jul 2015 05:03:00 PM CEST
Group       : Applications/Internet
Size        : 588433
License     : OpenLDAP
Signature   : RSA/SHA256, Sat 14 Mar 2015 09:22:43 AM CET, Key ID 24c6a8a7f4a80eb5
Source RPM  : openldap-2.4.39-6.el7.src.rpm
Build Date  : Fri 06 Mar 2015 05:36:42 AM CET
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.openldap.org/
Summary     : LDAP client utilities
Description :
OpenLDAP is an open-source suite of LDAP (Lightweight Directory Access
Protocol) applications and development tools. LDAP is a set of
protocols for accessing directory services (usually phone book style
information, but other information is possible) over the Internet,
similar to the way DNS (Domain Name System) information is propagated
over the Internet. The openldap-clients package contains the client
programs needed for accessing and modifying OpenLDAP directories.
/usr/bin/ldapadd
/usr/bin/ldapcompare
/usr/bin/ldapdelete
/usr/bin/ldapexop
/usr/bin/ldapmodify
/usr/bin/ldapmodrdn
/usr/bin/ldappasswd
/usr/bin/ldapsearch
/usr/bin/ldapurl
/usr/bin/ldapwhoami
/usr/share/man/man1/ldapadd.1.gz
/usr/share/man/man1/ldapcompare.1.gz
/usr/share/man/man1/ldapdelete.1.gz
/usr/share/man/man1/ldapexop.1.gz
/usr/share/man/man1/ldapmodify.1.gz
/usr/share/man/man1/ldapmodrdn.1.gz
/usr/share/man/man1/ldappasswd.1.gz
/usr/share/man/man1/ldapsearch.1.gz
/usr/share/man/man1/ldapurl.1.gz
/usr/share/man/man1/ldapwhoami.1.gz

OpenLDAP

Bei der Grundinstallation unseres Servers wurde bereits das Paket openldap installiert. Auf Inhalte dieses RPM, wie z.B. die Datei /etc/openldap/ldap.conf werden wir bei der weiteren Konfiguration unseres OpenLDAP-Servers zurückgreifen.

Welche Details dieses Programmpaket mitbrachte, ermitteln wir bei Bedarf mit der Option qil beim Programm rpm.

 # rpm -qil openldap
Name        : openldap
Version     : 2.4.39
Release     : 6.el7
Architecture: x86_64
Install Date: Wed 15 Jul 2015 10:04:48 AM CEST
Group       : System Environment/Daemons
Size        : 1004518
License     : OpenLDAP
Signature   : RSA/SHA256, Sat 14 Mar 2015 09:22:41 AM CET, Key ID 24c6a8a7f4a80eb5
Source RPM  : openldap-2.4.39-6.el7.src.rpm
Build Date  : Fri 06 Mar 2015 05:36:42 AM CET
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.openldap.org/
Summary     : LDAP support libraries
Description :
OpenLDAP is an open source suite of LDAP (Lightweight Directory Access
Protocol) applications and development tools. LDAP is a set of
protocols for accessing directory services (usually phone book style
information, but other information is possible) over the Internet,
similar to the way DNS (Domain Name System) information is propagated
over the Internet. The openldap package contains configuration files,
libraries, and documentation for OpenLDAP.
/etc/openldap
/etc/openldap/certs
/etc/openldap/ldap.conf
/usr/lib64/liblber-2.4.so.2
/usr/lib64/liblber-2.4.so.2.10.2
/usr/lib64/libldap-2.4.so.2
/usr/lib64/libldap-2.4.so.2.10.2
/usr/lib64/libldap_r-2.4.so.2
/usr/lib64/libldap_r-2.4.so.2.10.2
/usr/lib64/libslapi-2.4.so.2
/usr/lib64/libslapi-2.4.so.2.10.2
/usr/libexec/openldap
/usr/libexec/openldap/create-certdb.sh
/usr/share/doc/openldap-2.4.39
/usr/share/doc/openldap-2.4.39/ANNOUNCEMENT
/usr/share/doc/openldap-2.4.39/CHANGES
/usr/share/doc/openldap-2.4.39/COPYRIGHT
/usr/share/doc/openldap-2.4.39/LICENSE
/usr/share/doc/openldap-2.4.39/README
/usr/share/man/man5/ldap.conf.5.gz
/usr/share/man/man5/ldif.5.gz

vorbereitende Konfiguration

Wie schon bei der Konfiguration von OpenLDAP unter CentOS 6, nehmen wir die Konfiguration von OpenLDAP Version 2.4.xx unter CentOS 7 mit Hilfe von ldif-Dateien vor. Der Vorteil dieser Konfigurationsvariante gegenüber der früheren Konfiguration mit Hilfe einer zentralen Konfigurationsdatei /etc/openldap/slapd.conf besteht darin, dass Änderungen an der Konfiguration des OpenLDAP-Servers aktiv werden, ohne den Server selbst neu zu starten. Änderungen werden also quasi on the fly aktiv.

Die beiden wichtigsten Konfigurationsdateien lauten /etc/openldap/ldap.conf und /var/lib/ldap/DB_CONFIG und natürlich das Konfigurationsverzeichnis /etc/openldap/slapd.d/ .

ldif

Die eigentliche Konfiguration unseres LDAP-Verzeichnisdienstes erfolgt an Hand einzelner ldif-Dateien. Hierzu legen wir uns ein passendes Verzeichnis an.

 # mkdir /etc/openldap/ldif

Anschließend passen wir die Rechte an dem neu angelegtem Verzeichnis an.

 # chown ldap.ldap /etc/openldap/ldif

ldap.conf

In der Konfigurationsdatei /etc/openldap/ldap.conf wird die Basis-Domain für den LDAP-Client festgelegt. Mit dem Editor unserer Wahl bearbeiten wir nun diese Datei und tragen dort ein:

 # vim /etc/openldap/ldap.conf
/etc/openldap/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-master.example.com:666
 
# Django: 2015-07-14
BASE    dc=nausch, dc=org                   # Definition des standardmässig abgefragten Teilbaums / Searchbase
                                            # Anfragen werden unterhalb von dc=nausch, dc=org ausgeführt.
URI     ldap://openldap.dmz.nausch.org      # Definition des LDAP-Servers 
 
 
#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never
 
TLS_CACERTDIR   /etc/openldap/certs
 
# Turning this off breaks GSSAPI used with krb5 when rdns = false
SASL_NOCANON    on

DB_CONFIG

Als Backend-Datenbank für unseren zentralen Verzeichnisdienst nutzen wir eine Berkeley DB, die sich im UNIXiden Umfeld bestens bewährt hat. Hierzu muss im Verzeichnis /var/lib/ldap/ eine entsprechend Konfigurationsdatei DB_CONFIG vorgehalten werden.

Bei der Installation unseres openldap-servers RPM-Paketes wird uns eine entsprechende Musterkonfigurationsdatei bereits mitgeliefert. Diese muss nur noch an Ort und Stelle kopiert und die Benutzer- und Gruppenrechte angepasst werden.

Als erstes kopieren wir uns die Vorlage Datei in unser Konfigurationsverzeichnis.

 # cp -a /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

Anschliessend passen wir noch die Benutzer- und Gruppenrechte an.

 # chown ldap:ldap /var/lib/ldap/DB_CONFIG

Eine weitere Bearbeitung der nun vorliegenden Konfigurationsdatei DB_CONFIG ist nicht notwendig, die Datei kann 1:1 so verwendet werden, wie diese aus dem RPM gefallen ist.

/var/lib/ldap/DB_CONFIG
# $OpenLDAP$
# Example DB_CONFIG file for use with slapd(8) BDB/HDB databases.
#
# See the Oracle Berkeley DB documentation
#   <http://www.oracle.com/technology/documentation/berkeley-db/db/ref/env/db_config.html>
# for detail description of DB_CONFIG syntax and semantics.
#
# Hints can also be found in the OpenLDAP Software FAQ
#       <http://www.openldap.org/faq/index.cgi?file=2>
# in particular:
#   <http://www.openldap.org/faq/index.cgi?file=1075>
 
# Note: most DB_CONFIG settings will take effect only upon rebuilding
# the DB environment.
 
# one 0.25 GB cache
set_cachesize 0 268435456 1
 
# Data Directory
#set_data_dir db
 
# Transaction Log settings
set_lg_regionmax 262144
set_lg_bsize 2097152
#set_lg_dir logs
 
# Note: special DB_CONFIG flags are no longer needed for "quick"
# slapadd(8) or slapindex(8) access (see their -q option).

rsyslog

Damit unser LDAP-Server seine Meldungen auch sichtbar uns zur Verfügung stellt, lassen wir ihm diese ganz einfach in ein separates Logfile schreiben. Hierzu passen wir in der Konfigurationsdatei /etc/rsyslog.conf des Standard-LOG-Deamons/Service rsyslog unter CentOS 7 entsprechend an und tragen eine entsprechende Regel unter der Sektion #### RULES #### ein.

 # vim /etc/rsyslog.conf
/etc/rsyslog.conf
# rsyslog configuration file
 
# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
 
#### MODULES ####
 
# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)
#$ModLoad immark  # provides --MARK-- message capability
 
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
 
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
 
 
#### GLOBAL DIRECTIVES ####
 
# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog
 
# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
 
# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on
 
# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf
 
# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
$OmitLocalLogging on
 
# File to store the position in the journal
$IMJournalStateFile imjournal.state
 
 
#### RULES ####
 
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console
 
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
 
# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
 
# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog
 
 
# Log cron stuff
cron.*                                                  /var/log/cron
 
# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*
 
# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler
 
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
 
# Django : 2015-07-14 Logging für OpenLDAP-Server aktiviert
local4.*                                                -/var/log/ldap.log
#
 
# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList   # run asynchronously
#$ActionResumeRetryCount -1    # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
#
# Django : 2015-06-12
$template GRAYLOGRFC5424,"<%PRI%>%PROTOCOL-VERSION% %TIMESTAMP:::date-rfc3339% %HOSTNAME% %APP-NAME% %PROCID% %MSGID% %STRUCTURED-DATA% %msg%\n"
*.* @@10.0.0.57:514;GRAYLOGRFC5424
#
# ### end of the forwarding rule ###

Anschließend müssen wir den rsyslog-Service einmal durchstarten, damit er unsere Änderungen akzeptiert und umsetzt.

 # systemctl condrestart rsyslog.service

Wollen wir uns vergewissern, ob der Service neu gestartet wurde, können wir dies mit folgendem Befehl abfragen.

 # systemctl status rsyslog.service

rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled)
   Active: active (running) since Tue 2015-07-14 22:01:29 CEST; 8s ago
 Main PID: 23567 (rsyslogd)
   CGroup: /system.slice/rsyslog.service
           └─23567 /usr/sbin/rsyslogd -n

Jul 14 22:01:29 vml000037.dmz.nausch.org systemd[1]: Started System Logging Service.

logrotate

Bei einem unter Last stehendem OpenLDAP-Verzeichnisdienstserver kann unter Umständen das zugehörige Logfile /var/log/ldap.log recht schnell anwachsen. Leider wir in dem RPM-Paket openldap-servers keine Konfigurationsdatei zur Rotation der Logdatei mitgeliefert, so dass wir uns diese kurz selbst erstellen. Hierzu benutzen wir den Editor unserer Wahl, z.B. vim.

 # vim /etc/logrotate.d/ldap
/etc/logrotate.d/ldap
# Django : 2015-07-14
# logrotate für unseren OpenLDAP-Verzeichnisdienst aktiviert
/var/log/ldap.log {
        rotate 4
        weekly
        compress
        notifempty
        size 5M
        missingok
        create 0640 ldap ldap
        sharedscripts
        postrotate
        /bin/kill -HUP `cat /var/run/sldapd.pid 2> /dev/null` 2> /dev/null || true
        endscript
}

Paketfilter / Firewall

Damit nun die Clients sich mit unserem Verzeichnisdienst mit den Ports 389 (ldap) oder 636 (ldaps) verbinden können, müssen wir noch entsprechende Firewall-Regeln definieren.

Unter CentOS 7 wird als Standard-Firewall die dynamische firewalld verwendet. Ein grosser Vorteil der dynamischen Paketfilterregeln ist unter anderem, dass zur Aktivierung der neuen Firewall-Regel(n) nicht der Daemon durchgestartet werden muss und somit alle aktiven Verbindungen kurz getrennt werden. Sondern unsere Änderungen können on-the-fly aktiviert oder auch wieder deaktiviert werden.

In unserem Konfigurationsbeispiel hat unser Keyserver-Server die IP-Adresse 10.0.0.37. Wir brauchen also eine Firewall-Definition, die Verbindungen von allen Source-IPs also 0.0.0.0/0 auf die Destination-IP 10.0.0.37 auf den beiden Ports 389 und 636 gestattet.

Mit Hilfe des Programms firewall-cmd legen wir nun eine permanente Regel in der Zone public, dies entspricht in unserem Beispiel das Netzwerk-Interface eth0 mit der IP 10.0.0.37 an. Als Source-IP geben wir die IP-Adresse unseres Postfix-Servers also die 0.0.0.0/0 an. Genug der Vorrede, mit nachfolgendem Befehl wird diese restriktive Regel angelegt.

 # firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="389" destination address="10.0.0.37/32" accept"
 # firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="636" destination address="10.0.0.37/32" accept"

Zum Aktivieren brauchen wir nun nur einen reload des Firewall-Daemon vornehmen.

 # firewall-cmd --reload

Fragen wir nun den Regelsatz unserer iptables-basieten Firewall ab, finden wir in der Chain IN_public_allow unsere aktive Regel.

 # iptables -nvL IN_public_allow
Chain IN_public_allow (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       10.0.0.0/24          10.0.0.37            tcp dpt:636 ctstate NEW
    0     0 ACCEPT     tcp  --  *      *       10.0.0.0/24          10.0.0.37            tcp dpt:389 ctstate NEW

Systemstart

Nachdem die „minimalistische Basiskonfiguration“ soweit abgeschlossen ist, können wir unseren OpenLDAP-Daemon das erste mal anstarten.

erster manueller Start

Wie unter CentOS 7 üblich erfolgt der Start eines Services über den Befehl systemctl.

 # systemctl start slapd.service

Den erfolgreiche Start können wir überprüfen, indem wir den Status des Daemon abfragen.

 # systemctl status slapd.service

slapd.service - OpenLDAP Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/slapd.service; disabled)
   Active: active (running) since Wed 2015-07-15 11:11:10 CEST; 9s ago
     Docs: man:slapd                                                  
           man:slapd-config                                           
           man:slapd-hdb                                              
           man:slapd-mdb                                              
           file:///usr/share/doc/openldap-servers/guide.html          
  Process: 15154 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=0/SUCCESS)
  Process: 15139 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)               
 Main PID: 15157 (slapd)                                                                                          
   CGroup: /system.slice/slapd.service                                                                            
           └─15157 /usr/sbin/slapd -u ldap -h ldapi:/// ldap:///                                                  

Jul 15 11:11:10 vml000037.dmz.nausch.org runuser[15142]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
Jul 15 11:11:10 vml000037.dmz.nausch.org runuser[15142]: pam_unix(runuser:session): session closed for user ldap           
Jul 15 11:11:10 vml000037.dmz.nausch.org slapd[15154]: @(#) $OpenLDAP: slapd 2.4.39 (Mar  6 2015 04:35:49) $               
                                                               mockbuild@worker1.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.39/openldap-2.4.39/servers/slapd
Jul 15 11:11:10 vml000037.dmz.nausch.org slapd[15157]: slapd starting                                                                                               
Jul 15 11:11:10 vml000037.dmz.nausch.org systemd[1]: Started OpenLDAP Server Daemon. /font>

Der erfolgreiche Start des Daemon wird natürlich in unserer separaten OpenLDAP-Logdatei vermerkt.

 # cat /var/log/ldap.log
Jul 15 11:11:10 vml000037 slapd[15154]: @(#) $OpenLDAP: slapd 2.4.39 (Mar  6 2015 04:35:49) $
        mockbuild@worker1.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.39/openldap-2.4.39/servers/slapd
Jul 15 11:11:10 vml000037 slapd[15157]: slapd starting

Als Backend-Datenbank für unseren zentralen Verzeichnisdienst haben wir eine Berkeley DB definiert. Hierzu haben wir im Verzeichnis /var/lib/ldap/ eine entsprechend Konfigurationsdatei install abgelegt. Bei Starten des Daemon wurden daher die zugehörigen Datenbank-Dateien abgelegt.

/var/lib/ldap
├── alock
├── __db.001
├── __db.002
├── __db.003
├── DB_CONFIG
├── dn2id.bdb
├── id2entry.bdb
└── log.0000000001

automatischer Start des Services beim Systemstart

Damit nun unser OpenLDAP-Verzeichnisdienstserver beim Booten automatisch gestartet wird, nehmen wir noch folgenden Konfigurationsschritt vor.

 # systemctl enable slapd.service
ln -s '/usr/lib/systemd/system/slapd.service' '/etc/systemd/system/multi-user.target.wants/slapd.service'

Wollen wir überprüfen, ob der slapd beim Hochfahren des Systems automatisch gestartet wird oder nicht, können wir wie folgt abfragen.

 # systemctl is-enabled slapd.service
enabled

Wird statt dem enabled ein disabled ist der automatische Start deaktiviert.

Grundkonfiguration

Wie bei der vorbereitenden Konfiguration bereits erwähnt, erfolgt die eigentliche Konfiguration an Hand von einzelnen ldif-Dateien.

Mit unter hilfreiche Zusatzinformationen bei der Konfiguration findet man unter anderem auf der Seite vom M 4.384 Sichere Konfiguration von OpenLDAP vom BSI.

Master-Passwort erstellen

Als erstes definieren wir ein Rootpasswort rootpw, welches die administrativen Zugriff nur dem zuständigem Systemadministrator gestatten soll. Zur Generierung dieses Passwortes mit der Verschlüsselungsmethode SSHA - entsprechend einem SHA-1 Algorithmus (FIPS 160-1), nutzen wird das Programm /usr/sbin/slappasswd mit folgendem Befehl aufgerufen:

 # /usr/sbin/slappasswd -h {SSHA}
 New password: 
 Re-enter new password: 
 {SSHA}MT/P3fPtBfI3E2bylGEFxv2/u1KxmVmO

Dieses gecryptete Passwort hinterlegen wir nun in einer passenden ldif-Datei.

 # vim /etc/openldap/ldif/cn=config_olcRootPW.ldif
/etc/openldap/ldif/cn=config_olcRootPW.ldif
# Django : 2015-07-15
# setzen eines Passworts für den administrativen Zugang
# https://dokuwiki.nausch.org/doku.php/centos:ldap_c7:install?&#master-passwort_erstellen
dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}MT/P3fPtBfI3E2bylGEFxv2/u1KxmVmO

Die eigentliche Aktivierung des Root-Passworts erfolgt nun durch Bekanntgabe der gerade angelegten ldif-Datei durch ldapmodify, dem ldapadd - LDAP modify entry and LDAP add entry tools.

 #  ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/ldif/cn\=config_olcRootPW.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"

Die gerade durchgeführte Änderung wird uns auch im LDAP-Log entsprechend vermerkt.

 # less /var/log/ldap.log
Jul 15 12:14:09 vml000037 slapd[15157]: conn=1001 fd=11 ACCEPT from PATH=/var/run/ldapi (PATH=/var/run/ldapi)
Jul 15 12:14:09 vml000037 slapd[15157]: conn=1001 op=0 BIND dn="" method=163
Jul 15 12:14:09 vml000037 slapd[15157]: conn=1001 op=0 BIND authcid="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" authzid="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
Jul 15 12:14:09 vml000037 slapd[15157]: conn=1001 op=0 BIND dn="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" mech=EXTERNAL sasl_ssf=0 ssf=71
Jul 15 12:14:09 vml000037 slapd[15157]: conn=1001 op=0 RESULT tag=97 err=0 text=
Jul 15 12:14:09 vml000037 slapd[15157]: conn=1001 op=1 MOD dn="olcDatabase={0}config,cn=config"
Jul 15 12:14:09 vml000037 slapd[15157]: conn=1001 op=1 MOD attr=olcRootPW
Jul 15 12:14:09 vml000037 slapd[15157]: conn=1001 op=1 RESULT tag=103 err=0 text=
Jul 15 12:14:09 vml000037 slapd[15157]: conn=1001 op=2 UNBIND
Jul 15 12:14:09 vml000037 slapd[15157]: conn=1001 fd=11 closed

Im Verzeichnis /etc/openldap/slapd.d werden mit Hilfe des Befehls ldapmodify Änderungen eingetragen und hinterlegt.

/etc/openldap/slapd.d/
├── cn=config
│   ├── cn=schema
│   │   └── cn={0}core.ldif
│   ├── cn=schema.ldif
│   ├── olcDatabase={0}config.ldif
│   ├── olcDatabase={-1}frontend.ldif
│   ├── olcDatabase={1}monitor.ldif
│   └── olcDatabase={2}hdb.ldif
└── cn=config.ldif

Auf gar keinen Fall dürfen von Hand Änderungen an diesen Dateien vorgenommen werden!

baseDN

Mit der baseDN wird festgelegt, wo genau im LDAP-Verzeichnisbaum abwärts, also quasi der Wurzel des Baums, bei einer Abfrage nach den gewünschten Objekten gestartet werden soll. Da wir diese noch nicht angepasst haben lautet diese im Moment noch auf: dc=my-domain,dc=com. Diese passen wir nun auf unsere Umgebung/Kundenanforderung hin ab - in unserem Konfigurationsbeispiel wird dies dc=nausch,dc=org lauten.

Wie auch schon beim vorangegangenem Beispiel legen wir uns eine passende ldif-Datei an, in der wir dann die Benennung des baseDN vornehmen.

 # vim /etc/openldap/ldif/cn\=config_baseDN.ldif
/etc/openldap/ldif/cn=config_baseDN.ldif
# Django : 2015-07-15
# setzen eines baseDN, der Wurzelknoten unseres Verzeichnisbaums
# https://dokuwiki.nausch.org/doku.php/centos:ldap_c7:install?&#basedn
 
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=nausch,dc=org" read by * none
 
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=nausch,dc=org
 
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=nausch,dc=org

Mittels ldapmodify führen wir nun die Änderungen unserer ldif-Datei aus.

 # ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/ldif/cn\=config_baseDN.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

Zum Überprüfen, ob unsere Änderungen auch wirklich entsprechend unserer ldif-Datei angelegt und geändert wurden, können wir wie folgt überprüfen.

 #  ldapsearch -W -x -D cn=config -b cn=config | grep -b1 cn=Manager
 Enter LDAP Password:

62503-olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external
62582: ,cn=auth" read by dn.base="cn=Manager,dc=nausch,dc=org" read by * none
62654-
--
62897-olcSuffix: dc=nausch,dc=org
62925:olcRootDN: cn=Manager,dc=nausch,dc=org
62964-

Manager-Passwort

Wie auch schon beim Erstellen des Master-Passwortes werden wir nun für den gerade angelegten Manager ein separates Passwort vergeben und so den Zugriff absichern.

Zur Generierung dieses Passwortes mit der Verschlüsselungsmethode SSHA - entsprechend einem SHA-1 Algorithmus (FIPS 160-1), verwenden wir wieder das Programm /usr/sbin/slappasswd mit folgendem Befehl aufgerufen:

 # /usr/sbin/slappasswd -h {SSHA}
 New password: 
 Re-enter new password: 
 {SSHA}MwDWrwwRnw95zMtKA5bS/dpnEHUuOjh0

Dieses gekryptete Passwort hinterlegen wir nun in einer passenden ldif-Datei.

 # vim /etc/openldap/ldif/cn\=config_Manager_olcRootPW.ldif
/etc/openldap/ldif/cn=config_Manager_olcRootPW.ldif
# Django : 2015-07-15
# setzen eines Passworts für den Manager
# https://dokuwiki.nausch.org/doku.php/centos:ldap_c7:install?&#manager-passwort
 
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}MwDWrwwRnw95zMtKA5bS/dpnEHUuOjh0

Die Konfigurationsänderungen werden wie gehabt mit Aufruf des Befehls ldapmodify aktiviert.

 # ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/ldif/cn\=config_Manager_olcRootPW.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"

Ob unsere Änderungen auch wirklich entsprechend unserer ldif-Datei angelegt und geändert wurden, können wir wie folgt überprüfen.

 #  ldapsearch -W -x -D cn=config -b olcDatabase={2}hdb,cn=config
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <olcDatabase={2}hdb,cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# {2}hdb, config
dn: olcDatabase={2}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
olcSuffix: dc=nausch,dc=org
olcRootDN: cn=Manager,dc=nausch,dc=org
olcRootPW: {SSHA}MwDWrwwRnw95zMtKA5bS/dpnEHUuOjh0

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

olcIdleTimeout

Mit Hilfe dieses Parameters wird definiert, nach wie vielen Sekunden ein Klient-Verbindung mittels eines unbind erzwungen werden soll.

Wir legen uns also eine passende Konfigurationsdatei an und weisem dem Parameter einen Wert von 30 Sekunden zu.

 # vim /etc/openldap/ldif/cn\=config_olcIdleTimeout.ldif
/etc/openldap/ldif/cn=config_olcIdleTimeout.ldif
# Django : 2015-07-15
# Definition der max. idle-Zeit nach der die Trennung der Verbindung zum
# Klient durch einen *unbind* erzwungen werden soll.
# https://dokuwiki.nausch.org/doku.php/centos:ldap_c7:install?&#olcidletimeout
 
dn: cn=config
changetype: modify
add: olcIdleTimeout
olcIdleTimeout: 30

Die Änderung unserer OpenLDAP-Konfiguration, aktivieren wir wie folgt:

 # ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/ldif/cn=config_olcIdleTimeout.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

Auch hier können wir überprüfen, ob der zusätzliche Konfigurationsparameter richtig gesetzt wurde.

 # ldapsearch -W -x -D cn=config -b cn=config "(objectclass=olcGlobal)"
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <olcDatabase={2}hdb,cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# config
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcIdleTimeout: 30

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

olcTimeLimit

Mit Hilfe dieses Parameters wird definiert, nach wie vielen Sekunden eine Suche im LDAP-Baum abgebrochen wird.

Wir legen uns also eine passende Konfigurationsdatei an und weisem dem Parameter einen wert von 15 Sekunden zu.

 # vim /etc/openldap/ldif/cn\=config_olcTimeLimit.ldif
/etc/openldap/ldif/cn=config_olcTimeLimit.ldif
# Django : 2015-07-16
# Definition der max. search-Zeit nach der die Suche im LDAP-Baum abgebrochen 
# wird.
# https://dokuwiki.nausch.org/doku.php/centos:ldap_c7:install?&#olctimelimit
 
dn: cn=config
changetype: modify
add: olcTimeLimit
olcTimeLimit: 15

Die Änderung unserer OpenLDAP-Konfiguration, aktivieren wir wie folgt:

 # ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/ldif/cn\=config_olcTimeLimit.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

Auch hier überprüfen wir, ob der zusätzliche Konfigurationsparameter richtig gesetzt wurde.

 # ldapsearch -W -x -D cn=config -b cn=config "(objectclass=olcGlobal)"
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: (objectclass=olcGlobal)
# requesting: ALL
#

# config
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcIdleTimeout: 30
olcPidFile: /var/run/openldap/slapd.pid
olcTimeLimit: 15

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

olcReferral

Mit der Directive olcReferral kann ein LDAP-Server dem anfragenden Client mitteilen an welchen Server sich wenden soll, sofern die Anfrage nicht selbst beantwortet werden kann oder weil die Anfrage fehlerhaft war.

Zur Definition des olcReferral legen wir uns wieder eine zugehörige Datei an.

 # vim /etc/openldap/ldif/cn\=config_olcReferral.ldif
/etc/openldap/ldif/cn=config_olcReferral.ldif
# Django : 2015-07-15
# setzen des zuständigen LDAP-Servers bei Anfagen, die entweder fehlerhaft ware,
# oder die der Server nicht beantworten konnte.
# https://dokuwiki.nausch.org/doku.php/centos:ldap_c7:install?&#olcreferral
 
dn: cn=config
changetype: modify
add: olcReferral
olcReferral: ldap://openldap.dmz.nausch.org

Die Konfigurationsänderungen aktivieren wir wie gehabt mit Aufruf des Befehls ldapmodify.

 # ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/ldif/cn\=config_olcReferral.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

Ob unsere Änderungen entsprechend unserer ldif-Datei angelegt und geändert wurden, können wir wie folgt überprüfen.

 # ldapsearch -W -x -D cn=config -b cn=config "(objectclass=olcGlobal)"
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: (objectclass=olcGlobal)
# requesting: ALL
#

# config
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcIdleTimeout: 30
olcPidFile: /var/run/openldap/slapd.pid
olcReferral: ldap://openldap.dmz.nausch.org
olcTimeLimit: 15

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

olcLogLevel

FIXME

http://www.openldap.org/doc/admin24/slapdconf2.html

 # vim /etc/openldap/ldif/cn=config_GLOBAL_olcLogLevel.ldif
/etc/openldap/ldif/cn=config_GLOBAL_olcLogLevel.ldif
dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: stats
 # ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/ldif/cn\=config_GLOBAL_olcLogLevel.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
 # ldapsearch -W -x -D cn=config -b cn=config "(objectclass=olcGlobal)"
 # Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: (objectclass=olcGlobal)
# requesting: ALL
#

# config
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcDisallows: bind_anon
olcIdleTimeout: 30
olcPidFile: /var/run/openldap/slapd.pid
olcReferral: ldap://openldap.dmz.nausch.org
olcRequires: authc
olcTimeLimit: 15
olcTLSCACertificateFile: /etc/pki/tls/certs/CAcert_chain.pem
olcTLSCACertificatePath: /etc/openldap/certs
olcTLSCertificateFile: /etc/pki/tls/certs/openldap.dmz.nausch.org.pem
olcTLSCertificateKeyFile: /etc/pki/tls/private/openldap_serverkey.pem
olcTLSCipherSuite: HIGH
olcTLSDHParamFile: /etc/pki/tls/private/dh_4096.pem
olcTLSProtocolMin: 3.1
olcLogLevel: stats

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
 # vim /etc/openldap/ldif/cn=config_GLOBAL_olcLogLevel.ldif
/etc/openldap/ldif/cn=config_GLOBAL_olcLogLevel.ldif
dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: none
 # ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/ldif/cn\=config_GLOBAL_olcLogLevel.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
 # ldapsearch -W -x -D cn=config -b cn=config "(objectclass=olcGlobal)"
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: (objectclass=olcGlobal)
# requesting: ALL
#

# config
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcDisallows: bind_anon
olcIdleTimeout: 30
olcPidFile: /var/run/openldap/slapd.pid
olcReferral: ldap://openldap.dmz.nausch.org
olcRequires: authc
olcTimeLimit: 15
olcTLSCACertificateFile: /etc/pki/tls/certs/CAcert_chain.pem
olcTLSCACertificatePath: /etc/openldap/certs
olcTLSCertificateFile: /etc/pki/tls/certs/openldap.dmz.nausch.org.pem
olcTLSCertificateKeyFile: /etc/pki/tls/private/openldap_serverkey.pem
olcTLSCipherSuite: HIGH
olcTLSDHParamFile: /etc/pki/tls/private/dh_4096.pem
olcTLSProtocolMin: 3.1
olcLogLevel: stats
olcLogLevel: none

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

erste LDAP-Abfragen

Mit nachfolgendem Befehl, kann eine erste Suchanfrage, gegen den OpenLDAP-Server durchgeführt werden, welche zwar ein leeres Ergebnis zurück liefern sollte. Jedoch kann somit überprüft werden, ob grundsätzlich Abfragen möglich sind.

 # ldapsearch -x -b "dc=nausch,dc=org" "(objectclass=*)"

Als Ergebnis bekommen folgende Antwort:

# extended LDIF
#
# LDAPv3
# base <dc=nausch,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

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

# numResponses: 1

Im Logfile unseres OpenLDAP-Dienstes wird die Anfrage auch entsprechend protokolliert.

 # less /var/log/ldap.log
Jul 15 12:27:22 vml000037 slapd[15157]: conn=1002 fd=11 ACCEPT from IP=[::1]:43714 (IP=[::]:389)
Jul 15 12:27:22 vml000037 slapd[15157]: conn=1002 op=0 BIND dn="" method=128
Jul 15 12:27:22 vml000037 slapd[15157]: conn=1002 op=0 RESULT tag=97 err=0 text=
Jul 15 12:27:22 vml000037 slapd[15157]: conn=1002 op=1 SRCH base="dc=nausch,dc=org" scope=2 deref=0 filter="(objectClass=*)"
Jul 15 12:27:22 vml000037 slapd[15157]: conn=1002 op=1 SEARCH RESULT tag=101 err=32 nentries=0 text=
Jul 15 12:27:22 vml000037 slapd[15157]: conn=1002 op=2 UNBIND
Jul 15 12:27:22 vml000037 slapd[15157]: conn=1002 fd=11 closed

Beim Setzen des root Passworts hatten wird als dn1), der die absolute Position im LDAP-Baum definiert, angegeben, dass dies der dn = dn: olcDatabase={0}config,cn=config sein soll. Wir können nun nach genau dieser Position unseren OpenLDAP-Server befragen.

 #  ldapsearch -W -x -D cn=config -b cn=config "(objectclass=olcGlobal)"
 Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: (objectclass=olcGlobal)
# requesting: ALL
#

# config
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcPidFile: /var/run/openldap/slapd.pid
olcTLSCACertificatePath: /etc/openldap/certs
olcTLSCertificateFile: "OpenLDAP Server"
olcTLSCertificateKeyFile: /etc/openldap/certs/password

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Der Ausschnitt aus dem Logfile zeigt den erfolgreichen Abfrageversuch.

Jul 15 13:26:48 vml000037 slapd[3620]: conn=1002 fd=11 ACCEPT from IP=[::1]:56143 (IP=[::]:389)
Jul 15 13:26:48 vml000037 slapd[3620]: conn=1002 op=0 BIND dn="cn=config" method=128
Jul 15 13:26:48 vml000037 slapd[3620]: conn=1002 op=0 BIND dn="cn=config" mech=SIMPLE ssf=0
Jul 15 13:26:48 vml000037 slapd[3620]: conn=1002 op=0 RESULT tag=97 err=0 text=
Jul 15 13:26:48 vml000037 slapd[3620]: conn=1002 op=1 SRCH base="cn=config" scope=2 deref=0 filter="(objectClass=olcGlobal)"
Jul 15 13:26:48 vml000037 slapd[3620]: conn=1002 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jul 15 13:26:48 vml000037 slapd[3620]: conn=1002 op=2 UNBIND
Jul 15 13:26:48 vml000037 slapd[3620]: conn=1002 fd=11 closed

Natürlich kann man auch den gesamten LDAP-Baum abfragen:

 # ldapsearch -W -x -D cn=config -b cn=config

Auch diese Abfrage, bei der wir auf Grund der Fülle an Informationen auf eine Ausgabe hier im Wiki verzichten, wird im Logfile protokolliert.

 # less /var/log/ldap.log
Jul 15 13:30:42 vml000037 slapd[3620]: conn=1003 fd=11 ACCEPT from IP=[::1]:56215 (IP=[::]:389)
Jul 15 13:30:42 vml000037 slapd[3620]: conn=1003 op=0 BIND dn="cn=config" method=128
Jul 15 13:30:42 vml000037 slapd[3620]: conn=1003 op=0 BIND dn="cn=config" mech=SIMPLE ssf=0
Jul 15 13:30:42 vml000037 slapd[3620]: conn=1003 op=0 RESULT tag=97 err=0 text=
Jul 15 13:30:42 vml000037 slapd[3620]: conn=1003 op=1 SRCH base="cn=config" scope=2 deref=0 filter="(objectClass=*)"
Jul 15 13:30:42 vml000037 slapd[3620]: conn=1003 op=1 SEARCH RESULT tag=101 err=0 nentries=7 text=
Jul 15 13:30:42 vml000037 slapd[3620]: conn=1003 op=2 UNBIND
Jul 15 13:30:42 vml000037 slapd[3620]: conn=1003 fd=11 closed

Bei den err-Codes in der LDAP-Logdatei handelt es sich keineswegs nur um Error-Meldungen. Vielmehr werden hier viele Rückmeldungen in Zahlenwerte codiert, wie z.B. err=0 für O.K..

Eine Auflistung der gängigen Rückmeldecodes ist hier zu finden.

Links

1)
distinguished name