Inhaltsverzeichnis

OpenLDAP Server unter CentOS 6.x installieren und einrichten

OpenLDAP Logo

Zur zentralen Nutzerdatenverwaltung und -pflege 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.

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 6.

 # yum install openldap-servers -y

Neben dem Server-Part openldap-server werden noch zwei Pakete welches zur Laufzeit des Servers benötigt werden 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             Relocations: (not relocatable)
Version     : 2.4.19                            Vendor: CentOS
Release     : 15.el6_0.2                    Build Date: Sat 25 Jun 2011 12:30:55 PM CEST
Install Date: Wed 26 Oct 2011 12:52:08 PM CEST      Build Host: c6b6.bsys.dev.centos.org
Group       : System Environment/Daemons    Source RPM: openldap-2.4.19-15.el6_0.2.src.rpm
Size        : 6402916                          License: OpenLDAP and (Sleepycat and BSD)
Signature   : RSA/8, Wed 06 Jul 2011 03:42:04 AM CEST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
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/schema/collective.schema
/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.schema
/etc/openldap/schema/dyngroup.schema
/etc/openldap/schema/inetorgperson.ldif
/etc/openldap/schema/inetorgperson.schema
/etc/openldap/schema/java.schema
/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.schema
/etc/openldap/schema/ppolicy.schema
/etc/openldap/schema/redhat
/etc/openldap/schema/redhat/autofs.schema
/etc/openldap/slapd.conf
/etc/openldap/slapd.conf.bak
/etc/openldap/slapd.d
/etc/pki/tls/certs/slapd.pem
/etc/rc.d/init.d/slapd
/etc/sysconfig/ldap
/usr/lib64/libslapd_db-4.8.so
/usr/lib64/openldap
/usr/lib64/openldap/accesslog-2.4.so.2
/usr/lib64/openldap/accesslog-2.4.so.2.5.2
/usr/lib64/openldap/accesslog.la
/usr/lib64/openldap/auditlog-2.4.so.2
/usr/lib64/openldap/auditlog-2.4.so.2.5.2
/usr/lib64/openldap/auditlog.la
/usr/lib64/openldap/collect-2.4.so.2
/usr/lib64/openldap/collect-2.4.so.2.5.2
/usr/lib64/openldap/collect.la
/usr/lib64/openldap/constraint-2.4.so.2
/usr/lib64/openldap/constraint-2.4.so.2.5.2
/usr/lib64/openldap/constraint.la
/usr/lib64/openldap/dds-2.4.so.2
/usr/lib64/openldap/dds-2.4.so.2.5.2
/usr/lib64/openldap/dds.la
/usr/lib64/openldap/deref-2.4.so.2
/usr/lib64/openldap/deref-2.4.so.2.5.2
/usr/lib64/openldap/deref.la
/usr/lib64/openldap/dyngroup-2.4.so.2
/usr/lib64/openldap/dyngroup-2.4.so.2.5.2
/usr/lib64/openldap/dyngroup.la
/usr/lib64/openldap/dynlist-2.4.so.2
/usr/lib64/openldap/dynlist-2.4.so.2.5.2
/usr/lib64/openldap/dynlist.la
/usr/lib64/openldap/memberof-2.4.so.2
/usr/lib64/openldap/memberof-2.4.so.2.5.2
/usr/lib64/openldap/memberof.la
/usr/lib64/openldap/pcache-2.4.so.2
/usr/lib64/openldap/pcache-2.4.so.2.5.2
/usr/lib64/openldap/pcache.la
/usr/lib64/openldap/ppolicy-2.4.so.2
/usr/lib64/openldap/ppolicy-2.4.so.2.5.2
/usr/lib64/openldap/ppolicy.la
/usr/lib64/openldap/refint-2.4.so.2
/usr/lib64/openldap/refint-2.4.so.2.5.2
/usr/lib64/openldap/refint.la
/usr/lib64/openldap/retcode-2.4.so.2
/usr/lib64/openldap/retcode-2.4.so.2.5.2
/usr/lib64/openldap/retcode.la
/usr/lib64/openldap/rwm-2.4.so.2
/usr/lib64/openldap/rwm-2.4.so.2.5.2
/usr/lib64/openldap/rwm.la
/usr/lib64/openldap/seqmod-2.4.so.2
/usr/lib64/openldap/seqmod-2.4.so.2.5.2
/usr/lib64/openldap/seqmod.la
/usr/lib64/openldap/smbk5pwd-2.4.so.2
/usr/lib64/openldap/smbk5pwd-2.4.so.2.5.2
/usr/lib64/openldap/smbk5pwd.la
/usr/lib64/openldap/sssvlv-2.4.so.2
/usr/lib64/openldap/sssvlv-2.4.so.2.5.2
/usr/lib64/openldap/sssvlv.la
/usr/lib64/openldap/syncprov-2.4.so.2
/usr/lib64/openldap/syncprov-2.4.so.2.5.2
/usr/lib64/openldap/syncprov.la
/usr/lib64/openldap/translucent-2.4.so.2
/usr/lib64/openldap/translucent-2.4.so.2.5.2
/usr/lib64/openldap/translucent.la
/usr/lib64/openldap/unique-2.4.so.2
/usr/lib64/openldap/unique-2.4.so.2.5.2
/usr/lib64/openldap/unique.la
/usr/lib64/openldap/valsort-2.4.so.2
/usr/lib64/openldap/valsort-2.4.so.2.5.2
/usr/lib64/openldap/valsort.la
/usr/sbin/slapacl
/usr/sbin/slapadd
/usr/sbin/slapauth
/usr/sbin/slapcat
/usr/sbin/slapd
/usr/sbin/slapd_db_archive
/usr/sbin/slapd_db_checkpoint
/usr/sbin/slapd_db_deadlock
/usr/sbin/slapd_db_dump
/usr/sbin/slapd_db_hotbackup
/usr/sbin/slapd_db_load
/usr/sbin/slapd_db_printlog
/usr/sbin/slapd_db_recover
/usr/sbin/slapd_db_sql
/usr/sbin/slapd_db_stat
/usr/sbin/slapd_db_upgrade
/usr/sbin/slapd_db_verify
/usr/sbin/slapdn
/usr/sbin/slapindex
/usr/sbin/slappasswd
/usr/sbin/slapschema
/usr/sbin/slaptest
/usr/share/doc/openldap-servers-2.4.19
/usr/share/doc/openldap-servers-2.4.19/DB_CONFIG.example
/usr/share/doc/openldap-servers-2.4.19/LICENSE.bdb-backend
/usr/share/doc/openldap-servers-2.4.19/README.migration
/usr/share/doc/openldap-servers-2.4.19/README.schema
/usr/share/doc/openldap-servers-2.4.19/README.smbk5pwd
/usr/share/doc/openldap-servers-2.4.19/README.upgrading
/usr/share/doc/openldap-servers-2.4.19/allmail-en.png
/usr/share/doc/openldap-servers-2.4.19/allusersgroup-en.png
/usr/share/doc/openldap-servers-2.4.19/config_dit.png
/usr/share/doc/openldap-servers-2.4.19/config_local.png
/usr/share/doc/openldap-servers-2.4.19/config_ref.png
/usr/share/doc/openldap-servers-2.4.19/config_repl.png
/usr/share/doc/openldap-servers-2.4.19/delta-syncrepl.png
/usr/share/doc/openldap-servers-2.4.19/dual_dc.png
/usr/share/doc/openldap-servers-2.4.19/guide.html
/usr/share/doc/openldap-servers-2.4.19/intro_dctree.png
/usr/share/doc/openldap-servers-2.4.19/intro_tree.png
/usr/share/doc/openldap-servers-2.4.19/ldap-sync-refreshandpersist.png
/usr/share/doc/openldap-servers-2.4.19/ldap-sync-refreshonly.png
/usr/share/doc/openldap-servers-2.4.19/n-way-multi-master.png
/usr/share/doc/openldap-servers-2.4.19/push-based-complete.png
/usr/share/doc/openldap-servers-2.4.19/push-based-standalone.png
/usr/share/doc/openldap-servers-2.4.19/refint.png
/usr/share/doc/openldap-servers-2.4.19/set-following-references.png
/usr/share/doc/openldap-servers-2.4.19/set-memberUid.png
/usr/share/doc/openldap-servers-2.4.19/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-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-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-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
/var/lib/ldap
/var/run/openldap

