OpenLDAP Server unter CentOS 7.x installieren und einrichten
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:
- 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: 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
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.