OpenLDAP Server unter CentOS 6.x installieren und einrichten
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:
- BASE : Definition des standardmässig abgefragten Teilbaums / Searchbase unter der Anfragen von dc=nausch, dc=org ausgeführt werden sollen.
- URI : Definition des LDAP-Servers, der befragt werden soll.
# 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.
- idletimeout Der Wert für den Eintrag idletimeout setzte eine Ablaufzeit für offene Abfragen, welche noch nicht beendet wurden. Das Setzen dieses Wertes wird dringendst angeraten, da es sonst bei sehr vielen Abfragen zu einem „Stillstand“ des LDAP-Servers kommen könnte.
- password-hash Dieser Wert setzt den Standard-Agorithmus SSHA für den Eintrag des Passwort-Hashes.
- ACLs1) Die erste der beide ACLs definiert den Zugriff auf das Attribut userPassword nur für den Eigentümer einer Instanz des Objekts Manager mit Schreibrechten erlaubt sind. Weiterhin sind anonyme Anfragen zur Authentifizierung das Attribut userPassword vergleichen. Alle anderen Anfragen auf das Attribut userPassword werden nicht gestattet.
access to attrs=userPassword by self write by dn="cn=Manager,dc=nausch,dc=org" write by anonymous auth by * none
Mit Hilfe der zweiten ACL wird festgelegt, daß der Zugriff auf alle Objekte - außer dem userPassword - vom Besitzer mit Schreibrechten durchgeführt werden dürfen. Alle anderen Anfragen sind mit Leserechten gestattet.
access to * by self write by dn="cn=Manager,dc=nausch,dc=org" write by * read
- rootpw Hier ist das LDAP-RootPasswort für den administrativen Zugang, welches wir uns eingangs im Abschnitt Master-Passwort erstellen erstellt hatten, anzugeben.
- mode Der Eintrag mode mit der entsprechenden Angabe 0600 legt fest, dass Dateien mit nur für den Eigentümer der Datei mit den Rechten rw angelegt werden.
- lastmode Durch das Setzen des Wertes on wird festgelegt, daß Einträge mit einem Datum zu versehen sind.
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.