libtool-ltdl

 # rpm -qil libtool-ltdl
Name        : libtool-ltdl                 Relocations: (not relocatable)
Version     : 2.2.6                             Vendor: CentOS
Release     : 15.5.el6                      Build Date: Tue 24 Aug 2010 09:42:49 PM CEST
Install Date: Wed 26 Oct 2011 12:52:03 PM CEST      Build Host: c6b2.bsys.dev.centos.org
Group       : System Environment/Libraries   Source RPM: libtool-2.2.6-15.5.el6.src.rpm
Size        : 64948                            License: LGPLv2+
Signature   : RSA/8, Sun 03 Jul 2011 06:40:12 AM CEST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
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.2.1
/usr/share/doc/libtool-ltdl-2.2.6
/usr/share/doc/libtool-ltdl-2.2.6/COPYING.LIB
/usr/share/doc/libtool-ltdl-2.2.6/README
/usr/share/libtool

make

 # rpm -qil make
Name        : make                         Relocations: (not relocatable)
Version     : 3.81                              Vendor: CentOS
Release     : 19.el6                        Build Date: Thu 11 Nov 2010 09:47:05 PM CET
Install Date: Wed 26 Oct 2011 12:52:05 PM CEST      Build Host: c6b5.bsys.dev.centos.org
Group       : Development/Tools             Source RPM: make-3.81-19.el6.src.rpm
Size        : 1079569                          License: GPLv2+
Signature   : RSA/8, Sun 03 Jul 2011 06:44:38 AM CEST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.gnu.org/software/make/
Summary     : A GNU tool which simplifies the build process for users
Description :
A GNU tool for controlling the generation of executables and other
non-source files of a program from the program's source files. Make
allows users to build and install packages without any significant
knowledge about the details of the build process. The details about
how the program should be built are provided for make in the program's
makefile.
/usr/bin/gmake
/usr/bin/make
/usr/share/doc/make-3.81
/usr/share/doc/make-3.81/AUTHORS
/usr/share/doc/make-3.81/COPYING
/usr/share/doc/make-3.81/NEWS
/usr/share/doc/make-3.81/README
/usr/share/info/make.info-1.gz
/usr/share/info/make.info-2.gz
/usr/share/info/make.info.gz
/usr/share/locale/be/LC_MESSAGES/make.mo
/usr/share/locale/da/LC_MESSAGES/make.mo
/usr/share/locale/de/LC_MESSAGES/make.mo
/usr/share/locale/es/LC_MESSAGES/make.mo
/usr/share/locale/fi/LC_MESSAGES/make.mo
/usr/share/locale/fr/LC_MESSAGES/make.mo
/usr/share/locale/ga/LC_MESSAGES/make.mo
/usr/share/locale/gl/LC_MESSAGES/make.mo
/usr/share/locale/he/LC_MESSAGES/make.mo
/usr/share/locale/hr/LC_MESSAGES/make.mo
/usr/share/locale/id/LC_MESSAGES/make.mo
/usr/share/locale/ja/LC_MESSAGES/make.mo
/usr/share/locale/ko/LC_MESSAGES/make.mo
/usr/share/locale/nl/LC_MESSAGES/make.mo
/usr/share/locale/pl/LC_MESSAGES/make.mo
/usr/share/locale/pt_BR/LC_MESSAGES/make.mo
/usr/share/locale/ru/LC_MESSAGES/make.mo
/usr/share/locale/rw/LC_MESSAGES/make.mo
/usr/share/locale/sv/LC_MESSAGES/make.mo
/usr/share/locale/tr/LC_MESSAGES/make.mo
/usr/share/locale/uk/LC_MESSAGES/make.mo
/usr/share/locale/vi/LC_MESSAGES/make.mo
/usr/share/locale/zh_CN/LC_MESSAGES/make.mo
/usr/share/man/man1/gmake.1.gz
/usr/share/man/man1/make.1.gz

OpenLDAP - Client

Da wir auf unserem Server später auch auf Hilfsprogramme des openldap-clients zurückgreifen installieren wir auch 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             Relocations: (not relocatable)
Version     : 2.4.19                            Vendor: CentOS
Release     : 15.el6_0.2                    Build Date: Sat 25 Jun 2011 12:30:55 PM CEST
Install Date: Wed 26 Oct 2011 01:23:30 PM CEST      Build Host: c6b6.bsys.dev.centos.org
Group       : Applications/Internet         Source RPM: openldap-2.4.19-15.el6_0.2.src.rpm
Size        : 612692                           License: OpenLDAP
Signature   : RSA/8, Wed 06 Jul 2011 03:42:03 AM CEST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
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

Konfiguration

Bei der von CentOS 6.x mitgelieferten OpenLDAP Version 2.4.xx kann die Konfiguration des Server mit Hilfe von ldif-Dateien erfolgen. 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.

Vorbereitung

Da wir bei der nachfolgenden Konfiguration mit einer frischen eigenen Installation beginnen wollen, werden wir die mitgelieferten Konfigurationsbeispiele erst einmal sichern und unsere Konfigurationspfade entsprechend vorbereiten.

Als erstes sichern wir das originale Konfigurationsverzeichnis, damit wir bei Bedarf wieder darauf zurückgreifen können. Hierzu kopieren wir uns einfach den Inhalt des Verzeichnisses /etc/openldap/slapd.d/ unter einem anderen Namen ab.

 # cp -ar /etc/openldap/slapd.d /etc/openldap/slapd.d.orig

Als nächstes leeren wir das standardmäßig mitgelieferte Konfigurationsverzeichnis /etc/openldap/slapd.d.

 # rm -rf /etc/openldap/slapd.d/*

Im nächsten Schritt erstellen wir uns eine neue Konfigurationsdatei /etc/openldap/slapd.conf indem wir die mitgelieferte Backupdatei kopieren und unter dem richtigen Namen ablegen.

 # cp /etc/openldap/slapd.conf.bak /etc/openldap/slapd.conf

Anschließend passen wir noch die Dateiberechtigungen an:

 # chown root:ldap /etc/openldap/slapd.conf

Aus sichertstechnischen Gründen soll die Datei /etc/openldap/slapd.conf nur der Gruppe ldap zur Verfügung stehen.

 # ls -l /etc/openldap/slapd.conf
-rw-r----- 1 root ldap 4327 Oct 26 13:35 /etc/openldap/slapd.conf

Nachfolgend wollen wir nun auf die unterschiedlichen Konfigurationsverzeichnisse und -dateien im Detail eingehen.

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: 2011-10-26
BASE    dc=nausch, dc=org               # Definition des standardmäßig abgefragten Teilbaums / Searchbase
                                        # Anfragen werden unterhalb von dc=nausch, dc=org ausgeführt.
URI     ldap://ldap.dmz.nausch.org      # Definition des LDAP-Servers 


#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

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 /usr/share/doc/openldap-servers-2.4.19/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

Anschließend 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: pkg/ldap/servers/slapd/DB_CONFIG,v 1.3.2.4 2007/12/18 11:53:27 ghenry Exp $
# 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).

Master-Passwort erstellen

Für den administrativen Zugriff wird ein eigenes Rootpasswort rootpw benötigt. 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

slapd.conf

Die eigentliche Konfiguration unseres OpenLDAP-Daemons erfolgt mit Hilfe der Konfigurationsdatei slapd.conf im Verzeichnis /etc/openldap/, die wir uns im Kapitel Vorbereitung aus den Vorlagen des RPMs kopiert hatten. Die Konfigurationsdatei bearbeiten wir nun mit dem Editor unserer Wahl, z.B. vim.

 # vim /etc/openldap/slapd.conf
/etc/openldap/slapd.conf
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#

# Django : 2011-10-26 unbenutzte Schematas deaktiviert
#include		/etc/openldap/schema/corba.schema	# Django : deaktiviert 2011-10-26
include		/etc/openldap/schema/core.schema
include		/etc/openldap/schema/cosine.schema
#include		/etc/openldap/schema/duaconf.schema	# Django : deaktiviert 2011-10-26
#include		/etc/openldap/schema/dyngroup.schema	# Django : deaktiviert 2011-10-26
include		/etc/openldap/schema/inetorgperson.schema
#include		/etc/openldap/schema/java.schema	# Django : deaktiviert 2011-10-26
#include		/etc/openldap/schema/misc.schema	# Django : deaktiviert 2011-10-26
include		/etc/openldap/schema/nis.schema
#include		/etc/openldap/schema/openldap.schema	# Django : deaktiviert 2011-10-26
#include		/etc/openldap/schema/ppolicy.schema	# Django : deaktiviert 2011-10-26
#include		/etc/openldap/schema/collective.schema	# Django : deaktiviert 2011-10-26

# Allow LDAPv2 client connections.  This is NOT the default.
allow bind_v2

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral	ldap://root.openldap.org
# Django : 2011-10-26  
referral	ldap://ldap.dmz.nausch.org

pidfile		/var/run/openldap/slapd.pid
argsfile	/var/run/openldap/slapd.args

# Django : 2011-10-26 Definition des Loglevels -	Detaillierte Hinweise sind in der manpage zu slapd.conf
# 							unter loglevel zu finden.
# no default entry for: loglevel
loglevel	256

# Django : 2011-10-26 Definition der Idle-Timeout	Detaillierte Hinweise sind in der manpage zu slapd.conf
# 							unter idletimeout zu finden.
# no default entry for: idletimeout
idletimeout	15

# Django : 2011-10-26 Definition des Passwort-Hashes    Detaillierte Hinweise sind in der manpage zu slapd.conf
#                                                       unter password-hash zu finden.
# the default entry for password-hash is {SSHA}
password-hash	{SSHA}

# Load dynamic backend modules:
# Module syncprov.la is now statically linked with slapd and there
# is no need to load it here
# modulepath	/usr/lib/openldap # or /usr/lib64/openldap
# moduleload accesslog.la
# moduleload auditlog.la
## To load this module, you have to install openldap-server-sql first
# moduleload back_sql.la
## Following two modules can't be loaded simultaneously
# moduleload dyngroup.la
# moduleload dynlist.la
# moduleload lastmod.la
# moduleload pcache.la
# moduleload ppolicy.la
# moduleload refint.la
# moduleload retcode.la
# moduleload rwm.la
# moduleload translucent.la
# moduleload unique.la
# moduleload valsort.la

# Django : 2011-10-25 					Detaillierte Hinweise sind in der manpage zu slapd.conf
#                                                       unter modulepath zu finden.
# The default is /usr/lib64/openldap
modulepath	/usr/lib64/openldap

# The next three lines allow use of TLS for encrypting connections using a
# dummy test certificate which you can generate by changing to
# /etc/pki/tls/certs, running "make slapd.pem", and fixing permissions on
# slapd.pem so that the ldap user or group can read it.  Your client software
# may balk at self-signed certificates, however.
# TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
# TLSCertificateFile /etc/pki/tls/certs/slapd.pem
# TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem

# Sample security restrictions
#	Require integrity protection (prevent hijacking)
#	Require 112-bit (3DES or better) encryption for updates
#	Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64

# Sample 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
#	Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access 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!

# Django : 2011-10-26
# no default entry for: Access Control Lists (ACLs)
access to attrs=userPassword
	by self write
	by dn="cn=Manager,dc=nausch,dc=org" write
	by anonymous auth
	by * none
access to *
	by self write
	by dn="cn=Manager,dc=nausch,dc=org" write
	by * read

#######################################################################
# ldbm and/or bdb database definitions
#######################################################################

# Django : 2011-10-26
# Make cn=config accessable
database	config
rootdn		"cn=config"
rootpw		{SSHA}MT/P3fPtBfI3E2bylGEFxv2/u1KxmVmO

database	bdb
# Django : 2011-10-26
# default : suffix          "dc=my-domain,dc=com"
suffix		"dc=nausch,dc=org"
checkpoint	1024 15
# Django : 2011-10-26
# # default : rootdn          "cn=Manager,dc=my-domain,dc=com"
rootdn		"cn=Manager,dc=nausch,dc=org"
# Cleartext passwords, especially for the rootdn, should
# be avoided.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
# rootpw		secret
# rootpw		{crypt}ijFYNcSNctBYg
# Django : 2011-10-26
rootpw          {SSHA}MT/P3fPtBfI3E2bylGEFxv2/u1KxmVmO

# The database directory MUST exist prior to running slapd AND 
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory	/var/lib/ldap

# Django : 2011-10-26
# no default entry for: mode
mode		0600 

# Django : 2011-10-26
# no default entry for: lastmod
lastmod		on

# Indices to maintain for this database
index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub

# Replicas of this database
#replogfile /var/lib/ldap/openldap-master-replog
#replica host=ldap-1.example.com:389 starttls=critical
#     bindmethod=sasl saslmech=GSSAPI
#     authcId=host/ldap-master.example.com@EXAMPLE.COM


# enable monitoring
database monitor

# allow onlu rootdn to read the monitor
# Django : 2011-10-26
# default : by dn.exact="cn=Manager,dc=my-domain,dc=com" read
access to *
        by dn.exact="cn=Manager,dc=nausch,dc=org" read
        by * none

Die Parameter sind in der Manpage der Konfigurationsdatei slapd.conf ausreichend beschrieben.

 # man slapd.conf

Auf die wichtigsten wollen wir noch kurz eingehen.

ldif Konfiguration

Im nächsten Schritt werden wir nun unsere zuvor angelegt Konfigurationsdatei /etc/openldap/slapd.conf in das, im Abschnitt Konfiguration beschriebene Verzeichnis /etc/openldap/slapd.d, als ldif-Dateien ablegen lassen. Hierzu benutzen wir das Programm slaptest. Mit folgendem Aufruf generieren wir die ldif-Verzeichnisstrukturen sowie die zugehörigen ldif-Dateien.

 # slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
 bdb_db_open: database "dc=nausch,dc=org": db_open(/var/lib/ldap/id2entry.bdb) failed: No such file or directory (2).
 backend_startup_one (type=bdb, suffix="dc=nausch,dc=org"): bi_db_open failed! (2)
 slap_startup failed (test would succeed using the -u switch)

Die gezeigten Fehlermeldungen sind leicht erklärbar. Es befinden sich aktuell noch keine Daten in der Berkely-Datenbank. Die Fehlermeldung kann also ignoriert werden und darf uns nicht weiter verunsichern

Annschließend passen wir noch die Verzeichnis- und Dateirechte der gerade erzeigten Daten an:

 # chown -R ldap:ldap /etc/openldap/slapd.d 

Durch das Konvertierend der slapd.conf Konfigurationsdatei mit Hilfe des Befehles

# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d

wurde nicht nur das „neue“ Konfigurationsverzeichnis /etc/openldap/slapd.d mit Inhalten gefüllt, sondern auch in diesem Fall eine Berkely-Datenbankstruktur im Verzeichnis /var/lib/ldap angelegt. Diese Berkley-Datenbankstruktur wurde jedoch nicht vom slapd-Daemon erstellt, und ist somit wieder zu entfernen, da es sonst zu unerwünschten Fehlern beim Starten und beim Betrieb des OpenLDAP-Server kömmen würde. Wir löschen alos dies Dateien mit folgendem Befehl.

 # rm -f /var/lib/ldap/alock /var/lib/ldap/__db*

Da wir zukünftig die weitere Konfiguration unseres OpenLDAP-Servers ausschließlich mit Hilfe der ldif-Dateien vornehmen wollen, werden wir nun unsere Konfigurationsdatei, die wir zum initialen Befüllen der ldif-Verzeichnisse angelegt hatten, wieder stilllegen. Hierzu reicht es die vorhandenen alte Konfigurationsdatei einfach umzubenennen.

 # mv /etc/openldap/slapd.conf /etc/openldap/slapd.conf.save_111026

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 die Konfigurationsdatei /etc/rsyslog.conf entsprechend an und tragen eine entsprechende Regel unter der Sektion #### RULES #### ein.

 # vim /etc/rsyslog.conf
#### RULES ####

...

# Django : 2011-10-26 Logging für OpenLDAP-Server aktiviert
local4.*                                                -/var/log/ldap.log  

...

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

 # service rsyslog restart
 Shutting down system logger:                               [  OK  ]
 Starting system logger:                                    [  OK  ]

logrotate

Bei einem unter Last stehendem OpenLDAP-Datenbankserver 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
/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
}

Systemstart

erster manueller Start

Bevor wir nun unseren OpenLDAP-Server das erste mal starten, überprüfen wir noch mit einem configcheck ob der ldap-Daemon mit unserem gerade erzeugten Konfigurationsparametern umgehen kann, oder ob es noch nicht entdeckte Fehler in der Konfiguration gibt.

 # service slapd configtest

Erfolgt keine Rückmeldung, so bedeutet dies, alles ist in bester Ordnung!

Nun können wir unseren LDAP-Server das erste mal anstarten:

 # service slapd start
 Starting slapd:                                            [  OK  ]

Der erfolgreiche Start unseres slapd-Daemon wird uns, Dank der Änderungen am Rsyslog, auch im Logfile /var/log/ldap.log auch entsprechend vermerkt.

 Oct 26 23:49:54 vml000030 slapd[2023]: @(#) $OpenLDAP: slapd 2.4.19 (Jun 25 2011 11:27:10) $#012#011mockbuild@c6b6.bsys.dev.centos.org:/builddir/build/BUILD/openldap-2.4.19/openldap-2.4.19/build-servers/servers/slapd
 Oct 26 23:49:54 vml000030 slapd[2024]: slapd starting

Ob der Daemon läuft überprüfen wir am einfachsten mit folgender Abfrage:

 # netstat -tulpen | grep slapd
 tcp        0      0 0.0.0.0:389                 0.0.0.0:*                   LISTEN      0          9990       1870/slapd

automatisches Starten des Dienstes beim Systemstart

Damit nun unser OpenLDAP-Datenbankserver beim Booten automatisch gestartet wird, nehmen wir noch folgende Konfigurationsschritte vor.

 # chkconfig slapd on

Anschließend überprüfen wir noch unsere Änderung:

 # chkconfig --list | grep slapd
 slapd         	0:off	1:off	2:on	3:on	4:on	5:on	6:off

erste LDAP-Abfragen

Mit nachfolgendem Befehl, kann eine erste Suchanfrage, gegen den OpenLDAP-Server durchgeführt werden, welche zwar ein leeres Ergbnis 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 des slapd-Daemon wird unsere Anfrage entsprechend protokolliert.

Oct 27 00:02:28 vml000030 slapd[2024]: conn=4 fd=12 ACCEPT from IP=[::1]:54910 (IP=[::]:389)
Oct 27 00:02:28 vml000030 slapd[2024]: conn=4 op=0 BIND dn="" method=128
Oct 27 00:02:28 vml000030 slapd[2024]: conn=4 op=0 RESULT tag=97 err=0 text=
Oct 27 00:02:28 vml000030 slapd[2024]: conn=4 op=1 SRCH base="dc=nausch,dc=org" scope=2 deref=0 filter="(objectClass=*)"
Oct 27 00:02:28 vml000030 slapd[2024]: conn=4 op=1 SEARCH RESULT tag=101 err=32 nentries=0 text=
Oct 27 00:02:28 vml000030 slapd[2024]: conn=4 op=2 UNBIND
Oct 27 00:02:28 vml000030 slapd[2024]: conn=4 fd=12 closed

Für den Zugriff auf den cn=config hatten wir bei der erstmaligen Konfiguration folgendes angegeben.

# Django : 2011-10-26
# Make cn=config accessable
database	config
rootdn		"cn=config"
rootpw		{SSHA}MT/P3fPtBfI3E2bylGEFxv2/u1KxmVmO

Mit Hilfe dieser Definition können wir nun ebenfalls die im *.LDIF-Format hinterlegten OpenLDAP-Server-Konfigurationen mit nachfolgendem Befehl abgefragt werden. Im folgenden Beispiel erfolgt die Abfrage des Konfigurationsabschnitt cn=config „objectclass=olcGlobal“.

 # 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
olcConfigFile: /etc/openldap/slapd.conf
olcConfigDir: /etc/openldap/slapd.d
olcAllows: bind_v2
olcArgsFile: /var/run/openldap/slapd.args
olcAttributeOptions: lang-
olcAuthzPolicy: none
olcConcurrency: 0
olcConnMaxPending: 100
olcConnMaxPendingAuth: 1000
olcGentleHUP: FALSE
olcIdleTimeout: 15
olcIndexSubstrIfMaxLen: 4
olcIndexSubstrIfMinLen: 2
olcIndexSubstrAnyLen: 4
olcIndexSubstrAnyStep: 2
olcIndexIntLen: 4
olcLocalSSF: 71
olcLogLevel: Stats
olcPidFile: /var/run/openldap/slapd.pid
olcReadOnly: FALSE
olcReferral: ldap://ldap.dmz.nausch.org
olcReverseLookup: FALSE
olcSaslSecProps: noplain,noanonymous
olcSockbufMaxIncoming: 262143
olcSockbufMaxIncomingAuth: 16777215
olcThreads: 16
olcTLSCRLCheck: none
olcTLSVerifyClient: never
olcToolThreads: 1
olcWriteTimeout: 0

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Auch hier wird die Abfrage im Logfile des OpenLDAP-Servers protokolliert.

Oct 27 00:04:46 vml000030 slapd[2024]: conn=5 fd=12 ACCEPT from IP=[::1]:54911 (IP=[::]:389)
Oct 27 00:04:46 vml000030 slapd[2024]: conn=5 op=0 BIND dn="cn=config" method=128
Oct 27 00:04:46 vml000030 slapd[2024]: conn=5 op=0 BIND dn="cn=config" mech=SIMPLE ssf=0
Oct 27 00:04:46 vml000030 slapd[2024]: conn=5 op=0 RESULT tag=97 err=0 text=
Oct 27 00:04:46 vml000030 slapd[2024]: conn=5 op=1 SRCH base="cn=config" scope=2 deref=0 filter="(objectClass=olcGlobal)"
Oct 27 00:04:46 vml000030 slapd[2024]: conn=5 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
Oct 27 00:04:46 vml000030 slapd[2024]: conn=5 op=2 UNBIND
Oct 27 00:04:46 vml000030 slapd[2024]: conn=5 fd=12 closed

Nachfolgend wird der Konfigurationsabschnitt olcDatabase={0}config.ldif abgefragt:

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

# {0}config, config
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to *  by * none
olcAddContentAcl: TRUE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=config
olcRootPW: {SSHA}MT/P3fPtBfI3E2bylGEFxv2/u1KxmVmO
olcMonitoring: FALSE

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Der Ausschnitt aus dem Logfile zeigt den erfolgreichen Abfrageversuch.

Oct 26 23:54:58 vml000030 slapd[2024]: conn=1 fd=12 ACCEPT from IP=[::1]:42483 (IP=[::]:389)
Oct 26 23:54:58 vml000030 slapd[2024]: conn=1 op=0 BIND dn="cn=config" method=128
Oct 26 23:54:58 vml000030 slapd[2024]: conn=1 op=0 BIND dn="cn=config" mech=SIMPLE ssf=0
Oct 26 23:54:58 vml000030 slapd[2024]: conn=1 op=0 RESULT tag=97 err=0 text=
Oct 26 23:54:58 vml000030 slapd[2024]: conn=1 op=1 SRCH base="olcDatabase={0}config,cn=config" scope=2 deref=0 filter="(objectClass=*)"
Oct 26 23:54:58 vml000030 slapd[2024]: conn=1 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
Oct 26 23:54:58 vml000030 slapd[2024]: conn=1 op=2 UNBIND
Oct 26 23:54:58 vml000030 slapd[2024]: conn=1 fd=12 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.

Oct 27 00:07:22 vml000030 slapd[2024]: conn=6 fd=13 ACCEPT from IP=[::1]:37073 (IP=[::]:389)
Oct 27 00:07:22 vml000030 slapd[2024]: conn=6 op=0 BIND dn="cn=config" method=128
Oct 27 00:07:22 vml000030 slapd[2024]: conn=6 op=0 BIND dn="cn=config" mech=SIMPLE ssf=0
Oct 27 00:07:22 vml000030 slapd[2024]: conn=6 op=0 RESULT tag=97 err=0 text=
Oct 27 00:07:22 vml000030 slapd[2024]: conn=6 op=1 SRCH base="cn=config" scope=2 deref=0 filter="(objectClass=*)"
Oct 27 00:07:22 vml000030 slapd[2024]: conn=6 op=1 SEARCH RESULT tag=101 err=0 nentries=10 text=
Oct 27 00:07:22 vml000030 slapd[2024]: conn=6 op=2 UNBIND
Oct 27 00:07:22 vml000030 slapd[2024]: conn=6 fd=13 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)
Access Control Lists