Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:ldap_archlinux

Inhaltsverzeichnis

LDAP ArchLinux

LDAP ist ein Netzwerkprotokoll und dient zur Bereitstellung von Verzeichnisdiensten. Es vermittelt die Kommunikation zwischen dem LDAP-Client und dem Directory Server, bzw. einem Backend-System, welches Verzeichnisinformationen bereitstellt.

Die hier beschriebene Variante von LDAP ist OpenLDAP, welche eine freie Implementierung des Lightweight Directory Access Protocols ist.

Ab hier werden zur Ausführung nachfolgender Befehle root-Rechte benötigt. Um der Benutzer root zu werden, melden Sie sich bitte als root-Benutzer am System an, oder wechseln mit nachfolgendem Befehl zum Benutzer root:

$ su -
Password:

Vorbereitung

Die Einbindung des AUR-Repositories, kann wie in nachfolgenden internen Link beschrieben

durchgeführt werden.

Installation

Zur Installation eines OpenLDAP-Servers wird nachfolgendes Paket benötigt:

  • openldap - ist im core-Repository von ArchLinux enthalten.

Mit nachfolgendem Befehl, wird das Pakete openldap installiert:

# pacman -S --noconfirm openldap

Installationsverlauf

Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paket openldap installiert wurden.

# pacman -Qil openldap

Installierte Dateien

Dienst/Daemon-Start einrichten

Um einen OpenLDAP-Server, welcher als Dienst/Daemon als Hintergrundprozess läuft, auch nach einem Neustart des Servers zur Verfügung zu haben, soll der Dienst/Daemon mit dem Server mit gestartet werden, was mit nachfolgendem Befehl realisiert werden kann:

# systemctl enable slapd.service
Created symlink /etc/systemd/system/multi-user.target.wants/slapd.service → /usr/lib/systemd/system/slapd.service.

Eine Überprüfung, ob beim Neustart des Server der slapd-Dienst/Daemon wirklich mit gestartet wird, kann mit nachfolgendem Befehl erfolgen und sollte eine Anzeige, wie ebenfalls nachfolgend dargestellt ausgeben:

# systemctl list-unit-files --type=service | grep -e slapd.service
slapd.service                              enabled         disabled

bzw.

# systemctl is-enabled slapd.service
enabled

iptables/ip6tables Regeln

Damit der OpenLDAP-Server auch erreichbar ist und nicht die Ergebnisse der Verzeichnisdienst-Abfragen vom Paketfilter iptables blockiert werden, muss nachfolgende Regel zum iptables-Regelwerk hinzugefügt werden.

Um die aktuellen iptables-Regeln erweitern zu können, sollten diese erst einmal aufgelistet werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# iptables -L -nv --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     1169 2101K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
4        1    60 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
5        0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 5 prefix "REC-INP Defend "
6        0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with tcp-reset
7        0     0 REJECT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
8        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-proto-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 917 packets, 84944 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Nachfolgende Befehle, fügen folgende iptables-Regeln dem iptables-Regelwerk nach der Position 4 hinzu, ohne das der Paketfilter angehalten werden muss:

  • -A INPUT -p tcp --dport 636 -j ACCEPT
  • -A INPUT -p tcp --dport 389 -j ACCEPT

und hier die Befehle:

# iptables -I INPUT 5 -p tcp --dport 636 -j ACCEPT
# iptables -I INPUT 5 -p tcp --dport 389 -j ACCEPT

Ein erneute Abfrage des iptables-Regelwerts, sollte dann nachfolgend dargestellte Ausgabe ergeben, was mit folgendem Befehl durchgeführt werden kann:

# iptables -L -nv --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     1202 2103K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
4        1    60 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
5        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:389
6        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:636
7        0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 5 prefix "REC-INP Defend "
8        0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with tcp-reset
9        0     0 REJECT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
10       0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-proto-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 7 packets, 936 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Die neuen Zeilen sind an Position 5 (INPUT) und Position 6 (INPUT) zu sehen, hier nachfolgend zur Verdeutlichung noch einmal dargestellt (nur relevanter Ausschnitt):

...
5        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:389
6        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:636
...

Um diese iptables-Regel dauerhaft, auch nach einem Neustart des Server, weiterhin im iptables-Regelwerk zu speichern, muss nachfolgend dargestellter Befehl abschließend noch ausgeführt werden:

# /usr/sbin/iptables-save > /etc/iptables/iptables.rules

Nachfolgender Befehl kann dazu verwendet werden, um zu überprüfen, ob das iptables-Regelwerk auch korrekt gespeichert wurde:

# cat /etc/iptables/iptables.rules
# Generated by iptables-save v1.8.7 on Wed Mar 23 06:14:11 2022
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [13:3332]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 389 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 636 -j ACCEPT
-A INPUT -j LOG --log-prefix "REC-INP Defend " --log-level 5
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
COMMIT
# Completed on Wed Mar 23 06:14:11 2022
# Generated by iptables-save v1.8.7 on Wed Mar 23 06:14:11 2022
*nat
:PREROUTING ACCEPT [5:352]
:INPUT ACCEPT [1:60]
:OUTPUT ACCEPT [8:577]
:POSTROUTING ACCEPT [8:577]
COMMIT
# Completed on Wed Mar 23 06:14:11 2022
# Generated by iptables-save v1.8.7 on Wed Mar 23 06:14:11 2022
*mangle
:PREROUTING ACCEPT [1216:2104461]
:INPUT ACCEPT [1212:2104169]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [944:91396]
:POSTROUTING ACCEPT [944:91396]
COMMIT
# Completed on Wed Mar 23 06:14:11 2022

Um die aktuellen ip6tables-Regeln erweitern zu können, sollten diese erst einmal aufgelistet werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# ip6tables -nvL --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all      *      *       ::/0                 ::/0                 ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp     *      *       ::/0                 ::/0                
3        0     0 ACCEPT     all      lo     *       ::/0                 ::/0                
4        0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:22
5        0     0 LOG        all      *      *       ::/0                 ::/0                 LOG flags 0 level 5 prefix "REC-INP Defend "
6        0     0 REJECT     tcp      *      *       ::/0                 ::/0                 reject-with tcp-reset
7        0     0 REJECT     udp      *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable
8        0     0 REJECT     all      *      *       ::/0                 ::/0                 reject-with icmp6-addr-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 LOG        all      *      *       ::/0                 ::/0                 LOG flags 0 level 5 prefix "REC-FWD Defend "
2        0     0 REJECT     tcp      *      *       ::/0                 ::/0                 reject-with tcp-reset
3        0     0 REJECT     udp      *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable
4        0     0 REJECT     all      *      *       ::/0                 ::/0                 reject-with icmp6-addr-unreachable

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Nachfolgende Befehle, fügen folgende ip6tables-Regeln dem ip6tables-Regelwerk nach der Position 4 hinzu, ohne das der Paketfilter angehalten werden muss:

  • -A INPUT -p tcp --dport 389 -j ACCEPT
  • -A INPUT -p tcp --dport 636 -j ACCEPT

und hier die Befehle:

# ip6tables -I INPUT 5 -p tcp --dport 389 -j ACCEPT
# ip6tables -I INPUT 6 -p tcp --dport 636 -j ACCEPT

Ein erneute Abfrage des ip6tables-Regelwerts, sollte dann nachfolgend dargestellte Ausgabe ergeben, was mit folgendem Befehl durchgeführt werden kann:

# ip6tables -nvL --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all      *      *       ::/0                 ::/0                 ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp     *      *       ::/0                 ::/0                
3        0     0 ACCEPT     all      lo     *       ::/0                 ::/0                
4        0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:22
5        0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:389
6        0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:636
7        0     0 LOG        all      *      *       ::/0                 ::/0                 LOG flags 0 level 5 prefix "REC-INP Defend "
8        0     0 REJECT     tcp      *      *       ::/0                 ::/0                 reject-with tcp-reset
9        0     0 REJECT     udp      *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable
10       0     0 REJECT     all      *      *       ::/0                 ::/0                 reject-with icmp6-addr-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 LOG        all      *      *       ::/0                 ::/0                 LOG flags 0 level 5 prefix "REC-FWD Defend "
2        0     0 REJECT     tcp      *      *       ::/0                 ::/0                 reject-with tcp-reset
3        0     0 REJECT     udp      *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable
4        0     0 REJECT     all      *      *       ::/0                 ::/0                 reject-with icmp6-addr-unreachable

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Die neuen Zeilen sind an Position 5 (INPUT) und Postition 6 (INTPUT) zu sehen, hier nachfolgend zur Verdeutlichung noch einmal dargestellt (nur relevanter Ausschnitt):

...
5        0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:389 
6        0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:636
...

Um diese ip6tables-Regel dauerhaft, auch nach einem Neustart des Server, weiterhin im ip6tables-Regelwerk zu speichern, muss nachfolgend dargestellter Befehl abschließend noch ausgeführt werden:

# /usr/sbin/ip6tables-save > /etc/iptables/ip6tables.rules 

Nachfolgender Befehl kann dazu verwendet werden, um zu überprüfen, ob das ip6tables-Regelwerk auch korrekt gespeichert wurde:

# cat /etc/iptables/ip6tables.rules
# Generated by ip6tables-save v1.8.7 on Wed Mar 23 06:18:21 2022
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Wed Mar 23 06:18:21 2022
# Generated by ip6tables-save v1.8.7 on Wed Mar 23 06:18:21 2022
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 389 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 636 -j ACCEPT
-A INPUT -j LOG --log-prefix "REC-INP Defend " --log-level 5
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -p udp -j REJECT --reject-with icmp6-port-unreachable
-A INPUT -j REJECT --reject-with icmp6-addr-unreachable
-A FORWARD -j LOG --log-prefix "REC-FWD Defend " --log-level 5
-A FORWARD -p tcp -j REJECT --reject-with tcp-reset
-A FORWARD -p udp -j REJECT --reject-with icmp6-port-unreachable
-A FORWARD -j REJECT --reject-with icmp6-addr-unreachable
COMMIT
# Completed on Wed Mar 23 06:18:21 2022
# Generated by ip6tables-save v1.8.7 on Wed Mar 23 06:18:21 2022
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Wed Mar 23 06:18:21 2022

/etc/hosts

Falls keine DNS-Auflösung des Namens, welcher in der Konfigurationsdatei

  • /etc/openldap/ldap.conf

unter

...
URI	ldap://ldap.idmz.tachtler.net
...

möglich ist, muss in der Konfigurationsdatei

  • /etc/hosts

nachfolgende Ergänzung hinzugefügt werden:

127.0.0.1     localhost.localdomain   localhost
::1           localhost.localdomain   localhost
192.168.0.30  ldap.idmz.tachtler.net

:!: HINWEIS - Die Ergänzung ist in der 3 Zeile in oben gezeigter Konfigurationsdatei!

Somit kann gewährleistet werden, dass die Verwendung des DNS-Namens möglich ist.

Basis-Konfiguration

Vorbereitung - slapd.conf

Bevor mit Änderungen an den Konfigurationsdateien

  • /etc/openldap/ldap.conf - Client-Konfigurationsdatei
  • /etc/openldap/slapd.conf - Server-Konfigurationsdatei

begonnen werden soll, kann mit nachfolgenden Befehlen eine Sicherung der Konfigurationsdateien angefertigt werden:

# cp -a /etc/openldap/ldap.conf /etc/openldap/ldap.conf.save
# cp -a /etc/openldap/slapd.conf /etc/openldap/slapd.conf.save

/var/lib/openldap/openldap-data

Nachfolgendes Verzeichnis, welches nach der Installation grundsätzlich nicht existiert, muss mit nachfolgenden Befehlen neu erstellt werden und mit den entsprechenden Besitz- und Datei-rechten versehen werden, wie nachfolgend dargestellt:

Neuanlage des Verzeichnisses: /var/lib/openldap/openldap-data

# mkdir /var/lib/openldap/openldap-data

Setzen der entsprechenden Besitzrechte:

# chown ldap:ldap /var/lib/openldap/openldap-data

Setzen der entsprechenden Dateirechte:

# chmod 700 /var/lib/openldap/openldap-data

/etc/openldap/ldap.conf

Die Client-Konfigurationsdatei /etc/openldap/ldap.conf dient zur Konfiguration von System weiten Client-Einstellungen. Hier wird auch die z.B. Basis-Domain für den LDAP-Client festgelegt. Dies ist die Standard-Konfigurationsdatei:

#
# 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-provider.example.com:666
 
#SIZELIMIT	12
#TIMELIMIT	15
#DEREF		never

Folgende Anpassungen der Konfigurationsdatei /etc/openldap/ldap.conf genügen, um grundsätzlich die grundlegenden Einstellungen für die LDAP-Clients bereitzustellen:

#
# LDAP Defaults
#
 
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
 
# Tachtler
# default: #BASE	dc=example,dc=com
BASE	dc=tachtler,dc=net
# Tachtler
# default: #URI	ldap://ldap.example.com ldap://ldap-provider.example.com:666
URI	ldap://ldap.idmz.tachtler.net
 
#SIZELIMIT	12
#TIMELIMIT	15
#DEREF		never

Erklärungen:

  • BASE	dc=tachtler,dc=net

Mit der Variable BASE wird der standardmässig abgefragte Teilbaum festgelegt. Das bedeutet, dass alle Anfragen unterhalb von z.B. hier nachfolgen: dc=tachtler, dc=net durchzuführen sind. Dies wird häufig auch Searchbase (Suchbasis) genannt.

  • URI	ldap://ldap.idmz.tachtler.net

Die Variable URI gibt den Server an und wie dieser standardmässig zu erreichen ist.

/etc/openldap/sldap.conf

Die Konfigurationsdatei /etc/openldap/sldap.conf als „statischen“ Konfigurationsdatei kann von allen OpenLDAP-Versionen verwendet werden. Bis zu der Version 2.3 ist dies die einzige Option, ab der OpenLDAP-Version 2.3 bietet OpenLDAP zusätzlich die Option die Konfiguration zur Laufzeit zu verwalten und nicht mehr in einer „statischen“ Konfigurationsdatei.

Die Konfigurationsdatei /etc/openldap/sldap.conf ist grundsätzlich in drei Sektionen unterteilt:

  1. Globale Direktiven
  2. Backend Direktiven
  3. Database-spezifische Direktiven

wobei Backend- und zugehörige Database-spezifische Direktiven mehrfach konfiguriert werden können.

Die Server-Konfigurationsdatei /etc/openldap/sldap.conf dient zur Konfiguration des Server. Dies ist die Standard-Konfigurationsdatei:

#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include		/etc/openldap/schema/core.schema
 
# Define global ACLs to disable default read access.
 
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral	ldap://root.openldap.org
 
pidfile		/run/openldap/slapd.pid
argsfile	/run/openldap/slapd.args
 
# Load dynamic backend modules:
modulepath	/usr/lib/openldap
moduleload	back_mdb.la
# moduleload	back_ldap.la
 
# 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!
 
#######################################################################
# config database definitions
#######################################################################
database config
# Uncomment the rootpw line to allow binding as the cn=config
# rootdn so that temporary modifications to the configuration can be made
# while slapd is running. They will not persist across a restart.
# rootpw secret
 
#######################################################################
# MDB database definitions
#######################################################################
 
database	mdb
maxsize		1073741824
suffix		"dc=my-domain,dc=com"
rootdn		"cn=Manager,dc=my-domain,dc=com"
# Cleartext passwords, especially for the rootdn, should
# be avoid.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw		secret
# 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/openldap/openldap-data
# Indices to maintain
index	objectClass	eq
 
#######################################################################
# monitor database definitions
#######################################################################
database monitor

Folgende Anpassungen der Konfigurationsdatei /etc/openldap/sldap.conf genügen, um grundsätzlich die grundlegenden Einstellungen für den Betrieb eines LDAP-Server bereitzustellen:

#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include		/etc/openldap/schema/core.schema
 
# Define global ACLs to disable default read access.
 
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral	ldap://root.openldap.org
 
pidfile		/run/openldap/slapd.pid
argsfile	/run/openldap/slapd.args
 
# Load dynamic backend modules:
modulepath	/usr/lib/openldap
moduleload	back_mdb.la
# moduleload	back_ldap.la
 
# 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!
 
#######################################################################
# config database definitions
#######################################################################
database config
# Uncomment the rootpw line to allow binding as the cn=config
# rootdn so that temporary modifications to the configuration can be made
# while slapd is running. They will not persist across a restart.
# rootpw secret
 
#######################################################################
# MDB database definitions
#######################################################################
 
database	mdb
maxsize		1073741824
# Tachtler
# default: suffix		"dc=my-domain,dc=com"
suffix		"dc=tachtler,dc=net"
# Tachtler
# default: rootdn		"cn=Manager,dc=my-domain,dc=com"
rootdn		"cn=Manager,dc=tachtler,dc=net"
# Cleartext passwords, especially for the rootdn, should
# be avoid.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
# Tachtler
# default: rootpw		secret
rootpw		{SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms
# 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/openldap/openldap-data
# Indices to maintain
index	objectClass	eq
 
#######################################################################
# monitor database definitions
#######################################################################
database monitor

Erklärungen:

  • suffix		"dc=tachtler,dc=net"

Der Parameter suffix (Database) dient der Definition der BaseDN. Die BaseDN (DN = Distinguished Name) beschreibt die Top Level Domain (TLD) oder auch Basis, den „höchsten“ sichtbaren Punkt des DIT (Directory Information Tree), von dem aus auf alle anderen Bereiche verzweigt wird. Die Direktive ist immer mit der jeweiligen Datenbank verknüpft. Das Suffix besteht mindestens aus einer oder mehr Komponenten. Beispiel: o=domain,c=de, wobei o für organization und c für country steht.

:!: HINWEIS - Nachfolgend soll jedoch dc (dc = domain component) und die TLD (Top Level Domain) bzw. BaseDN zur Anwendung kommen.

  • rootdn		"cn=Manager,dc=tachtler,dc=net"

Der Parameter rootdn (Database) legt den DN des LDAP-Administrators „statisch“ in der LDAP-Serverkonfiguration fest. Hierbei wird kein bestehender System-Account verwendet (was aufgrund der geforderten DN-Syntax ohnehin nicht möglich wäre), sondern ein in der /etc/openldap/sldap.conf-Konfiguration statisch fest gelegtes Konto, welches stets den vollen Zugriff auf den DIT hat. Der rootdn darf somit standardmäßig, jederzeit alle administrativen Tätigkeiten am OpenLDAP-Server durchführen. Das komplette rootdn-Statement muss sich immer auf den tatsächlich verwendeten suffix (hier: dc=tachtler,dc=net) beziehen!

  • rootpw		{SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms

Der Parameter rootpw (Database) dient, der Definition des Passworts für den zuvor beschriebenen rootdn. Zur Generierung des Passworts stehen mehrere kryptographische Methoden zur Verfügung. Auch ein Klartext-Passwort wäre möglich, ist allerdings sicherheitstechnisch nicht zu empfehlen. Nachfolgend soll mit Hilfe des Programms /usr/sbin/slappasswdein verschlüsseltges Passwort mit einem der nachfolgenden Verschlüsselungsverfahren generiert werden - z.B. CRYPT, SHA, SSHA oder (eher nicht) MD5.

# slappasswd -v -h {SSHA}
New password: 
Re-enter new password: 
{SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms

Erster Start

Bevor weitere Konfigurationsschritte erfolgen, sollte dem ersten Start nichts im Wege stehen, da bereits hier Konfigurationseinstellungen durchgeführt werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# systemctl start slapd.service

:!: HINWEIS - Es erfolgen keine weiteren Ausgaben, wenn der Start erfolgreich war !

Ob der OpenLDAP-Server, sprich der slapd-Dienst/Daemon auch tatsächlich als Hintergrundprozess läuft, kann mit nachfolgendem Befehl überprüft werden (Es sollte eine Ausgabe wie nachfolgend dargestellt erfolgen - es kommt auf die zweite Zeile an!):

# ps auxwf | grep slapd
root        1341  0.0  0.1   6992  2440 pts/0    S+   10:14   0:00                      \_ grep slapd
ldap        1338  0.1  0.7 1085664 15064 ?       Ssl  10:14   0:00 /usr/lib/slapd -d 0 -u ldap -g ldap -h ldap:/// ldapi:///

und nachfolgender Befehl:

# ss -tulpen | grep slapd
tcp   LISTEN 0      2048                  0.0.0.0:389       0.0.0.0:*    users:(("slapd",pid=1338,fd=7)) ino:25022 sk:4 cgroup:/system.slice/slapd.service <->            
tcp   LISTEN 0      2048                     [::]:389          [::]:*    users:(("slapd",pid=1338,fd=8)) ino:25023 sk:7 cgroup:/system.slice/slapd.service v6only:1 <->    16944/slapd

bzw. nachfolgender Befehl:

# systemctl status slapd.service
● slapd.service - OpenLDAP Server Daemon
     Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor pre>
     Active: active (running) since Wed 2022-03-23 10:14:21 CET; 1min 6s ago
       Docs: man:slapd
             man:slapd-config
             man:slapd-mdb
   Main PID: 1338 (slapd)
      Tasks: 2 (limit: 2340)
     Memory: 7.6M
        CPU: 17ms
     CGroup: /system.slice/slapd.service
             └─1338 /usr/lib/slapd -d 0 -u ldap -g ldap -h "ldap:/// ldapi:///"

Mar 23 10:14:21 server systemd[1]: Starting OpenLDAP Server Daemon...
Mar 23 10:14:21 server slapd[1338]: @(#) $OpenLDAP: slapd 2.6.1 (Jan 20 2022 19>
                                            openldap
Mar 23 10:14:21 server slapd[1338]: slapd starting
Mar 23 10:14:21 server systemd[1]: Started OpenLDAP Server Daemon.

Eine weitere Überprüfung, ob der erste Start erfolgreich war, kann durch Einsicht in das Journal von systemd mit nachfolgendem Befehl, die Ausgabe sollte wie nachfolgend dargestellt aussehen:

# journalctl -u slapd.service
Mar 23 10:14:21 server systemd[1]: Starting OpenLDAP Server Daemon...
Mar 23 10:14:21 server slapd[1338]: @(#) $OpenLDAP: slapd 2.6.1 (Jan 20 2022 19>
                                            openldap
Mar 23 10:14:21 server slapd[1338]: slapd starting
Mar 23 10:14:21 server systemd[1]: Started OpenLDAP Server Daemon.

Durch nachfolgenden Befehl, kann das Verzeichnis in dem die MDB transactional database library-Datenbank standardmässig die Dateien der Datenbank des OpenLDAP-Servers ablegt, angezeigt werden. Die Ausgabe sollte in etwa wie nachfolgend gezeigt aussehen:

# ls -l /var/lib/openldap/openldap-data
total 16
-rw------- 1 ldap ldap 12288 Mar 23 10:14 data.mdb
-rw------- 1 ldap ldap  8192 Mar 23 10:14 lock.mdb

Erster Stopp

Bevor weitere Konfigurationsschritte erfolgen, muss der OpenLDAP-Server gestoppt werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# systemctl stop slapd.service

Eine Überprüfung, ob der OpenLDAP-Server wirklich nicht mehr läuft und gestoppt wurde, kann mit nachfolgendem Befehl durchgeführt werden:

# systemctl status slapd.service
○ slapd.service - OpenLDAP Server Daemon
     Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor pre>
     Active: inactive (dead) since Wed 2022-03-23 10:42:24 CET; 9s ago
       Docs: man:slapd
             man:slapd-config
             man:slapd-mdb
    Process: 1338 ExecStart=/usr/lib/slapd -d 0 -u ldap -g ldap -h ${SLAPD_URLS>
   Main PID: 1338 (code=exited, status=0/SUCCESS)
        CPU: 25ms

Mar 23 10:14:21 server slapd[1338]: slapd starting
Mar 23 10:14:21 server systemd[1]: Started OpenLDAP Server Daemon.
Mar 23 10:42:24 server slapd[1338]: daemon: shutdown requested and initiated.
Mar 23 10:42:24 server slapd[1338]: slapd shutdown: waiting for 0 operations/ta>
Mar 23 10:42:24 server systemd[1]: Stopping OpenLDAP Server Daemon...
Mar 23 10:42:24 server slapd[1338]: DIGEST-MD5 common mech free
Mar 23 10:42:24 server systemd[1]: slapd.service: Deactivated successfully.
Mar 23 10:42:24 server slapd[1338]: DIGEST-MD5 common mech free
Mar 23 10:42:24 server systemd[1]: Stopped OpenLDAP Server Daemon.
Mar 23 10:42:24 server slapd[1338]: slapd stopped.

Online-Konfiguration

Seit OpenLDAP Version 2.3 gibt es eine grundlegende Veränderung gegenüber vorherigen Versionen.

Neu ist die Möglichkeit der „Online“-Konfiguration zur Laufzeit. Bei Verwendung einer „statischen“ Konfigurationsdatei - /etc/openldap/sldap.conf - ist bei jeder Änderung an dieser Konfigurationsdatei ein Neustart des OpenLDAP-Daemons/Dienstes slapd.service erforderlich, damit der Daemon/Dienst die Änderung anwenden kann.

Dieses Verhalten wurde komplett geändert, so dass ab Version 2.3 fast alle Änderungen an den Konfigurationsparametern ohne Neustart des OpenLDAP-Daemons/Dienstes slapd.service übernommen werden können.

Vorbereitung: slapd.ldif

Bevor mit Änderungen an der Konfigurationsdatei

  • /etc/openldap/slapd.ldif - Server-Online-Konfigurationsdatei

begonnen werden soll, kann mit nachfolgenden Befehlen eine Sicherung der Konfigurationsdatei angefertigt werden:

# cp -a /etc/openldap/slapd.ldif /etc/openldap/slapd.ldif.save

/etc/openldap/slapd.d

Nachfolgendes Verzeichnis, welches nach der Installation grundsätzlich nicht existiert, muss mit nachfolgenden Befehlen neu erstellt werden und mit den entsprechenden Besitz- und Datei-rechten versehen werden, wie nachfolgend dargestellt:

Neuanlage des Verzeichnisses: /etc/openldap/slapd.d

# mkdir /etc/openldap/slapd.d

Setzen der entsprechenden Besitzrechte:

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

Setzen der entsprechenden Dateirechte:

# chmod 700 /etc/openldap/slapd.d

/etc/openldap/slapd.ldif

Ab der OpenLDAP-Version 2.3 bietet OpenLDAP zusätzlich die Option die Konfiguration zur Laufzeit zu verwalten und nicht mehr in einer „statischen“ Konfigurationsdatei.

Die Konfigurationsdatei /etc/openldap/sldap.ldif ist grundsätzlich in drei Sektionen unterteilt:

  1. Globale Direktiven
  2. Backend Direktiven
  3. Database-spezifische Direktiven

wobei Backend- und zugehörige Database-spezifische Direktiven mehrfach konfiguriert werden können.

Die Server-Online-Konfigurationsdatei /etc/openldap/sldap.ldif dient zur Konfiguration des Server. Dies ist die Standard-Online-Konfigurationsdatei:

#
# See slapd-config(5) for details on configuration options.
# This file should NOT be world readable.
#
dn: cn=config
objectClass: olcGlobal
cn: config
#
#
# Define global ACLs to disable default read access.
#
olcArgsFile: /run/openldap/slapd.args
olcPidFile: /run/openldap/slapd.pid
#
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#olcReferral:	ldap://root.openldap.org
#
# Sample security restrictions
#	Require integrity protection (prevent hijacking)
#	Require 112-bit (3DES or better) encryption for updates
#	Require 64-bit encryption for simple bind
#olcSecurity: ssf=1 update_ssf=112 simple_bind=64
 
 
#
# Load dynamic backend modules:
#
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath:	/usr/lib/openldap
olcModuleload:	back_mdb.la
#olcModuleload:	back_ldap.la
#olcModuleload:	back_passwd.la
 
dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema
 
include: file:///etc/openldap/schema/core.ldif
 
# Frontend settings
#
dn: olcDatabase=frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: frontend
#
# Sample global 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
#
#olcAccess: to dn.base="" by * read
#olcAccess: to dn.base="cn=Subschema" by * read
#olcAccess: 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!
#
 
 
#######################################################################
# LMDB database definitions
#######################################################################
#
dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
olcDbMaxSize: 1073741824
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
# Cleartext passwords, especially for the rootdn, should
# be avoided.  See slappasswd(8) and slapd-config(5) for details.
# Use of strong authentication encouraged.
olcRootPW: secret
# The database directory MUST exist prior to running slapd AND 
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
olcDbDirectory:	/var/lib/openldap/openldap-data
# Indices to maintain
olcDbIndex: objectClass eq
 
dn: olcDatabase=monitor,cn=config
objectClass: olcDatabaseConfig
olcDatabase: monitor
olcRootDN: cn=config
olcMonitoring: FALSE

Folgende Anpassungen der Online-Konfigurationsdatei /etc/openldap/sldap.ldif genügen, um grundsätzlich die grundlegenden Einstellungen für den Betrieb eines LDAP-Server mit Online-Konfigurationsdatei bereitzustellen:

#
# See slapd-config(5) for details on configuration options.
# This file should NOT be world readable.
#
dn: cn=config
objectClass: olcGlobal
cn: config
#
#
# Define global ACLs to disable default read access.
#
olcArgsFile: /run/openldap/slapd.args
# Tachtler - NEW - 
olcIdleTimeout: 15
olcPidFile: /run/openldap/slapd.pid
#
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
# Tachtler
# default: #olcReferral:	ldap://root.openldap.org
olcReferral: ldap://ldap.idmz.tachtler.net
#
# Sample security restrictions
#	Require integrity protection (prevent hijacking)
#	Require 112-bit (3DES or better) encryption for updates
#	Require 64-bit encryption for simple bind
#olcSecurity: ssf=1 update_ssf=112 simple_bind=64
 
 
#
# Load dynamic backend modules:
#
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath:	/usr/lib/openldap
olcModuleload:	back_mdb.la
#olcModuleload:	back_ldap.la
#olcModuleload:	back_passwd.la
 
dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema
 
include: file:///etc/openldap/schema/core.ldif
# Tachtler - NEW - 
include: file:///etc/openldap/schema/cosine.ldif
include: file:///etc/openldap/schema/inetorgperson.ldif
include: file:///etc/openldap/schema/nis.ldif
 
# Frontend settings
#
dn: olcDatabase=frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: frontend
#
# Sample global 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
#
#olcAccess: to dn.base="" by * read
#olcAccess: to dn.base="cn=Subschema" by * read
#olcAccess: 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!
#
 
#######################################################################
# Tachtler - NEW - 
#######################################################################
#
dn: olcDatabase=config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: config
olcRootDN: cn=config
olcRootPW: {SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms
 
#######################################################################
# LMDB database definitions
#######################################################################
#
dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
olcDbMaxSize: 1073741824
# Tachtler
# default: olcSuffix: dc=my-domain,dc=com
olcSuffix: dc=tachtler,dc=net
# Tachtler
# default: olcRootDN: cn=Manager,dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=tachtler,dc=net
# Cleartext passwords, especially for the rootdn, should
# be avoided.  See slappasswd(8) and slapd-config(5) for details.
# Use of strong authentication encouraged.
# Tachtler
# default: olcRootPW: secret
olcRootPW: {SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms
# The database directory MUST exist prior to running slapd AND 
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
olcDbDirectory:	/var/lib/openldap/openldap-data
# Indices to maintain
olcDbIndex: objectClass eq
# Tachtler - NEW - 
olcDbIndex: uid pres,eq
olcDbIndex: mail pres,sub,eq
olcDbIndex: cn,sn pres,sub,eq
olcDbIndex: dc eq
 
dn: olcDatabase=monitor,cn=config
objectClass: olcDatabaseConfig
olcDatabase: monitor
olcRootDN: cn=config
olcMonitoring: FALSE

Erklärungen:

  • # Tachtler - NEW - 
    olcIdleTimeout: 15

Der Parameter olcIdleTimeout beendet nach dem angegebenen Wert in Sekunden die Verbindung zum Client, wenn diese innerhalb der angegebenen Zeit keine Aktivitäten mehr zeigt.

  • olcReferral: ldap://ldap.idmz.tachtler.net

Der Parameter olcReferral definiert die zurückgelieferte URL, wenn der OpenLDAP-Server keine lokale Datenbank findet, um die Anfrage zu beantworten.

  • # Tachtler - NEW - 
    include: file:///etc/openldap/schema/cosine.ldif
    include: file:///etc/openldap/schema/inetorgperson.ldif
    include: file:///etc/openldap/schema/nis.ldif

Die include-Direktive (global) dient hier der Integration von Schemadateien, welche bestimmte Objektklassen und Attribute zur Verfügung stellen. Bei der Einbindung der Schemas sind zudem folgende Punkte von absoluter Wichtigkeit:

  • Die Reihenfolge, in der die Schemas eingebunden werden (Stichwort: Vererbung!)
  • Bei Replikation eine identische Reihenfolge der Include-Statements für die

Schemadateien auf Primary- und Secondary-Server

  • Bei Replikation sind unbedingt identische Versionen der Schemas auf Primary- und Secondary-Server erforderlich . Seit OpenLDAP-Version 2.4 ist mit Hilfe der Online-Konfiguration auch die Replikation der Schemas selbst möglich, was eine deutliche administrative Vereinfachung darstellt.
  • #######################################################################
    # Tachtler - NEW - 
    #######################################################################
    #
    dn: olcDatabase=config,cn=config
    objectClass: olcDatabaseConfig
    olcDatabase: config
    olcRootDN: cn=config
    olcRootPW: {SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms

Hier wird das Passwort für den olcRootDN: cn=config (Config) gesetzt, da sonst keine Änderungen an der Konfiguration möglich sind!

Der Parameter olcRootPW (Database) dient, der Definition des Passworts für den zuvor beschriebenen rootdn. Zur Generierung des Passworts stehen mehrere kryptographische Methoden zur Verfügung. Auch ein Klartext-Passwort wäre möglich, ist allerdings sicherheitstechnisch nicht zu empfehlen. Nachfolgend soll mit Hilfe des Programms /usr/sbin/slappasswdein verschlüsseltges Passwort mit einem der nachfolgenden Verschlüsselungsverfahren generiert werden - z.B. CRYPT, SHA, SSHA oder (eher nicht) MD5.

# slappasswd -v -h {SSHA}
New password: 
Re-enter new password: 
{SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms

:!: HINWEIS - Dies ist extrem wichtig!

  • olcSuffix: dc=tachtler,dc=net

Der Parameter olcSuffix (Database) dient der Definition der BaseDN. Die BaseDN (DN = Distinguished Name) beschreibt die Top Level Domain (TLD) oder auch Basis, den „höchsten“ sichtbaren Punkt des DIT (Directory Information Tree), von dem aus auf alle anderen Bereiche verzweigt wird. Die Direktive ist immer mit der jeweiligen Datenbank verknüpft. Das Suffix besteht mindestens aus einer oder mehr Komponenten. Beispiel: o=domain,c=de, wobei o für organization und c für country steht.

:!: HINWEIS - Nachfolgend soll jedoch dc (dc = domain component) und die TLD (Top Level Domain) bzw. BaseDN zur Anwendung kommen.

  • olcRootDN: cn=Manager,dc=tachtler,dc=net

Der Parameter olcRootDN (Database) legt den DN des LDAP-Administrators „statisch“ in der LDAP-Serverkonfiguration fest. Hierbei wird kein bestehender System-Account verwendet (was aufgrund der geforderten DN-Syntax ohnehin nicht möglich wäre), sondern ein in der /etc/openldap/sldap.conf-Konfiguration statisch fest gelegtes Konto, welches stets den vollen Zugriff auf den DIT hat. Der rootdn darf somit standardmäßig, jederzeit alle administrativen Tätigkeiten am OpenLDAP-Server durchführen. Das komplette rootdn-Statement muss sich immer auf den tatsächlich verwendeten suffix (hier: dc=tachtler,dc=net) beziehen!

  • olcRootPW: {SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms

Der Parameter olcRootPW (Database) dient, der Definition des Passworts für den zuvor beschriebenen rootdn. Zur Generierung des Passworts stehen mehrere kryptographische Methoden zur Verfügung. Auch ein Klartext-Passwort wäre möglich, ist allerdings sicherheitstechnisch nicht zu empfehlen. Nachfolgend soll mit Hilfe des Programms /usr/sbin/slappasswdein verschlüsseltges Passwort mit einem der nachfolgenden Verschlüsselungsverfahren generiert werden - z.B. CRYPT, SHA, SSHA oder (eher nicht) MD5.

# slappasswd -v -h {SSHA}
New password: 
Re-enter new password: 
{SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms
  • # Tachtler - NEW - 
    olcDbIndex: uid pres,eq
    olcDbIndex: mail pres,sub,eq
    olcDbIndex: cn,sn pres,sub,eq
    olcDbIndex: dc eq

Bei Datenbanken sollten häufig benutzte bzw. gesuchte Attribute indexiert werden. Hierzu kann die Datenbank ein Indexfeld für das entsprechende Attribut erstellen. Suchvorgänge für dieses Attribut werden so deutlich beschleunigt.

Import: /etc/openldap/slapd.ldif

Bevor weitere Konfigurationsschritte erfolgen, muss der OpenLDAP-Server gestoppt werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# systemctl stop slapd.service

Eine Überprüfung, ob der OpenLDAP-Server wirklich nicht mehr läuft und gestoppt wurde, kann mit nachfolgendem Befehl durchgeführt werden:

# systemctl status slapd.service
○ slapd.service - OpenLDAP Server Daemon
     Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor pre>
     Active: inactive (dead) since Wed 2022-03-23 10:42:24 CET; 9s ago
       Docs: man:slapd
             man:slapd-config
             man:slapd-mdb
    Process: 1338 ExecStart=/usr/lib/slapd -d 0 -u ldap -g ldap -h ${SLAPD_URLS>
   Main PID: 1338 (code=exited, status=0/SUCCESS)
        CPU: 25ms

Mar 23 10:14:21 server slapd[1338]: slapd starting
Mar 23 10:14:21 server systemd[1]: Started OpenLDAP Server Daemon.
Mar 23 10:42:24 server slapd[1338]: daemon: shutdown requested and initiated.
Mar 23 10:42:24 server slapd[1338]: slapd shutdown: waiting for 0 operations/ta>
Mar 23 10:42:24 server systemd[1]: Stopping OpenLDAP Server Daemon...
Mar 23 10:42:24 server slapd[1338]: DIGEST-MD5 common mech free
Mar 23 10:42:24 server systemd[1]: slapd.service: Deactivated successfully.
Mar 23 10:42:24 server slapd[1338]: DIGEST-MD5 common mech free
Mar 23 10:42:24 server systemd[1]: Stopped OpenLDAP Server Daemon.
Mar 23 10:42:24 server slapd[1338]: slapd stopped.

:!: HINWEIS - Der Server muss gestoppt sein!

Nachfolgender Befehl importiert nun die Online-Server–Konfiguration, als Benutzer ldap, so wie die einzelnen Parameter in der Online-Server-Konfigurationsdatei - /etc/openldap/slapd.ldif - gesetzt worden sind:

# sudo -u ldap slapadd -v -n 0 -F /etc/openldap/slapd.d/ -l /etc/openldap/slapd.ldif
added: "cn=config" (00000001)
added: "cn=module{0},cn=config" (00000001)
added: "cn=schema,cn=config" (00000001)
added: "cn={0}core,cn=schema,cn=config" (00000001)
added: "cn={1}cosine,cn=schema,cn=config" (00000001)
added: "cn={2}inetorgperson,cn=schema,cn=config" (00000001)
added: "cn={3}nis,cn=schema,cn=config" (00000001)
added: "olcDatabase={-1}frontend,cn=config" (00000001)
added: "olcDatabase={0}config,cn=config" (00000001)
added: "olcDatabase={1}mdb,cn=config" (00000001)
added: "olcDatabase={2}monitor,cn=config" (00000001)
Closing DB...

Zusätzlich zur Ausgabe der einzelnen Schritte während der Befehlsausführung, kann mit nachfolgendem Befehl zusätzlich überprüft werden, ob im Verzeichnis

  • /etc/openldap/slapd.d

nachfolgendes Verzeichnis und nachfolgende Datei erstellt worden sind:

# ls -l /etc/openldap/slapd.d/
total 4
drwxr-x--- 1 ldap ldap 290 Mar 23 13:48 'cn=config'
-rw------- 1 ldap ldap 440 Mar 23 13:48 'cn=config.ldif'

Start: Online-Konfiguration

Bevor weitere Konfigurationsschritte erfolgen, sollte dem ersten Start mit der Online-Server-Konfiguration nichts im Wege stehen, da bereits hier Konfigurationseinstellungen durchgeführt wurden, was mit nachfolgendem Befehl durchgeführt werden kann:

# systemctl start slapd.service

:!: HINWEIS - Es erfolgen keine weiteren Ausgaben, wenn der Start erfolgreich war !

Ob der OpenLDAP-Server, sprich der slapd-Dienst/Daemon auch tatsächlich als Hintergrundprozess läuft, kann mit nachfolgendem Befehl überprüft werden (Es sollte eine Ausgabe wie nachfolgend dargestellt erfolgen - es kommt auf die zweite Zeile an!):

# ps auxwf | grep slapd
root        1615  0.0  0.1   6992  2652 pts/0    S+   13:55   0:00                      \_ grep slapd
ldap        1610  0.1  0.7 1086708 15072 ?       Ssl  13:55   0:00 /usr/lib/slapd -d 0 -u ldap -g ldap -h ldap:/// ldapi:///

und nachfolgender Befehl:

# ss -tulpen | grep slapd
tcp   LISTEN 0      2048                  0.0.0.0:389       0.0.0.0:*    users:(("slapd",pid=1610,fd=7)) ino:27556 sk:4 cgroup:/system.slice/slapd.service <->            
tcp   LISTEN 0      2048                     [::]:389          [::]:*    users:(("slapd",pid=1610,fd=8)) ino:27557 sk:7 cgroup:/system.slice/slapd.service v6only:1 <->

bzw. nachfolgender Befehl:

# systemctl status slapd.service
● slapd.service - OpenLDAP Server Daemon
     Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor pre>
     Active: active (running) since Wed 2022-03-23 13:55:35 CET; 41s ago
       Docs: man:slapd
             man:slapd-config
             man:slapd-mdb
   Main PID: 1610 (slapd)
      Tasks: 2 (limit: 2340)
     Memory: 3.3M
        CPU: 15ms
     CGroup: /system.slice/slapd.service
             └─1610 /usr/lib/slapd -d 0 -u ldap -g ldap -h "ldap:/// ldapi:///"

Mar 23 13:55:35 server systemd[1]: Starting OpenLDAP Server Daemon...
Mar 23 13:55:35 server slapd[1610]: @(#) $OpenLDAP: slapd 2.6.1 (Jan 20 2022 19>
                                            openldap
Mar 23 13:55:35 server systemd[1]: Started OpenLDAP Server Daemon.
Mar 23 13:55:35 server slapd[1610]: slapd starting

Eine weitere Überprüfung, ob der erste Start erfolgreich war, kann durch Einsicht in das Journal von systemd mit nachfolgendem Befehl, die Ausgabe sollte wie nachfolgend dargestellt aussehen:

# journalctl -u slapd.service
Mar 23 13:25:10 server slapd[424]: daemon: shutdown requested and initiated.
Mar 23 13:25:10 server systemd[1]: Stopping OpenLDAP Server Daemon...
Mar 23 13:25:10 server slapd[424]: slapd shutdown: waiting for 0 operations/tas>
Mar 23 13:25:10 server slapd[424]: DIGEST-MD5 common mech free
Mar 23 13:25:10 server slapd[424]: DIGEST-MD5 common mech free
Mar 23 13:25:10 server slapd[424]: slapd stopped.
Mar 23 13:25:10 server systemd[1]: slapd.service: Deactivated successfully.
Mar 23 13:25:10 server systemd[1]: Stopped OpenLDAP Server Daemon.
Mar 23 13:55:35 server systemd[1]: Starting OpenLDAP Server Daemon...
Mar 23 13:55:35 server slapd[1610]: @(#) $OpenLDAP: slapd 2.6.1 (Jan 20 2022 19>
                                            openldap
Mar 23 13:55:35 server systemd[1]: Started OpenLDAP Server Daemon.
Mar 23 13:55:35 server slapd[1610]: slapd starting

Mit nachfolgendem Befehlen kann überprüft werden, ob der OpenLDAP-Server, sprich der slapd-Dienst/Daemon auch Anfragen beantworten kann:

# ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (objectclass=*)
# requesting: namingContexts 
#
 
#
dn:
namingContexts: dc=tachtler,dc=net
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

Abfrage der „globalen“ Konfigurationseinstellungen:

# ldapsearch -H ldapi:/// -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: /run/openldap/slapd.args
olcIdleTimeout: 15
olcPidFile: /run/openldap/slapd.pid
olcReferral: ldap://ldap.idmz.tachtler.net
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

Abfrage der „einzelnen Datenbank“ Konfigurationseinstellungen:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b cn=config "(objectclass=olcDatabaseConfig)"
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: (objectclass=olcDatabaseConfig)
# requesting: ALL
#
 
# {-1}frontend, config
dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
 
# {0}config, config
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcRootDN: cn=config
olcRootPW: {SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms
 
# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/openldap/openldap-data
olcSuffix: dc=tachtler,dc=net
olcRootDN: cn=Manager,dc=tachtler,dc=net
olcRootPW: {SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms
olcDbIndex: objectClass eq
olcDbMaxSize: 1073741824
 
# {2}monitor, config
dn: olcDatabase={2}monitor,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {2}monitor
olcRootDN: cn=config
olcMonitoring: FALSE
 
# search result
search: 2
result: 0 Success
 
# numResponses: 5
# numEntries: 4

Übersicht: Online-Konfiguration

Die slapd-Konfiguration wird in einem speziellen LDAP-Verzeichnis mit einem vordefinierten Schema und DIT gespeichert. Es gibt spezifische Objektklassen, die für globale Konfigurationsoptionen, Schemadefinitionen, Backend- und Datenbankdefinitionen und verschiedene andere Elemente verwendet werden

OpenLDAP Admin Guide - 5. Configuring slapd - 5.1. Configuration Layout

* Quelle: OpenLDAP Admin Guide - 5. Configuring slapd - 5.1. Configuration Layout

/etc/openldap/slapd.d/cn=config.ldif

Die Konfigurationsdatei

  • /etc/openldap/slapd.d/cn=config.ldif

stellt die Hauptkonfigurationsdatei des OpenLDAP-Servers dar und beinhaltet die globalen Konfigurationen.

:!: WICHTIG - Es sollten KEINE Änderungen durch manuelle Ergänzungen durchgeführt werden !!!

Eine Abfrage der Konfiguration, welche mit nachfolgendem Befehl durchgeführt werden kann, sollte eine Ausgabe in etwa wie die nachfolgende zum Vorschein bringen:

# cat /etc/openldap/slapd.d/cn=config.ldif
# cat /etc/openldap/slapd.d/cn=config.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 0e9fdd41
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /run/openldap/slapd.args
olcIdleTimeout: 15
olcPidFile: /run/openldap/slapd.pid
olcReferral: ldap://ldap.idmz.tachtler.net
structuralObjectClass: olcGlobal
entryUUID: 4dbb57f1-9f4b-4844-9283-10c3e337c797
creatorsName: cn=config
createTimestamp: 20220323193424Z
entryCSN: 20220323193424.170399Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20220323193424Z

oder mit nachfolgender Abfrage:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b cn=config "(objectclass=olcGlobal)"
# ldapsearch -H ldapi:/// -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: /run/openldap/slapd.args
olcIdleTimeout: 15
olcPidFile: /run/openldap/slapd.pid
olcReferral: ldap://ldap.idmz.tachtler.net
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif

Die Konfigurationsdatei

  • /etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif

stellt die Hauptkonfigurationsdatei des OpenLDAP-Servers dar und beinhaltet die expliziten Konfigurationen.

:!: WICHTIG - Es sollten KEINE Änderungen durch manuelle Ergänzungen durchgeführt werden !!!

Eine Abfrage der Konfiguration, welche mit nachfolgendem Befehl durchgeführt werden kann, sollte eine Ausgabe in etwa wie die nachfolgende zum Vorschein bringen:

# cat /etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif
# cat /etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 02141e4e
dn: olcDatabase={0}config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcRootDN: cn=config
olcRootPW:: e1WSMVBKfWIUOHpYNzEsUmklO1U=
structuralObjectClass: olcDatabaseConfig
entryUUID: 54189746-bcb6-4e79-8251-e6535f9b78ea
creatorsName: cn=config
createTimestamp: 20220323193424Z
entryCSN: 20220323193424.171833Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20220323193424Z

oder mit nachfolgender Abfrage:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={0}config,cn=config
# ldapsearch -H ldapi:/// -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
olcRootDN: cn=config
olcRootPW: {SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

/etc/openldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif

Die Konfigurationsdatei

  • /etc/openldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif

stellt die Zugriffskonfigurationsdatei des OpenLDAP-Servers dar und beinhaltet die Konfigurationen für den Zugriff.

:!: WICHTIG - Es sollten KEINE Änderungen durch manuelle Ergänzungen durchgeführt werden !!!

Eine Abfrage der Konfiguration, welche mit nachfolgendem Befehl durchgeführt werden kann, sollte eine Ausgabe in etwa wie die nachfolgende zum Vorschein bringen:

# cat /etc/openldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif
# cat /etc/openldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 608e21bf
dn: olcDatabase={-1}frontend
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
structuralObjectClass: olcDatabaseConfig
entryUUID: f72271f8-97eb-427c-b627-b6d8c60ab150
creatorsName: cn=config
createTimestamp: 20220323193424Z
entryCSN: 20220323193424.171691Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20220323193424Z

oder mit nachfolgender Abfrage:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={-1}frontend,cn=config
# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={-1}frontend,cn=config
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <olcDatabase={-1}frontend,cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# {-1}frontend, config
dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

/etc/openldap/slapd.d/cn=config/olcDatabase={1}mdb.ldif

Die Konfigurationsdatei

  • /etc/openldap/slapd.d/cn=config/olcDatabase={1}mdb.ldif

stellt die Datenbankkonfiguration des OpenLDAP-Servers dar und beinhaltet die Konfiguration der darunterliegenden Datenbank.

:!: WICHTIG - Es sollten KEINE Änderungen durch manuelle Ergänzungen durchgeführt werden !!!

Eine Abfrage der Konfiguration, welche mit nachfolgendem Befehl durchgeführt werden kann, sollte eine Ausgabe in etwa wie die nachfolgende zum Vorschein bringen:

# cat /etc/openldap/slapd.d/cn=config/olcDatabase={1}mdb.ldif 
# cat /etc/openldap/slapd.d/cn=config/olcDatabase={1}mdb.ldif 
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 cc45cb54
dn: olcDatabase={1}mdb
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/openldap/openldap-data
olcSuffix: dc=tachtler,dc=net
olcRootDN: cn=Manager,dc=tachtler,dc=net
olcRootPW:: e1WSMVBKfWIUOHpYNzEsUmklO1U=
olcDbIndex: objectClass eq
olcDbIndex: uid pres,eq
olcDbIndex: mail pres,sub,eq
olcDbIndex: cn,sn pres,sub,eq
olcDbIndex: dc eq
olcDbMaxSize: 1073741824
structuralObjectClass: olcMdbConfig
entryUUID: d08e17d3-4c14-4348-b4e4-3986d82444b1
creatorsName: cn=config
createTimestamp: 20220323193424Z
entryCSN: 20220323193424.171974Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20220323193424Z
# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={1}mdb,cn=config
# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={1}mdb,cn=config
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <olcDatabase={1}mdb,cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/openldap/openldap-data
olcSuffix: dc=tachtler,dc=net
olcRootDN: cn=Manager,dc=tachtler,dc=net
olcRootPW: {SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms
olcDbIndex: objectClass eq
olcDbIndex: uid pres,eq
olcDbIndex: mail pres,sub,eq
olcDbIndex: cn,sn pres,sub,eq
olcDbIndex: dc eq
olcDbMaxSize: 1073741824
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

/etc/openldap/slapd.d/cn=config/olcDatabase={2}monitor.ldif

Die Konfigurationsdatei

  • /etc/openldap/slapd.d/cn=config/olcDatabase={2}monitor.ldif

stellt die Selbstüberwachungskonfigurationsdatei des OpenLDAP-Servers dar und beinhaltet die Konfigurationen zur Überwachung und Selbstverwaltung.

:!: WICHTIG - Es sollten KEINE Änderungen durch manuelle Ergänzungen durchgeführt werden !!!

Eine Abfrage der Konfiguration, welche mit nachfolgendem Befehl durchgeführt werden kann, sollte eine Ausgabe in etwa wie die nachfolgende zum Vorschein bringen:

Eine Abfrage der Konfiguration, welche mit nachfolgendem Befehl durchgeführt werden kann, sollte eine Ausgabe in etwa wie die nachfolgende zum Vorschein bringen:

# cat /etc/openldap/slapd.d/cn=config/olcDatabase={2}monitor.ldif
# cat /etc/openldap/slapd.d/cn=config/olcDatabase={2}monitor.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 0eb969ee
dn: olcDatabase={2}monitor
objectClass: olcDatabaseConfig
olcDatabase: {2}monitor
olcRootDN: cn=config
olcMonitoring: FALSE
structuralObjectClass: olcDatabaseConfig
entryUUID: a38822d2-7cc8-4143-8d12-964392041e2d
creatorsName: cn=config
createTimestamp: 20220323193424Z
entryCSN: 20220323193424.172250Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20220323193424Z
# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={2}monitor,cn=config
# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={2}monitor,cn=config
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <olcDatabase={2}monitor,cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# {2}monitor, config
dn: olcDatabase={2}monitor,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {2}monitor
olcRootDN: cn=config
olcMonitoring: FALSE
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

Komplette Konfiguration

Mit nachfolgendem Befehl, kann die komplette Konfiguration, wie sie durch den OpenLDAP-Server selbst verwaltet wird, inklusive aller zur Verwendung kommenden und geladenen Schemata und der vorangegangenen Konfigurationen, ausgegeben werden:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b cn=config

(Nur beispielhafter Ausschnitt)

# ldapsearch -H ldapi:/// -W -x -D cn=config -b cn=config
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
...
...
...
# numResponses: 9
# numEntries: 8

TLS-Zertifikat erstellen

Um den OpenLDAP-Server nicht nur unverschlüsselt, sondern auch via TLS/StartTLS-Verschlüsselung ansprechen zu können, muss zuerst ein Zertifikat erzeugt werden. Dies kann durch eine offizielle Zertifizierungsstelle durchgeführt werden, was jedoch natürlich mit Kosten verbunden ist, oder es kommt ein sogenanntes Self-Signed-Certificate (Selbst erstelltes/unterschriebenes) Zertifikat zum Einsatz.

Um die Verschlüsselung einsetzen zu können, sind folgende Komponenten erforderlich:

  • eine eigen Certificate Authority (CA), welche Self-Signed-Certificate (Selbst erstelltes/unterschriebenes) Zertifikat esrtellen kann
  • einen CSR (Certificate Request), welcher von einer Certificate Authority (CA) signiert wird
  • einem private key (privaten Schlüssel), welcher zum CRT (Certificate) gehört und zum Einsatz eines CRT (Certificate) benötigt wird
  • das CRT (Certificate) selbst, welcher von der Certificate Authority (CA) ausgestellt wird

Zur Erstellung eines Self-Signed-Certificate und zur Erstellung der oben genannten Komponenten, wird das Paket

  • openssl

benötigt, welches i.d.R. bereits installiert sein sollte.

Abschliessend soll mit nachfolgendem Befehl in das Verzeichnis /etc/ssl gewechselt werden:

# cd /etc/ssl

/etc/ssl/openssl.cnf

Nachfolgende Anpassungen müssen mindestens in der Konfigurationsdatei /etc/ssl/openssl.cnf durchgeführt werden, um SAN (Subject Alternative Names) in das Zertifikat mit aufnehmen zu können:

(Nur relevanter Ausschnitt):

[ v3_req ]
 
# Extensions to add to a certificate request
 
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
# Tachtler - NEW -
subjectAltName = @alt_names
 
# Tachtler - NEW -
[ alt_names ]
DNS.1 = ldap.idmz.tachtler.net
DNS.2 = ldap.tachtler.net

* Danke an Stefan Mayr für den Hinweis das Zertifikat mit Subject Alternative Names auszustatten → Hintergrund: Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS) - Section 6.4.4

Erstellen CA (Certificate Authority)

Zur Erstellung einer eigene Certificate Authority (CA) kann ein Script, welches bei der Installation von openssl mitgeliefert wird und sich im Verzeichnis /etc/ssl/misc/ befindet, genutzt werden. Der Name des Scripts lautet

  • /etc/ssl/misc/CA.pl.

:!: HINWEIS - Um Subject Alternative Names hinzufügen zu können, muss nachfolgende zweite Ergänzung abgeändert werden, das sonst die -extensions v3_req NICHT angezogen wird!

:!: HINWEIS - Die zu erstellende Certificate Authority (CA) hat standardmässig eine Laufzeit von 3 Jahren !!!

Falls eine längere Laufzeit als drei Jahre gewünscht sein soll, kann nachfolgender Parameter im Skript, in nachfolgendem Verzeichnis, mit nachfolgendem Namen

  • /etc/ssl/misc/CA.pl

angepasst werden:

(Nur relevanter Ausschnitt)

...
# Tachtler
# default: my $DAYS = "-days 365";
my $DAYS = "-days 28402"; # 27.03.2022 - 30.12.2099
# Tachtler
# default: my $CADAYS = "-days 1095";   # 3 years
my $CADAYS = "-days 28403"; # 27.03.2022 - 31.12.2099
...
...
...
} elsif ($WHAT eq '-sign' ) {
    $RET = run("$CA -policy policy_anything -out $NEWCERT"
            # Tachtler
            # default: . " -infiles $NEWREQ $EXTRA{ca}");
            . " -extensions v3_req -infiles $NEWREQ $EXTRA{ca}");
    print "Signed certificate is in $NEWCERT\n" if $RET == 0;
... 

:!: WICHTIG - Die Laufzeit der Certificate Authority (CA) muss länger als die Laufzeit des Zertifikates sein !!!

Folgender Aufruf erstellt eine eigene Certificate Authority (CA):

:!: HINWEIS - Nicht benötigte Angaben werden mit Eingabe eines Punktes [.] übersprungen!

# /etc/ssl/misc/CA.pl -newca
# /etc/ssl/misc/CA.pl -newca
CA certificate filename (or enter to create)
 
Making CA certificate ...
====
openssl req  -new -keyout /etc/ssl/private/cakey.pem -out /etc/ssl/careq.pem 
Generating a RSA private key
.............................+++++
......+++++
writing new private key to '/etc/ssl/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Bavaria (Bayern)
Locality Name (eg, city) []:Munich (Muenchen)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:tachtler.net
Organizational Unit Name (eg, section) []:.
Common Name (e.g. server FQDN or YOUR name) []:www.tachtler.net
Email Address []:hostmaster@tachtler.net
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:.
==> 0
====
====
openssl ca  -create_serial -out /etc/ssl/cacert.pem -days 28403 -batch -keyfile /etc/ssl/private/cakey.pem -selfsign -extensions v3_ca  -infiles /etc/ssl/careq.pem
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            58:b7:f2:c0:f9:30:8d:48:4f:77:d3:56:3d:9d:a9:98:19:e6:a2:49
        Validity
            Not Before: Mar 27 10:48:57 2022 GMT
            Not After : Dec 31 10:48:57 2099 GMT
        Subject:
            countryName               = DE
            stateOrProvinceName       = Bavaria (Bayern)
            organizationName          = tachtler.net
            commonName                = www.tachtler.net
            emailAddress              = hostmaster@tachtler.net
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                07:39:3F:8F:38:B5:EA:69:3E:FA:BC:C4:AB:7C:30:18:93:26:B8:77
            X509v3 Authority Key Identifier: 
                keyid:07:39:3F:8F:38:B5:EA:69:3E:FA:BC:C4:AB:7C:30:18:93:26:B8:77
 
            X509v3 Basic Constraints: critical
                CA:TRUE
Certificate is to be certified until Dec 31 10:48:57 2099 GMT (28403 days)
 
Write out database with 1 new entries
Data Base Updated
==> 0
====
CA certificate is in /etc/ssl/cacert.pem

Durch ausführen des Skriptes mit nachfolgendem Aufrufparameter /etc/ssl/misc/CA.pl -newca ist eine neue Verzeichnisstruktur und neue Dateien unter

  • /etc/ssl

entstanden, deren Inhalt mit nachfolgendem Befehl bequem aufgelistet werden kann:

# ls -l /etc/ssl
total 64
-rw-r--r-- 1 root root  4611 Mar 27 12:48 cacert.pem
-rw-r--r-- 1 root root  1078 Mar 27 12:48 careq.pem
lrwxrwxrwx 1 root root    46 Jun  3  2021 cert.pem -> ../ca-certificates/extracted/tls-ca-bundle.pem
drwxr-xr-x 1 root root 13526 Mar 16 09:30 certs
drwxr-xr-x 1 root root     0 Mar 27 12:47 crl
-rw-r--r-- 1 root root     3 Mar 27 12:47 crlnumber
-rw-r--r-- 1 root root   412 Dec 18 11:31 ct_log_list.cnf
-rw-r--r-- 1 root root   412 Dec 18 11:31 ct_log_list.cnf.dist
-rw-r--r-- 1 root root   166 Mar 27 12:48 index.txt
-rw-r--r-- 1 root root    21 Mar 27 12:48 index.txt.attr
-rw-r--r-- 1 root root     0 Mar 27 12:47 index.txt.old
drwxr-xr-x 1 root root    36 Mar 27 12:47 misc
drwxr-xr-x 1 root root    88 Mar 27 12:48 newcerts
-rw-r--r-- 1 root root 11160 Mar 27 12:46 openssl.cnf
-rw-r--r-- 1 root root 10909 Dec 18 11:31 openssl.cnf.dist
drwxr-xr-x 1 root root    18 Mar 27 12:47 private
-rw-r--r-- 1 root root    41 Mar 27 12:48 serial
# ls -l /etc/ssl/newcerts
total 8
-rw-r--r-- 1 root root 4611 Mar 27 12:48 58B7F2C0F9308D484F77D3563D9DA99819E6A249.pem
# ls -l /etc/ssl/private
total 4
-rw------- 1 root root 1854 Mar 27 12:48 cakey.pem

Erstellen CSR (Certificate Request)

Ebenfalls mit dem Script, welches schon bei der Erstellung einer eigene Certificate Authority (CA) genutzt wurde und sich unter /etc/ssl/misc befindet und den Namen CA trägt, kann nun dieses auch zur Erstellung von

  • einem CSR (Certificate Request)
  • einem private key (privaten Schlüssel)

genutzt werden.

:!: HINWEIS - Das zu erstellende Zertifikat hat standardmässig eine Laufzeit von 1 Jahr !!!

Falls eine längere Laufzeit als ein Jahr gewünscht sein soll, kann nachfolgender Parameter im Skript, in nachfolgendem Verzeichnis, mit nachfolgendem Namen

  • /etc/ssl/openssl.cnf

angepasst werden:

(Nur relevanter Ausschnitt)

...
# Tachtler
# default: default_days = 365           # how long to certify for
default_days    = 28402         # how long to certify for 27.03.2022 - 30.12.2099
...

:!: HINWEIS - Nicht benötigte Angaben werden mit Eingabe eines Punktes [.] übersprungen!

# /etc/ssl/misc/CA.pl -newreq -extra-req -extensions=v3_req
# /etc/ssl/misc/CA.pl -newreq -extra-req -extensions=v3_req
Use of uninitialized value $1 in concatenation (.) or string at /etc/ssl/misc/CA.pl line 137.
====
openssl req  -new  -keyout newkey.pem -out newreq.pem -days 28402 -extensions=v3_req
Ignoring -days; not generating a certificate
Generating a RSA private key
...+++++
....................................+++++
writing new private key to 'newkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Bavaria (Bayern)
Locality Name (eg, city) []:Munich (Muenchen)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:tachtler.net
Organizational Unit Name (eg, section) []:.
Common Name (e.g. server FQDN or YOUR name) []:ldap.idmz.tachtler.net
Email Address []:hostmaster@tachtler.net
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: 
An optional company name []:.
==> 0
====
Request is in newreq.pem, private key is in newkey.pem

Durch ausführen des Scripts mit nachfolgendem Aufrufparameter /etc/ssl/misc/CA.pl -newreq -extra-req -extensions=v3_req sind zwei neue Dateien unter

  • /etc/ssl

entstanden, welche mit nachfolgendem Befehl aufgelistet werden können:

# ls -l /etc/ssl/new*.pem
-rw------- 1 root root 1854 Mar 27 14:01 /etc/ssl/newkey.pem
-rw-r--r-- 1 root root 1086 Mar 27 14:03 /etc/ssl/newreq.pem

:!: WICHTIG - Die so entstandene Datei /etc/ssl/newreq.pem enthält den CSR (Certificate Request).

Signieren CSR (Certificate Request)

Um den in obigen Beispiel entstandenen CSR (Certificate Request) nun mit der Certificate Authority (CA) zu unterschreiben und somit ein signiertes CRT (Certificate) zu erzeugen, kann wieder das Script, welches schon bei der Erstellung der Certificate Authority (CA) genutzt wurde und sich unter /etc/ssl/misc befindet und den Namen CA.pl trägt, mit nachfolgendem Befehl genutzt werden:

:!: WICHTIG - Das Passwort, ist das Passwort, welches im Schritt LDAP ArchLinux - Erstellen CA (Certificate Authority) verwendet wurde!

# /etc/ssl/misc/CA.pl -sign -extra-ca
# /etc/ssl/misc/CA.pl -sign -extra-ca
====
openssl ca  -policy policy_anything -out newcert.pem -extensions=v3_req -infiles newreq.pem
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            58:b7:f2:c0:f9:30:8d:48:4f:77:d3:56:3d:9d:a9:98:19:e6:a2:4a
        Validity
            Not Before: Mar 27 12:04:22 2022 GMT
            Not After : Dec 30 12:04:22 2099 GMT
        Subject:
            countryName               = DE
            stateOrProvinceName       = Bavaria (Bayern)
            localityName              = Munich (Muenchen)
            organizationName          = tachtler.net
            commonName                = ldap.idmz.tachtler.net
            emailAddress              = hostmaster@tachtler.net
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name: 
                DNS:ldap.idmz.tachtler.net, DNS:ldap.tachtler.net
Certificate is to be certified until Dec 30 12:04:22 2099 GMT (28402 days)
Sign the certificate? [y/n]:y
 
 
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
==> 0
====
Signed certificate is in newcert.pem

Durch ausführen des Skriptes mit nachfolgendem Aufrufparameter /etc/ssl/misc/CA.pl -sign -extra-ca ist eine weitere neue Dateien unter

  • /etc/ssl

entstanden, welche mit nachfolgendem Befehl aufgelistet werden kann:

# ls -l /etc/ssl/new*.pem
-rw-r--r-- 1 root root 4639 Mar 27 14:04 /etc/ssl/newcert.pem
-rw------- 1 root root 1854 Mar 27 14:01 /etc/ssl/newkey.pem
-rw-r--r-- 1 root root 1086 Mar 27 14:03 /etc/ssl/newreq.pem

:!: WICHTIG - Die so entstandene Datei /etc/ssl/newcert.pem enthält das neue signierte CRT (Certificate)!

Entfernen des Passwortes vom private key

Ein Problem ist durch die Erstellung der einzelnen Komponenten, wie in den drei vorhergehenden Schritten beschrieben worden noch offen.

:!: WICHTIG - Der private key (privaten Schlüssel) ist mit einer Passphrase gesichert !

Um dieses Problem zu lösen und das Passwort aus dem private key (privaten Schlüssel) zu entfernen, kann folgender Aufruf von openssl genutzt werden:

:!: WICHTIG - Das Passwort, ist das Passwort, welches im Schritt LDAP ArchLinux - Erstellen CA (Certificate Authority) verwendet wurde!

# openssl rsa < /etc/ssl/newkey.pem > /etc/ssl/key.pem
Enter pass phrase: 
writing RSA key

Durch ausführen des oben genannten Befehls ist eine weitere neue Dateien unter

  • /etc/ssl

entstanden, welche mit nachfolgendem Befehl aufgelistet werden kann:

# ls -l /etc/ssl/*key*
-rw-r--r-- 1 root root 1679 Mar 27 13:16 /etc/ssl/key.pem
-rw------- 1 root root 1854 Mar 27 13:12 /etc/ssl/newkey.pem

:!: WICHTIG - Die so entstandene Datei /etc/ssl/key.pem enthält den private key (privaten Schlüssel) OHNE Passphrase!

Installation Zertifikat

Nach dem ein Zertifikat wie hier: LDAP ArchLinux - TLS-Zertifikat erstellen beschrieben erstellt wurde, müssen die benötigen Komponenten noch an die entsprechenden Stellen im Betriebssystem kopiert werden. Dazu sind nachfolgende Befehle notwendig.

Bevor mit der abschliessenden Konfiguration von OpenLDAP zur Nutzung von LDAPS begonnen werden kann, sind die in den vorhergehenden Schritten erstellten Dateien:

  • /etc/ssl/key.pem
  • /etc/ssl/newcert.pem
  • /etc/ssl/cacert.pem

noch zu kopieren und ggf. umzubenennen und die Besitz- und Dateirechte der entsprechend Dateien noch anzupassen!

Als erstes werden mit den nachfolgenden Befehlen zwei neue Verzeichnisse im bestehen Verzeichnis /etc/openldap angelegt:

# mkdir -p /etc/openldap/ssl/{certs,private}

Anschliessend werden mit den nachfolgenden Befehlen die entsprechenden Dateien an den jeweiligen Bestimmungsort kopiert und ggf. umbenannt:

# cp -a /etc/ssl/key.pem /etc/openldap/ssl/private/ldap.idmz.tachtler.net.key
# cp -a /etc/ssl/newcert.pem /etc/openldap/ssl/certs/ldap.idmz.tachtler.net.pem
# cp -a /etc/ssl/cacert.pem /etc/openldap/ssl/certs/CAcert.pem

Die Besitz- und Dateirechte der soeben kopieren und ggf. umbenannten Dateien

  • /etc/openldap/ssl/private/ldap.idmz.tachtler.net.key
  • /etc/openldap/ssl/certs/ldap.idmz.tachtler.net.pem
  • /etc/openldap/ssl/certs/CAcert.pem

können mit folgenden Befehlen die Besitzrechte wie folgt korrigiert werden:

# chown ldap:ldap /etc/openldap/ssl/private/ldap.idmz.tachtler.net.key
# chown ldap:ldap /etc/openldap/ssl/certs/ldap.idmz.tachtler.net.pem
# chown ldap:ldap /etc/openldap/ssl/certs/CAcert.pem

und mit folgenden Befehlen die Dateirechte:

# chmod 400 /etc/openldap/ssl/private/ldap.idmz.tachtler.net.key
# chmod 444 /etc/openldap/ssl/certs/ldap.idmz.tachtler.net.pem
# chmod 444 /etc/openldap/ssl/certs/CAcert.pem

Durch Ausführen der oben genannten Befehle sieht der Inhalt des Verzeichnisses

  • /etc/openldap/ssl

wie folgt aus, welches mit nachfolgendem Befehl aufgelistet werden kann:

# ls -l /etc/openldap/ssl/*
/etc/openldap/ssl/certs:
total 16
-r--r--r-- 1 ldap ldap 4611 Mar 24 11:59 CAcert.pem
-r--r--r-- 1 ldap ldap 4810 Mar 24 11:59 ldap.idmz.tachtler.net.pem

/etc/openldap/ssl/private:
total 4
-r-------- 1 ldap ldap 1675 Mar 24 11:59 ldap.idmz.tachtler.net.key

Erweiterte-Konfiguration

/etc/openldap/ldif.d

Zur Konfiguration des OpenLDAP-Servers, sollen LDIF Dateien zum Einsatz kommen, welche im Verzeichnis

  • /etc/openldap/ldif.d

erstellt und abgelegt werden sollen.

Bevor also mit den erweiterten Konfiguration begonnen werden kann, soll hier ein Verzeichnis, wie nachfolgend dargestellt, mit nachfolgendem Befehl angelegt werden, welches die einzelnen LDIF Dateien aufnehmen soll, die zur erweiterten Konfiguration erstellt werden sollen: Neuanlage des Verzeichnisses: /etc/openldap/ldif.d

# mkdir /etc/openldap/ldif.d

Setzen der entsprechenden Besitzrechte:

# chown ldap:ldap /etc/openldap/ldif.d

Setzen der entsprechenden Dateirechte:

# chmod 700 /etc/openldap/ldif.d

Des weiteren ist die Kenntnis des Passwortes, welches im vorher durchgeführten Schritt der Einrichtung des OpenLDAP-Servers unter

erstellt wurde und als olcRootPW - cn=config im OpenLDAP-Server hinterlegt wurde, erforderlich.

LDAPS-Konfiguration

Um den LDAP-Server OpenLDAP auch via LDAPS erreichbar zu machen sind nachfolgende Schritte notwendig. Es soll hier ein Self-Signed-Certificate zum Einsatz kommen, da dies für den eigenen Gebrauch am kostengünstigsten um vom Aufwand her, auch am realistischen durchzuführen ist.

Wie die benötigten Komponenten erstellt werden können, kann unter nachfolgendem internen Link:

nachgelesen werden.

LDAPS Konfiguration: /etc/openldap/ldap.conf

Folgende Anpassungen der Konfigurationsdatei /etc/openldap/ldap.conf müssen erfolgen, um grundsätzlich einen LDAPS-Server mit einem Self-Signed-Certificate zu betreiben:

#
# LDAP Defaults
#
 
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
 
# Tachtler
# default: #BASE    dc=example,dc=com
BASE    dc=tachtler,dc=net
# Tachtler
# default: #URI     ldap://ldap.example.com ldap://ldap-provider.example.com:666
URI     ldap://ldap.idmz.tachtler.net
 
#SIZELIMIT  12
#TIMELIMIT  15
#DEREF      never
 
# Tachtler - NEW -
TLS_CACERTDIR   /etc/openldap/ssl/certs
# Tachtler - NEW -
TLS_REQCERT     allow

Erklärungen:

  • TLS_CACERTDIR   /etc/openldap/ssl/certs

Bekanntgabe des Verzeichnisses gegenüber dem OpenLDAP-Server, in dem die Zertifikate hinterlegt werden.

  • TLS_REQCERT     allow

Ignoriert das Scheitern der Überprüfung des Server-Zertifikats durch den OpenLDAP-Server und ermöglicht so auch den Einsatz eines „Self-Signed“-Zertifikats.

LDAPS Konfiguration: /etc/conf.d/slapd

Nachfolgende Konfigurationsdatei /etc/conf.d/slapd muss neu erstellt werden, und mit nachfolgendem Inhalt gefüllt werden, um grundsätzlich einen LDAPS-Server zu betreiben:

SLAPD_URLS="ldap:/// ldapi:/// ldaps:///"

Damit wird das zusätzliche Lauschen des OpenLDAP-Servers bzw. slapd-Daemons/Dienstes via ldaps: auf Port 636 realisiert!

Hintergrund:

Die systemd-Start-Konfigurationsdatei des OpenLDAP-Servers sieht wie folgt aus und ermöglicht so das einbinden der Konfigurationsdatei /etc/conf.d/slapd:

# cat /usr/lib/systemd/system/slapd.service 
[Unit]
Description=OpenLDAP Server Daemon
After=syslog.target network-online.target
Documentation=man:slapd
Documentation=man:slapd-config
Documentation=man:slapd-mdb
 
[Service]
Type=notify
Environment="SLAPD_URLS=ldap:/// ldapi:///" "SLAPD_OPTIONS="
EnvironmentFile=-/etc/conf.d/slapd
ExecStart=/usr/lib/slapd -d 0 -u ldap -g ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS
 
[Install]
WantedBy=multi-user.target

LDAPS Konfiguration: /etc/openldap/ldif.d/config_TLS.ldif

Um den OpenLDAP-Server bzw. den slapd-Daemon/Dienst via LDAPS erreichbar zu machen sind nachfolgende Ergänzungen in der Konfigurationsdatei

  • /etc/openldap/ldif.d/config_TLS.ldif

notwendig.

:!: WICHTIG - Es sollten KEINE Änderungen durch manuelle Ergänzungen durchgeführt werden !!!

Nachfolgende Parameter sollen dabei gesetzt werden :

  • olcTLSCipherSuite: - Angabe der Verschlüsselungsstärke bzw. der Verschlüsselungsmechanismen
  • olcTLSCACertificatePath: - Angabe des Verzeichnisses in dem die Zertifikate sich befinden
  • olcTLSCertificateFile: - Die Zertifikatsdatei
  • olcTLSCertificateKeyFile: - Der zum Zertifikat gehörende private Schlüssel
  • olcTLSCACertificateFile: - Das ROOT-Zertifikat aus der eigenen Certificate Authority (CA)
  • olcTLSProtocolMin - Angabe der zu verwendenden Verschlüsselungsmechanismen

Mit nachfolgendem Befehl soll nun eine LDIF-Datei in nachfolgendem Verzeichnis, mit nachfolgendem Namen und nachfolgendem Inhalt erstellt werden.

LDIF-Datei Verwendungszweck
/etc/openldap/ldif.d/config_TLS.ldif Einführung TLS/STARTTLS-Nutzung via ldaps:
# vim /etc/openldap/ldif.d/config_TLS.ldif

Die LDIF-Datei /etc/openldap/ldif.d/config_TLS.ldif soll nachfolgenden Inhalt bekommen:

dn: cn=config
changetype: modify
add: olcTLSCipherSuite
olcTLSCipherSuite: HIGH
-
add: olcTLSCACertificatePath
olcTLSCACertificatePath: /etc/openldap/ssl/certs
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/ssl/certs/ldap.idmz.tachtler.net.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/ssl/private/ldap.idmz.tachtler.net.key
-
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/ssl/certs/CAcert.pem
-
add: olcTLSProtocolMin
olcTLSProtocolMin: 3.1

:!: HINWEIS - olcTLSProtocolMin: 3.1 - Aufgrund einer Lücke in der TLS/STARTTLS SSLv3 auch besser unter „Poodle“ bekannt, sollte die Auswahl der zur Verwendung angebotenen Verschlüsselungsmechanismen wie folgt eingeschränkt werden.

Siehe auch nachfolgenden externen Link:

Abschliessend wird mit nachfolgendem Befehl der Inhalt der LDIF Datei im laufendem Betrieb des OpenLDAP-Servers der Konfiguration des OpenLDAP-Servers hinzugefügt:

# ldapmodify -H ldapi:/// -W -x -D cn=config -f /etc/openldap/ldif.d/config_TLS.ldif
Enter LDAP Password: 
modifying entry "cn=config"

Um überprüfen zu können, ob alle Änderungen erfolgreich durchgeführt wurden, kann nachfolgender Befehl genutzt werden und sollte eine Ausgabe wie nachfolgende zur Anzeige bringen:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b cn=config "(objectclass=olcGlobal)"
# ldapsearch -H ldapi:/// -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: /run/openldap/slapd.args
olcIdleTimeout: 15
olcPidFile: /run/openldap/slapd.pid
olcReferral: ldap://ldap.idmz.tachtler.net
olcTLSCACertificateFile: /etc/openldap/ssl/certs/CAcert.pem
olcTLSCACertificatePath: /etc/openldap/ssl/certs
olcTLSCertificateFile: /etc/openldap/ssl/certs/ldap.idmz.tachtler.net.pem
olcTLSCertificateKeyFile: /etc/openldap/ssl/private/ldap.idmz.tachtler.net.key
olcTLSCipherSuite: HIGH
olcTLSProtocolMin: 3.1
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

:!: WICHTIG - Ein Neustart des OpenLDAP-Servers ist aufgrund der Änderungen in weiteren Konfigurationsdateien

  • (/etc/openldap/ldap.conf
  • /etc/conf.d/slapd)

trotzdem notwendig!!!

Der Neustart des OpenLDAP-Server bzw. den slapd-Daemon/Dienstes, wird mit nachfolgendem Befehl durchgeführt:

# systemctl restart slapd.service

:!: HINWEIS - Es erfolgen keine weiteren Ausgaben, wenn der Start erfolgreich war !

Ob der OpenLDAP-Server, sprich der slapd-Dienst/Daemon auch tatsächlich als Hintergrundprozess läuft, kann mit nachfolgendem Befehl überprüft werden (Es sollte eine Ausgabe wie nachfolgend dargestellt erfolgen - es kommt auf die zweite Zeile an!):

# ps auxwf | grep slapd
root        5781  0.0  0.1   6992  2736 pts/0    S+   07:43   0:00                      \_ grep slapd
ldap        5774  0.0  0.7 1086884 15376 ?       Ssl  07:42   0:00 /usr/lib/slapd -d 0 -u ldap -g ldap -h ldap:/// ldapi:/// ldaps:///

und nachfolgender Befehl:

# ss -tulpen | grep slapd
tcp   LISTEN 0      2048                  0.0.0.0:636       0.0.0.0:*    users:(("slapd",pid=5774,fd=10)) ino:59205 sk:4 cgroup:/system.slice/slapd.service <->           
tcp   LISTEN 0      2048                  0.0.0.0:389       0.0.0.0:*    users:(("slapd",pid=5774,fd=7)) ino:59200 sk:5 cgroup:/system.slice/slapd.service <->            
tcp   LISTEN 0      2048                     [::]:636          [::]:*    users:(("slapd",pid=5774,fd=11)) ino:59206 sk:8 cgroup:/system.slice/slapd.service v6only:1 <->  
tcp   LISTEN 0      2048                     [::]:389          [::]:*    users:(("slapd",pid=5774,fd=8)) ino:59201 sk:9 cgroup:/system.slice/slapd.service v6only:1 <->

bzw. nachfolgender Befehl:

# systemctl status slapd.service
● slapd.service - OpenLDAP Server Daemon
     Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor pre>
     Active: active (running) since Fri 2022-03-25 07:42:11 CET; 2min 0s ago
       Docs: man:slapd
             man:slapd-config
             man:slapd-mdb
   Main PID: 5774 (slapd)
      Tasks: 2 (limit: 2340)
     Memory: 3.5M
        CPU: 13ms
     CGroup: /system.slice/slapd.service
             └─5774 /usr/lib/slapd -d 0 -u ldap -g ldap -h "ldap:/// ldapi:/// ldaps:///"

Mar 25 07:42:11 server systemd[1]: Starting OpenLDAP Server Daemon...
Mar 25 07:42:11 server slapd[5774]: @(#) $OpenLDAP: slapd 2.6.1 (Jan 20 2022 19:59:58) $
                                            openldap
Mar 25 07:42:11 server slapd[5774]: slapd starting
Mar 25 07:42:11 server systemd[1]: Started OpenLDAP Server Daemon.

LDAPS-Konfiguration: /etc/ca-certificates/trust-source

Um das Zertifikat

  • /etc/openldap/ssl/certs/CAcert.pem

auch im Betriebssystem zu hinterlegen, sind nachfolgende Tätigkeiten erforderlich.

Variante 1 (bevorzugt):

Dies kann mit nachfolgendem Befehl durchgeführt werden, ohne eine Kopie des Zertifikats unter /etc/ca-certificates/trust-source/anchors hinterlegen zu müssen:

# trust anchor --store /etc/openldap/ssl/certs/CAcert.pem

:!: HINWEIS - Es erfolgen keine weiteren Ausgaben, wenn der Import erfolgreich war !

:!: ACHTUNG - Variante 2 (nur wenn Variante 1 nicht funktionieren sollte):

Im Verzeichnis

  • /etc/ca-certificates/trust-source/anchors

können Zertifikate im Format PEM hinterlegt werden und anschliessend dem Verzeichnis

  • /etc/ca-certificates/trust-source

manuell mit nachfolgendem Befehl hinzugefügt werden:

# cp -a /etc/openldap/ssl/certs/CAcert.pem /etc/ca-certificates/trust-source/anchors

Anschliessend kann mit nachfolgendem Befehl die Umwandlung bzw. der Import durchgeführt werden:

# update-ca-trust

Eine Überprüfung, des Zertifikat aus der Datei

  • /etc/ca-certificates/trust-source/www.tachtler.net.p11-kit

kann mit nachfolgendem Befehl durchgeführt werden:

# cat /etc/ca-certificates/trust-source/www.tachtler.net.p11-kit
# cat /etc/ca-certificates/trust-source/www.tachtler.net.p11-kit
# This file has been auto-generated and written by p11-kit. Changes will be
# unceremoniously overwritten.
#
# The format is designed to be somewhat human readable and debuggable, and a
# bit transparent but it is not encouraged to read/write this format from other
# applications or tools without first discussing this at the the mailing list:
#
#       p11-glue@lists.freedesktop.org
#
[p11-kit-object-v1]
trusted: true
x-distrusted: false
private: false
modifiable: false
label: "www.tachtler.net"
url: ""
hash-of-issuer-public-key: ""
hash-of-subject-public-key: "2y%F7Sgd%26%84k%B4%A1%BA%00%C3%0AEo%0E%1A%AD"
java-midp-security-domain: 0
check-value: "u%BA%AB"
start-date: "20220324"
end-date: "20991231"
id: "0%21k%DF%A8%D2%04%AA5v%05%AF%BC%9F%CE%1FB%94%8F%CD"
subject: "0%81%821%0B0%09%06%03U%04%06%13%02DE1%190%17%06%03U%04%08%0C%10Bavaria %28Bayern%291%150%13%06%03U%04%0A%0C%0Ctachtler.net1%190%17%06%03U%04%03%0C%10www.tachtler.net1%260%24%06%09%2A%86H%86%F7%0D%01%09%01%16%17hostmaster%40tachtler.net"
issuer: "0%81%821%0B0%09%06%03U%04%06%13%02DE1%190%17%06%03U%04%08%0C%10Bavaria %28Bayern%291%150%13%06%03U%04%0A%0C%0Ctachtler.net1%190%17%06%03U%04%03%0C%10www.tachtler.net1%260%24%06%09%2A%86H%86%F7%0D%01%09%01%16%17hostmaster%40tachtler.net"
serial-number: "%02%14H%18%E8F%18z%8Du%D5M%9D%924x%EE%F9%C8%27%E3%B0"
certificate-category: authority
-----BEGIN CERTIFICATE-----
MIID6TCCAtGgAwIBAgIUSBjoRhh6jXXVTZ2SNHju+cgn47AwDQYJKoZIhvcNAQEL
BQAwgYIxCzAJBgNVBAYTAkRFMRkwFwYDVQQIDBBCYXZhcmlhIChCYXllcm4pMRUw
EwYDVQQKDAx0YWNodGxlci5uZXQxGTAXBgNVBAMMEHd3dy50YWNodGxlci5uZXQx
JjAkBgkqhkiG9w0BCQEWF2hvc3RtYXN0ZXJAdGFjaHRsZXIubmV0MCAXDTIyMDMy
NDA5MjkzM1oYDzIwOTkxMjMxMDkyOTMzWjCBgjELMAkGA1UEBhMCREUxGTAXBgNV
BAgMEEJhdmFyaWEgKEJheWVybikxFTATBgNVBAoMDHRhY2h0bGVyLm5ldDEZMBcG
A1UEAwwQd3d3LnRhY2h0bGVyLm5ldDEmMCQGCSqGSIb3DQEJARYXaG9zdG1hc3Rl
ckB0YWNodGxlci5uZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDM
LejTRxNRgjvxENhNYFc95HFnRBtOWbFIYSBSZLodz7yIPavv+9qbby78KwX64wzD
IA1cWfk5O+cV3/ODMKC0qXWYJ2dPMc2QmsIbhtjBRaseMWnFW9Y7hRQSyrjKVni/
MZvzEnyUKUoQUJXaLqYHCYooNsLBP6VNW4Ue9jgJ1qdEZLGYq4rdIHxPkrXbNdlK
KpBFWYhEbxRJo9VsaLS+knlxhDzijceK/JQH22P3zFcmkO2VAZfCF/nOMiIscF29
B9xgCcNLaVdQVZpUEt0a641G43hDnvmk7K2lVaoH+r3DvuwFR2gjSv208lr0VqEF
BI/XsOHP6dEpBZu+v8G7AgMBAAGjUzBRMB0GA1UdDgQWBBQwIWvfqNIEqjV2Ba+8
n84fQpSPzTAfBgNVHSMEGDAWgBQwIWvfqNIEqjV2Ba+8n84fQpSPzTAPBgNVHRMB
Af8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAzmIoD/hky8VHq/wJhnxyPS3ma
WSlZ7KanyaalCrb0sV+SWry5nX3I71dQZ2FUN3JMHxdbKtRkTrKPBhkJi3kBMjfK
9wocW5BD4DweCikRaFyVveGUWNXymFT9sP+jnIersa69V9dlRH9ScHCMFFZ7owy3
zLxq9fzZheXuXx4DHt+xhoY2wH9jz9lkZZbPt9T3sdTcMFWss5wjPG7yFU3KUPJa
isd8nxkV6c7wiQFWc2HEi8IEdQl/QU2HAi39MpiKhJ77uv0a5tcSoEwVmVyjV0xm
RibvnAF5JazqpKX8YE0jkdW9LuAH6G8FWbq9Db4P+4WRtsaNZfhNMO4kKynO
-----END CERTIFICATE-----

:!: HINWEIS - Das Zertifikat sollte nun auch in nachfolgendem Verzeichnis zu finden sein:

  • /etc/ca-certificates/extracted/cadir

Überprüfung LDAPS

Das verwendete Self-Signed-Certificate, kann mit nachfolgendem Befehl überprüft werden:

# openssl s_client -connect ldap.idmz.tachtler.net:636 -showcerts -state
CONNECTED(00000003)
SSL_connect:before SSL initialization
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS read server hello
SSL_connect:TLSv1.3 read encrypted extensions
depth=1 C = DE, ST = Bavaria (Bayern), O = tachtler.net, CN = www.tachtler.net, emailAddress = hostmaster@tachtler.net
verify return:1
depth=0 C = DE, ST = Bavaria (Bayern), L = Munich (Muenchen), O = tachtler.net, CN = ldap.idmz.tachtler.net, emailAddress = hostmaster@tachtler.net
verify return:1
SSL_connect:SSLv3/TLS read server certificate
SSL_connect:TLSv1.3 read server certificate verify
SSL_connect:SSLv3/TLS read finished
SSL_connect:SSLv3/TLS write change cipher spec
SSL_connect:SSLv3/TLS write finished
---
Certificate chain
 0 s:C = DE, ST = Bavaria (Bayern), L = Munich (Muenchen), O = tachtler.net, CN = ldap.idmz.tachtler.net, emailAddress = hostmaster@tachtler.net
   i:C = DE, ST = Bavaria (Bayern), O = tachtler.net, CN = www.tachtler.net, emailAddress = hostmaster@tachtler.net
-----BEGIN CERTIFICATE-----
MIIEMzCCAxugAwIBAgIUSBjoRhh6jXXVTZ2SNHju+cgn47EwDQYJKoZIhvcNAQEL
BQAwgYIxCzAJBgNVBAYTAkRFMRkwFwYDVQQIDBBCYXZhcmlhIChCYXllcm4pMRUw
EwYDVQQKDAx0YWNodGxlci5uZXQxGTAXBgNVBAMMEHd3dy50YWNodGxlci5uZXQx
JjAkBgkqhkiG9w0BCQEWF2hvc3RtYXN0ZXJAdGFjaHRsZXIubmV0MCAXDTIyMDMy
NDEwMDEwOVoYDzIwOTkxMjMwMTAwMTA5WjCBpDELMAkGA1UEBhMCREUxGTAXBgNV
BAgMEEJhdmFyaWEgKEJheWVybikxGjAYBgNVBAcMEU11bmljaCAoTXVlbmNoZW4p
MRUwEwYDVQQKDAx0YWNodGxlci5uZXQxHzAdBgNVBAMMFmxkYXAuaWRtei50YWNo
dGxlci5uZXQxJjAkBgkqhkiG9w0BCQEWF2hvc3RtYXN0ZXJAdGFjaHRsZXIubmV0
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAurS56stlwL2mxL7fAsTN
s6ckIAO2Eq73KRVB+MQumgImGoVjuzcVNYM9B7XzQLruGsrz7n5dsb5DmY4GzB5z
hA5H5oMrYIYCvZ2C5+hUI825EhxFhoHOYF0W8EjKGl58x0hlmb9YlGGwPVXGjoxO
tvH4EUU1rIg3Z9cbNfwe9n/i+zMXCOFuxc8XyOOS59CDmGDlVQ5vam1cfdzPd0YM
nbjSl2hECuZNekok287LUwyIThykdTzvyU5/C7RctHr2rmNUJjjdpvd9P64lUUyl
fd8mZjI/Up2Lac7btsKAHO7TzBqd1RXu0q2ZL4xiuq7Mp8dGrOtzKKL5WJi6owgc
RQIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdl
bmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUHmij0HemQm/zNcI3rKS56Idk
m7YwHwYDVR0jBBgwFoAUMCFr36jSBKo1dgWvvJ/OH0KUj80wDQYJKoZIhvcNAQEL
BQADggEBAI3ixPmDiW33dYB4bIsv15ZNpztMVbKIrJcInUmcch8eBjgjaLZrMywB
qXolPcPzFBX9SnVz1TZo28TAp5TTR7E+RiQsoOnVNu6k1/bAo3Y3tbHUNSrmVWWg
niSppDIdIzjBAUYi0tHH+heGLJx8yFUCv0akRaXN+MT+Bd3KV0FtgDVsR0Ny+63H
EUNDc5xfRTLXMnUAseJY5qotofXGLewmMPFM5UZZlrR2nCW/DwhcYGKgVUoy5Z23
RKLFLebOGDaP5L6kCVBCMZKTDA8w5WcidCYCgDY2KqN4+ciI8diz/jrjU4IErzaP
1cc1p57c24/l/SLbW+TtyVxrQE19iUk=
-----END CERTIFICATE-----
 1 s:C = DE, ST = Bavaria (Bayern), O = tachtler.net, CN = www.tachtler.net, emailAddress = hostmaster@tachtler.net
   i:C = DE, ST = Bavaria (Bayern), O = tachtler.net, CN = www.tachtler.net, emailAddress = hostmaster@tachtler.net
-----BEGIN CERTIFICATE-----
MIID6TCCAtGgAwIBAgIUSBjoRhh6jXXVTZ2SNHju+cgn47AwDQYJKoZIhvcNAQEL
BQAwgYIxCzAJBgNVBAYTAkRFMRkwFwYDVQQIDBBCYXZhcmlhIChCYXllcm4pMRUw
EwYDVQQKDAx0YWNodGxlci5uZXQxGTAXBgNVBAMMEHd3dy50YWNodGxlci5uZXQx
JjAkBgkqhkiG9w0BCQEWF2hvc3RtYXN0ZXJAdGFjaHRsZXIubmV0MCAXDTIyMDMy
NDA5MjkzM1oYDzIwOTkxMjMxMDkyOTMzWjCBgjELMAkGA1UEBhMCREUxGTAXBgNV
BAgMEEJhdmFyaWEgKEJheWVybikxFTATBgNVBAoMDHRhY2h0bGVyLm5ldDEZMBcG
A1UEAwwQd3d3LnRhY2h0bGVyLm5ldDEmMCQGCSqGSIb3DQEJARYXaG9zdG1hc3Rl
ckB0YWNodGxlci5uZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDM
LejTRxNRgjvxENhNYFc95HFnRBtOWbFIYSBSZLodz7yIPavv+9qbby78KwX64wzD
IA1cWfk5O+cV3/ODMKC0qXWYJ2dPMc2QmsIbhtjBRaseMWnFW9Y7hRQSyrjKVni/
MZvzEnyUKUoQUJXaLqYHCYooNsLBP6VNW4Ue9jgJ1qdEZLGYq4rdIHxPkrXbNdlK
KpBFWYhEbxRJo9VsaLS+knlxhDzijceK/JQH22P3zFcmkO2VAZfCF/nOMiIscF29
B9xgCcNLaVdQVZpUEt0a641G43hDnvmk7K2lVaoH+r3DvuwFR2gjSv208lr0VqEF
BI/XsOHP6dEpBZu+v8G7AgMBAAGjUzBRMB0GA1UdDgQWBBQwIWvfqNIEqjV2Ba+8
n84fQpSPzTAfBgNVHSMEGDAWgBQwIWvfqNIEqjV2Ba+8n84fQpSPzTAPBgNVHRMB
Af8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAzmIoD/hky8VHq/wJhnxyPS3ma
WSlZ7KanyaalCrb0sV+SWry5nX3I71dQZ2FUN3JMHxdbKtRkTrKPBhkJi3kBMjfK
9wocW5BD4DweCikRaFyVveGUWNXymFT9sP+jnIersa69V9dlRH9ScHCMFFZ7owy3
zLxq9fzZheXuXx4DHt+xhoY2wH9jz9lkZZbPt9T3sdTcMFWss5wjPG7yFU3KUPJa
isd8nxkV6c7wiQFWc2HEi8IEdQl/QU2HAi39MpiKhJ77uv0a5tcSoEwVmVyjV0xm
RibvnAF5JazqpKX8YE0jkdW9LuAH6G8FWbq9Db4P+4WRtsaNZfhNMO4kKynO
-----END CERTIFICATE-----
---
Server certificate
subject=C = DE, ST = Bavaria (Bayern), L = Munich (Muenchen), O = tachtler.net, CN = ldap.idmz.tachtler.net, emailAddress = hostmaster@tachtler.net

issuer=C = DE, ST = Bavaria (Bayern), O = tachtler.net, CN = www.tachtler.net, emailAddress = hostmaster@tachtler.net

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 2645 bytes and written 404 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
SSL_connect:SSL negotiation finished successfully
SSL_connect:SSL negotiation finished successfully
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: 3531135C8718EF73028D4B5627D31C15CA5FA45B68B75DEA5763B4DFEA400B86
    Session-ID-ctx: 
    Resumption PSK: A7EFCA71C161981779B50339F3BE6417C4DEB7F7B08C52B09C21F7F690D3C01090024B163A7D9685D0B8231686CC61FE
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - c0 8a 99 8e 37 f9 d1 3e-83 ee 7c 40 23 31 c5 dd   ....7..>..|@#1..
    0010 - dd 4f ed 5b cb a4 25 d4-e3 56 dd 55 4b 3e 84 c2   .O.[..%..V.UK>..
    0020 - f3 51 58 23 d4 36 93 f7-e6 25 92 f9 2b db a1 c8   .QX#.6...%..+...
    0030 - 27 05 cf 02 90 55 4c c5-b9 0e c5 cb 88 da f3 c6   '....UL.........
    0040 - 6a df d6 68 6d a4 a3 24-17 94 e7 ea 94 9c 5b 12   j..hm..$......[.
    0050 - d8 94 b1 40 62 03 2f 76-33 ad d1 13 8c 25 c3 8b   ...@b./v3....%..
    0060 - 73 25 cc f4 74 4e 7b 43-1f f7 e7 80 e3 71 84 c6   s%..tN{C.....q..
    0070 - 75 99 c1 0b 4f 60 2b f2-70 e8 05 6d 15 8f 48 51   u...O`+.p..m..HQ
    0080 - 82 57 a3 47 4a c8 07 ec-de d4 18 2f df c4 36 78   .W.GJ....../..6x
    0090 - ab fb 84 35 97 6c 8c 71-4f 7e fc e8 85 f8 c6 d2   ...5.l.qO~......
    00a0 - 88 60 67 32 14 bc 42 0d-4e ad f3 b1 0b 23 7c 29   .`g2..B.N....#|)
    00b0 - aa f6 d0 c2 2d 79 c5 ee-91 de ee c5 13 ab 3b 59   ....-y........;Y
    00c0 - bf 79 c5 c8 6d 34 a2 cb-67 b2 75 b6 ec de bc 78   .y..m4..g.u....x

    Start Time: 1648192267
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
SSL_connect:SSLv3/TLS read server session ticket
read R BLOCK
SSL_connect:SSL negotiation finished successfully
SSL_connect:SSL negotiation finished successfully
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: 8CF3A6C729142CC18D9281A7FD366C8688A29CA58F04327787F33B1FFBA76979
    Session-ID-ctx: 
    Resumption PSK: F6965DDC03BECFDC5534DACFA49F091D04CDA494275CDB0D32C5FF171492137D6F0B5714C61133F1D07B63A0BA7A7CC5
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - c0 8a 99 8e 37 f9 d1 3e-83 ee 7c 40 23 31 c5 dd   ....7..>..|@#1..
    0010 - 5b 4d 91 1e 39 38 3f c7-cc 74 cb 85 cb 28 f9 c5   [M..98?..t...(..
    0020 - e6 bb 5e e8 42 49 c2 0f-f7 80 b4 06 26 f8 15 c8   ..^.BI......&...
    0030 - de 2f f0 db 6d 05 97 de-b5 c4 7e af 11 e4 d4 fd   ./..m.....~.....
    0040 - 0a 12 18 a6 e0 9d 50 04-73 a8 68 08 db cb 55 60   ......P.s.h...U`
    0050 - cb ba 24 e0 d7 e4 9e e2-4a 4f 99 58 b4 78 04 f9   ..$.....JO.X.x..
    0060 - b9 c7 b9 d2 1e c1 1a d0-b8 f6 1b 8f bd 4f 1f 65   .............O.e
    0070 - b1 43 5d 1d 11 9a fc 7e-79 12 9e ad 39 c9 26 d8   .C]....~y...9.&.
    0080 - 04 75 f0 96 21 22 ec 6c-bd d4 c9 9d 9b df 0b 9b   .u..!".l........
    0090 - e4 3c 70 8f 1e 90 66 ce-46 7d 89 e2 83 79 a0 78   .<p...f.F}...y.x
    00a0 - 02 fe 15 a0 27 02 26 36-b8 d0 d9 5e a9 d5 c7 6b   ....'.&6...^...k
    00b0 - e8 a0 23 87 b1 64 58 6b-0b 0f 48 43 7a 56 1c 66   ..#..dXk..HCzV.f
    00c0 - 5a 93 63 eb cf 5e 27 19-9b af 5b dd c0 22 19 c9   Z.c..^'...[.."..

    Start Time: 1648192267
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
SSL_connect:SSLv3/TLS read server session ticket
read R BLOCK
^C

:!: HINWEIS - Die Ausgabe kann durch drücken der Tastenkombination [Strg/Ctrl] und [c] beendet werden.

Auch in der globalen Zertifikats-Konfigurationsdatei

  • /etc/ca-certificates/extracted/ca-bundle.trust.crt

sollte das Zertifikat nun enthalten sein, was mit nachfolgendem Befehl überprüft werden kann:

# grep "Klaus Tachtler (CA)" /etc/ca-certificates/extracted/ca-bundle.trust.crt
# Klaus Tachtler (CA)

:!: HINWEIS - Gefunden wurde das Self-Signed-Certificate nur, wenn eine Ausgabe erfolgt!

:!: HINWEIS - Falls es Probleme bei der DNS Namensauflösung geben sollte, kann die Konfiguration unter nachfolgenden internen Link Abhilfe schaffen:

Initiale DIT erstellen: /etc/openldap/ldif.d/config_DIT.ldif

Nach der Installation und Konfiguration des OpenLDAP-Servers bzw. slapd-Daemons/Dienstes, sollte dieser mit Daten gefüllt werden. Die Daten müssen in den

  • DIT Directory Information Tree eingestellt werden.

Dies soll hier anhand einer Migration von bereits bestehenden Benutzers in den DIT Directory Information Tree veranschaulicht werden.

Mit nachfolgendem Befehl soll nun eine LDIF-Datei in nachfolgendem Verzeichnis, mit nachfolgendem Namen und nachfolgendem Inhalt erstellt werden.

LDIF-Datei Verwendungszweck
/etc/openldap/ldif.d/config_DIT.ldif Anlegen eines DIT Directory Information Tree
# vim /etc/openldap/ldif.d/config_DIT.ldif

Die LDIF-Datei /etc/openldap/ldif.d/config_DIT.ldif soll nachfolgenden Inhalt bekommen:

# tachtler.net
dn: dc=tachtler,dc=net
dc: Tachtler
ou: tachtler Dot net
objectClass: top
objectClass: dcObject
objectClass: organizationalUnit
 
# People, tachtler.net
dn: ou=People,dc=tachtler,dc=net
ou: People
objectClass: top
objectClass: organizationalUnit
 
# Group, tachtler.net
dn: ou=Group,dc=tachtler,dc=net
ou: Group
objectClass: top
objectClass: organizationalUnit

:!: HINWEIS - Es dürfen KEINE Leerzeichen zwischen den einzelnen Anweisungen in den Leerzeilen vorhanden sein!

Abschliessend wird mit nachfolgendem Befehl der Inhalt der LDIF Datei im laufendem Betrieb des OpenLDAP-Servers der Konfiguration hinzugefügt:

:!: HINWEIS - Ab hier ist das Passwort von dc=Manager,dc=tachtler,dc=net einzugeben!

# ldapadd -H ldapi:/// -W -x -D cn=Manager,dc=tachtler,dc=net -f /etc/openldap/ldif.d/config_DIT.ldif
Enter LDAP Password: 
adding new entry "dc=tachtler,dc=net"

adding new entry "ou=People,dc=tachtler,dc=net"

adding new entry "ou=Group,dc=tachtler,dc=net"

Um überprüfen zu können, ob alle Änderungen erfolgreich durchgeführt wurden, kann nachfolgender Befehl genutzt werden und sollte eine Ausgabe wie nachfolgende zur Anzeige bringen:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b "dc=tachtler,dc=net" "(objectclass=*)"
# ldapsearch -H ldapi:/// -W -x -D cn=config -b "dc=tachtler,dc=net" "(objectclass=*)"
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=tachtler,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# tachtler.net
dn: dc=tachtler,dc=net
dc: Tachtler
ou: tachtler Dot net
objectClass: top
objectClass: dcObject
objectClass: organizationalUnit
 
# People, tachtler.net
dn: ou=People,dc=tachtler,dc=net
ou: People
objectClass: top
objectClass: organizationalUnit
 
# Group, tachtler.net
dn: ou=Group,dc=tachtler,dc=net
ou: Group
objectClass: top
objectClass: organizationalUnit
 
# search result
search: 2
result: 0 Success
 
# numResponses: 4
# numEntries: 3

Benutzer anlegen

Ziel dieser Anlage von neuen Benutzern soll es sein, aus den Dateien:

  • /etc/passwd und
  • /etc/group

alle Benutzer und Gruppen herauszufiltern, welche eine Benutzer bzw. Gruppenkennung grösser/gleich der Zahl 1000 haben.

Dies sind in der Regel alle tatsächlichen Benutzer und keine technischen Benutzer wie z.B. ldap usw. Diese sollen dann in den LDAP-Directory Server überführt werden.

Installation Migrationstools

Um die aus den Dateien

  • /etc/passwd und
  • /etc/group

Benutzer herauszufiltern und in den OpenLDAP-Server bzw. slapd-Daemon/Dienst zu migrieren, können bereits dafür existierende Werkzeuge in Form des Pakets:

  • openldap-migrationtools -

enthalten installiert werden.

Nachdem das AUR-Repository von ArchLinux - AUR

erfolgreich eingebunden wurde, kann mit nachfolgendem Befehl, das AUR-Paket - openldap-migrationtools installiert werden:

# pikaur --noconfirm -S openldap-migrationtools

Installationsverlauf

Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paket openldap-migrationtools installiert wurden.

# pacman -Qil openldap-migrationtools

Installierte Dateien

Vorbereitung Migrationstools

Zur Vorbereitung ist es notwendig, dass ein mitgeliefertes Script angepasst wird. Das Script

  • /usr/share/openldap/migration/migrate_common.ph

sollte an den entsprechenden Stellen wie folgt beschrieben, angepasst werden (nur relevanter Auszug):

...
# Default DNS domain
# Tachtler
# default: $DEFAULT_MAIL_DOMAIN = "padl.com";
$DEFAULT_MAIL_DOMAIN = "tachtler.net";
 
# Default base 
# Tachtler
# default: $DEFAULT_BASE = "dc=padl,dc=com";
$DEFAULT_BASE = "dc=tachtler,dc=net";
...

Nach erfolgreicher Anpassung, kann mit dem extrahieren der beschriebenen Benutzer begonnen werden. Dazu sind die folgenden beiden Befehle notwendig.

Die Befehle extrahieren alle Benutzer mit einer Benutzerkennung grösser/gleich 1000 und einer Gruppenkennung, ebenfalls grösser/gleich 1000 in jeweils zwei separate Dateien mit den Namen:

  • /etc/openldap/ldif.d/passwd und
  • /etc/openldap/ldif.d/group

Die Befehle lauten wie folgt:

# grep ":1[0-9][0-9][0-9]\|:0:0" /etc/passwd > /etc/openldap/ldif.d/passwd

und

# grep ":1[0-9][0-9][0-9]\|:0:" /etc/group > /etc/openldap/ldif.d/group

Der Inhalt der Dateien sollte in etwa wie folgt aussehen:

# cat /etc/openldap/ldif.d/passwd
root:x:0:0::/root:/bin/bash
klaus:x:1000:1000:Klaus Tachtler:/home/klaus:/bin/bash

und

# cat /etc/openldap/ldif.d/group 
root:x:0:root
klaus:x:1000:klaus

Benutzermigration

Zur Durchführung der Migration kommen folgende Scripte (Perl) zum Einsatz, welche sich im Verzeichnis

  • /usr/share/openldap/migration/

befinden und mit den nachfolgenden Befehlen aufgerufen werden:

:!: ACHTUNG - Falls das Skript /usr/share/openldap/migration/migrate_passwd.pl eine Fehlermeldung wie nachfolgende ausgeben sollte:

Can't locate migrate_common.ph in @INC (did you run h2ph?) (@INC contains: /usr/lib/perl5/5.34/site_perl
/usr/share/perl5/site_perl /usr/lib/perl5/5.34/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5
/5.34/core_perl /usr/share/perl5/core_perl) at /usr/share/openldap/migration/migrate_passwd.pl line 40.

ist nachfolgende Anpassung im Skript erforderlich:

(Nur relevanter Ausschnitt):

# Tachtler
# default: require 'migrate_common.ph';
require '/usr/share/openldap/migration/migrate_common.ph';
# /usr/share/openldap/migration/migrate_passwd.pl /etc/openldap/ldif.d/passwd > /etc/openldap/ldif.d/passwd.ldif

und

:!: ACHTUNG - Falls das Skript /usr/share/openldap/migration/migrate_group.pl eine Fehlermeldung wie nachfolgende ausgeben sollte:

Can't locate migrate_common.ph in @INC (did you run h2ph?) (@INC contains: /usr/lib/perl5/5.34/site_perl
/usr/share/perl5/site_perl /usr/lib/perl5/5.34/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5
/5.34/core_perl /usr/share/perl5/core_perl) at /usr/share/openldap/migration/migrate_group.pl line 39.

ist nachfolgende Anpassung im Skript erforderlich:

(Nur relevanter Ausschnitt):

# Tachtler
# default: require 'migrate_common.ph';
require '/usr/share/openldap/migration/migrate_common.ph';
# /usr/share/openldap/migration/migrate_group.pl /etc/openldap/ldif.d/group > /etc/openldap/ldif.d/group.ldif

Der Inhalt der beiden Dateien kann mit nachfolgenden Befehlen zur Anzeige gebracht werden und sollte wie folgt aussehen:

# cat /etc/openldap/ldif.d/passwd.ldif
# cat /etc/openldap/ldif.d/passwd.ldif
dn: uid=root,ou=People,dc=tachtler,dc=net
uid: root
cn: root
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$6$7DasisteinGeheimnis
shadowLastChange: 19067
loginShell: /bin/bash
uidNumber: 0
gidNumber: 0
homeDirectory: /root
 
dn: uid=klaus,ou=People,dc=tachtler,dc=net
uid: klaus
cn: Klaus Tachtler
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$6$7DasisteinGeheimnis
shadowLastChange: 19067
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/klaus
gecos: Klaus Tachtler

und

# cat /etc/openldap/ldif.d/group.ldif
# cat /etc/openldap/ldif.d/group.ldif
dn: cn=root,ou=Group,dc=tachtler,dc=net
objectClass: posixGroup
objectClass: top
cn: root
userPassword: {crypt}x
gidNumber: 0
 
dn: cn=klaus,ou=Group,dc=tachtler,dc=net
objectClass: posixGroup
objectClass: top
cn: klaus
userPassword: {crypt}x
gidNumber: 1000

Anpassungen inetOrgPerson

Nachfolgende Anpassungen können erfolgen, falls weitere Attribute, wie z.B. mail gewünscht werden, dann muss die objectClass von

  • account

auf

  • inetOrgPerson

abgeändert werden und drei weitere Attribute

  • sn
  • givenName
  • mail

in der LDIF Datei

  • /etc/openldap/ldif.d/passwd.ldif

ergänzt werden:

# cat passwd.ldif 
dn: uid=root,ou=People,dc=tachtler,dc=net
uid: root
cn: root
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$6$7DasisteinGeheimnis
shadowLastChange: 19067
loginShell: /bin/bash
uidNumber: 0
gidNumber: 0
homeDirectory: /root
sn: root
givenName: root
mail: root@tachtler.net
 
dn: uid=klaus,ou=People,dc=tachtler,dc=net
uid: klaus
cn: Klaus Tachtler
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$6$7DasisteinGeheimnis
shadowLastChange: 19067
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/klaus
gecos: Klaus Tachtler
sn: Tachtler
givenName: Klaus
mail: klaus@tachtler.net
LDIF-Datei Verwendungszweck
/etc/openldap/ldif.d/group.ldif Anlegen von Gruppen im DIT Directory Information Tree
/etc/openldap/ldif.d/passwd.ldif Anlegen von Benutzern im DIT Directory Information Tree

Anschliessend wird mit nachfolgenden Befehlen der Inhalt der LDIF Dateien im laufendem Betrieb des OpenLDAP-Servers der Konfiguration hinzugefügt:

:!: HINWEIS - Ab hier ist das Passwort von dc=Manager,dc=tachtler,dc=net einzugeben!

# ldapadd -H ldapi:/// -W -x -D cn=Manager,dc=tachtler,dc=net -f /etc/openldap/ldif.d/group.ldif
Enter LDAP Password: 
adding new entry "cn=root,ou=Group,dc=tachtler,dc=net"

adding new entry "cn=klaus,ou=Group,dc=tachtler,dc=net"

und

# ldapadd -H ldapi:/// -W -x -D cn=Manager,dc=tachtler,dc=net -f /etc/openldap/ldif.d/passwd.ldif
Enter LDAP Password: 
adding new entry "uid=root,ou=People,dc=tachtler,dc=net"

adding new entry "uid=klaus,ou=People,dc=tachtler,dc=net"

Zur Überprüfung ob die Migration korrekt funktioniert hat, können nachfolgende Befehle verwendet werden, welche die nachfolgenden Ausgaben erzeugen sollte:

# ldapsearch -H ldapi:/// -x -b "ou=Group,dc=tachtler,dc=net" "(objectclass=*)"
# ldapsearch -H ldapi:/// -x -b "ou=Group,dc=tachtler,dc=net" "(objectclass=*)"
# extended LDIF
#
# LDAPv3
# base <ou=Group,dc=tachtler,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# Group, tachtler.net
dn: ou=Group,dc=tachtler,dc=net
ou: Group
objectClass: top
objectClass: organizationalUnit
 
# root, Group, tachtler.net
dn: cn=root,ou=Group,dc=tachtler,dc=net
objectClass: posixGroup
objectClass: top
cn: root
userPassword:: DasistweiterhineinGeheimnis
gidNumber: 0
 
# klaus, Group, tachtler.net
dn: cn=klaus,ou=Group,dc=tachtler,dc=net
objectClass: posixGroup
objectClass: top
cn: klaus
userPassword:: DasistweiterhineinGeheimnis
gidNumber: 1000
 
# search result
search: 2
result: 0 Success
 
# numResponses: 4
# numEntries: 3

und

# ldapsearch -H ldapi:/// -x -b "ou=People,dc=tachtler,dc=net" "(objectclass=*)"
# ldapsearch -H ldapi:/// -x -b "ou=People,dc=tachtler,dc=net" "(objectclass=*)"
# extended LDIF
#
# LDAPv3
# base <ou=People,dc=tachtler,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# People, tachtler.net
dn: ou=People,dc=tachtler,dc=net
ou: People
objectClass: top
objectClass: organizationalUnit
 
# root, People, tachtler.net
dn: uid=root,ou=People,dc=tachtler,dc=net
uid: root
cn: root
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: DasistweiterhineinGeheimnis
shadowLastChange: 19067
loginShell: /bin/bash
uidNumber: 0
gidNumber: 0
homeDirectory: /root
sn: root
givenName: root
mail: root@tachtler.net
 
# klaus, People, tachtler.net
dn: uid=klaus,ou=People,dc=tachtler,dc=net
uid: klaus
cn: Klaus Tachtler
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: DasistweiterhineinGeheimnis
shadowLastChange: 19067
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/klaus
gecos: Klaus Tachtler
sn: Tachtler
givenName: Klaus
mail: klaus@tachtler.net
 
# search result
search: 2
result: 0 Success
 
# numResponses: 4
# numEntries: 3

"Anonymous bind" deaktivieren: /etc/openldap/ldif.d/config_anonymous_bind.ldif

Um an den OpenLDAP-Server bzw. den slapd-Daemon/Dienst sollen KEINE anonymen Anfragen, sprich KEINEN „anonymous bind“ mehr zu ermöglichen, sind nachfolgende Ergänzungen in der Konfigurationsdatei

  • /etc/openldap/slapd.d/cn=config.ldif

notwendig.

:!: WICHTIG - Es sollten KEINE Änderungen durch manuelle Ergänzungen durchgeführt werden !!!

Nachfolgende Parameter sollen dabei gesetzt werden :

  • olcDisallows: bind_anon - „anonymous bind“ verbieten
  • olcRequires: authc - Authentifizierung erzwingen

Mit nachfolgendem Befehl soll nun eine LDIF-Datei in nachfolgendem Verzeichnis, mit nachfolgendem Namen und nachfolgendem Inhalt erstellt werden.

LDIF-Datei Verwendungszweck
/etc/openldap/ldif.d/config_anonymous_bind.ldif Anonymous bind verbieten
# vim /etc/openldap/ldif.d/config_anonymous_bind.ldif

Die LDIF-Datei /etc/openldap/ldif.d/config_anonymous_bind.ldif soll nachfolgenden Inhalt bekommen:

dn: cn=config
changetype: modify
add: olcDisallows
olcDisallows: bind_anon
-
add: olcRequires
olcRequires: authc

Anschliessend wird mit nachfolgendem Befehl der Inhalt der LDIF Datei im laufendem Betrieb des OpenLDAP-Servers der Konfiguration hinzugefügt:

# ldapmodify -H ldapi:/// -W -x -D cn=config -f /etc/openldap/ldif.d/config_anonymous_bind.ldif
Enter LDAP Password: 
modifying entry "cn=config"

Um überprüfen zu können, ob alle Änderungen erfolgreich durchgeführt wurden, kann nachfolgender Befehl genutzt werden und sollte eine Ausgabe wie nachfolgende zur Anzeige bringen:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b cn=config "(objectclass=olcGlobal)"
# ldapsearch -H ldapi:/// -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: /run/openldap/slapd.args
olcIdleTimeout: 15
olcPidFile: /run/openldap/slapd.pid
olcReferral: ldap://ldap.idmz.tachtler.net
olcTLSCACertificateFile: /etc/openldap/ssl/certs/CAcert.pem
olcTLSCACertificatePath: /etc/openldap/ssl/certs
olcTLSCertificateFile: /etc/openldap/ssl/certs/ldap.idmz.tachtler.net.pem
olcTLSCertificateKeyFile: /etc/openldap/ssl/private/ldap.idmz.tachtler.net.key
olcTLSCipherSuite: HIGH
olcTLSProtocolMin: 3.1
olcDisallows: bind_anon
olcRequires: authc
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

:!: WICHTIG - Die Einträge

  • olcDisallows: bind_anon
  • olcRequires: authc

ermöglichen das Deaktivieren der anonymen Anfragen „anonymous bind“.

Zur Überprüfung ob das Deaktivieren der anonymen Anfragen „anonymous bind“ korrekt funktioniert hat, kann folgender Befehl verwendet werden, welche die nachfolgende Fehlermeldung erzeugen sollte:

# ldapsearch -H ldapi:/// -x -b "dc=tachtler,dc=net" "uid=klaus"
# ldapsearch -H ldapi:/// -x -b "dc=tachtler,dc=net" "uid=klaus"
ldap_bind: Inappropriate authentication (48)
	additional info: anonymous bind disallowed

:!: HINWEIS - Hier ist das Passwort von dc=Manager,dc=tachtler,dc=net einzugeben!

Der oben genannte Befehl zur Abfrage der Daten des Benutzer klaus, muss nun so lauten:

# ldapsearch -H ldapi:/// -x -W -D "cn=Manager,dc=tachtler,dc=net" -b "dc=tachtler,dc=net" "uid=klaus"
# ldapsearch -H ldapi:/// -x -W -D "cn=Manager,dc=tachtler,dc=net" -b "dc=tachtler,dc=net" "uid=klaus"
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=tachtler,dc=net> with scope subtree
# filter: uid=klaus
# requesting: ALL
#
 
# klaus, People, tachtler.net
dn: uid=klaus,ou=People,dc=tachtler,dc=net
cn: Klaus Tachtler
gecos: Klaus Tachtler
gidNumber: 1000
homeDirectory: /home/klaus
loginShell: /bin/bash
mail: klaus@tachtler.net
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowLastChange: 16383
shadowMax: 99999
shadowMin: 0
shadowWarning: 7
sn: Tachtler
givenName: Klaus
uid: klaus
uidNumber: 1000
userPassword:: DasistundbleibtweiterhineinGeheimnis
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

Ersatzauthentifizierung erstellen: /etc/openldap/ldif.d/config_binduser.ldif

Dadurch, das KEINE anonymen Anfragen „anonymous bind“, mehr möglich sind, es trotzdem Situationen gibt, in denen auch Abfragen von z.B. einem technischen Benutzer einer Web-Anwendung gestellt werden, soll ein Benutzer der als „Ersatzauthentifizierer“ für anonyme Anfragen fungiert erstellt werden, hier z.B. könnte so ein Benutzer wie folgt heißen:

  • cn=Ersatzbenutzer,dc=tachtler,dc=net

Bevor mit der eigentlichen Erstellung des „Ersatzauthentifizierer“ für anonyme Anfragen begonnen wird, soll noch ein Passwort generiert werden, welches später für den „Ersatzauthentifizierer“ für anonyme Anfragen gelten soll. Dies kann mit nachfolgendem Befehl erstellt werden:

# /usr/sbin/slappasswd -h {SSHA}
New password: 
Re-enter new password: 
{SSHA}MxGd86hN+e5Gmp8rDI4KP8N+czImiQKh

Mit nachfolgendem Befehl soll nun eine LDIF Datei in nachfolgendem Verzeichnis, mit nachfolgendem Namen und nachfolgendem Inhalt erstellt werden.

LDIF-Datei Verwendungszweck
/etc/openldap/ldif.d/config_binduser.ldif Erstellen eines Benutzers, als Ersatzauthentifizierer
# vim /etc/openldap/ldif.d/config_binduser.ldif

Die LDIF-Datei /etc/openldap/ldif.d/config_binduser.ldif soll nachfolgenden Inhalt bekommen:

dn: cn=Ersatzbenutzer,dc=tachtler,dc=net
cn: Ersatzbenutzer
objectClass: top
objectClass: organizationalRole
objectClass: simpleSecurityObject
userPassword: {SSHA}MxGd86hN+e5Gmp8rDI4KP8N+czImiQKh

:!: HINWEIS - Hier kommt das zuvor erstellte Passwort zum Einsatz!

Anschliessend wird mit nachfolgendem Befehl der Inhalt der LDIF Datei im laufendem Betrieb des OpenLDAP-Servers der Konfiguration hinzugefügt:

# ldapadd -H ldapi:/// -W -x -D cn=Manager,dc=tachtler,dc=net -f /etc/openldap/ldif.d/config_binduser.ldif
# ldapadd -H ldapi:/// -W -x -D cn=Manager,dc=tachtler,dc=net -f /etc/openldap/ldif.d/config_binduser.ldif
Enter LDAP Password: 
adding new entry "cn=Ersatzbenutzer,dc=tachtler,dc=net"

:!: HINWEIS - Hier ist das Passwort von dc=Manager,dc=tachtler,dc=net einzugeben!

Ein Suchanfrage zum Testen, ob das Hinzufügen des „Ersatzauthentifizierer“ für anonyme Anfragen zur DIT Directory Information Tree erfolgreich war, kann mit folgendem Befehl durchgeführt werden:

# ldapsearch -H ldapi:/// -x -W -D cn=config -b "dc=tachtler,dc=net" "cn=Ersatzbenutzer"
# ldapsearch -H ldapi:/// -x -W -D cn=config -b "dc=tachtler,dc=net" "cn=Ersatzbenutzer"
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=tachtler,dc=net> with scope subtree
# filter: cn=Ersatzbenutzer
# requesting: ALL
#
 
# Anonymous, tachtler.net
dn: cn=Ersatzbenutzer,dc=tachtler,dc=net
cn: Ersatzbenutzer
objectClass: top
objectClass: organizationalRole
objectClass: simpleSecurityObject
userPassword:: DasistaucheinGeheimnis
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

Indizes

Um die einzelnen im DIT Directory Information Tree enthaltenen Index Felder anpassen zu können, sollen zuerst die existierende Indizierung von Feldern mit nachfolgendem Befehl aufgelistet werden, um diese Informationen als Grundlage für Anpassungen verwenden zu können:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={1}mdb,cn=config
# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={1}mdb,cn=config
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <olcDatabase={1}mdb,cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/openldap/openldap-data
olcSuffix: dc=tachtler,dc=net
olcRootDN: cn=Manager,dc=tachtler,dc=net
olcRootPW: {SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms
olcDbIndex: objectClass eq
olcDbIndex: uid pres,eq
olcDbIndex: mail pres,sub,eq
olcDbIndex: cn,sn pres,sub,eq
olcDbIndex: dc eq
olcDbMaxSize: 1073741824
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

Für nachfolgende Felder besteht bereits ein Index, wie durch die Anzeige in oben gezeigter Abfrage zu sehen ist:

(Nur relevanter Ausschnitt):

...
olcDbIndex: objectClass eq
olcDbIndex: uid pres,eq
olcDbIndex: mail pres,sub,eq
olcDbIndex: cn,sn pres,sub,eq
olcDbIndex: dc eq
...

Um auch für die nachfolgenden Felder einen Index zur Verfügung haben zu können, sind Anpassungen erforderlich. Nachfolgende Felder, sollen zusätzlich einen Indexeintrag nach folgendem Muster erhalten:

Felder Attribute Beschreibung
uidNumber,gidNumber,loginShell eq,pres eq=gleich, pres=Anzeige
uid,memberUid eq,pres,sub eq=gleich, pres=Anzeige, sub=Teilzeichenkette
nisMapName,nisMapEntry eq,pres,sub eq=gleich, pres=Anzeige, sub=Teilzeichenkette
uniqueMember eq,pres eq=gleich, pres=Anzeige

Falls ein Zugriff z.B. auf das Feld uid erfolgt und kein Index für dieses Feld definiert wurde, ist nachfolgender Hinweis im systemd-Journal zu finden:

Mar 25 13:10:11 server slapd[1362]: <= bdb_equality_candidates: (uid) not indexed

Indizes hinzufügen: /etc/openldap/ldif.d/config_DbIndex.ldif

Mit nachfolgendem Befehl soll nun eine LDIF Datei in nachfolgendem Verzeichnis, mit nachfolgendem Namen und nachfolgendem Inhalt erstellt werden.

LDIF-Datei Verwendungszweck
/etc/openldap/ldif.d/config_DbIndex.ldif Erstellen von zusätzlichen Feld-Indizes
# vim /etc/openldap/ldif.d/config_DbIndex.ldif

Die LDIF-Datei /etc/openldap/ldif.d/config_DbIndex.ldif soll nachfolgenden Inhalt bekommen:

dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: uidNumber,gidNumber,loginShell eq,pres
olcDbIndex: memberUid eq,pres,sub
olcDbIndex: nisMapName,nisMapEntry eq,pres,sub
olcDbIndex: uniqueMember eq,pres

Anschliessend wird mit nachfolgendem Befehl der Inhalt der LDIF-Datei im laufendem Betrieb des OpenLDAP-Servers der Konfiguration hinzugefügt:

# ldapmodify -H ldapi:/// -W -x -D cn=config -f /etc/openldap/ldif.d/config_DbIndex.ldif
Enter LDAP Password: 
modifying entry "olcDatabase={1}mdb,cn=config"

Zur Überprüfung, ob die Veränderungen im DIT Directory Information Tree enthaltenen Indizes der Felder auch richtig gesetzt wurden, kann nachfolgender Befehl genutzt werden, welcher eine entsprechende Anzeige zum Vorschein bringen sollte:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={1}mdb,cn=config
# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={1}mdb,cn=config
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <olcDatabase={1}mdb,cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/openldap/openldap-data
olcSuffix: dc=tachtler,dc=net
olcRootDN: cn=Manager,dc=tachtler,dc=net
olcRootPW: {SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms
olcDbIndex: objectClass eq
olcDbIndex: uid pres,eq
olcDbIndex: mail pres,sub,eq
olcDbIndex: cn,sn pres,sub,eq
olcDbIndex: dc eq
olcDbIndex: uidNumber,gidNumber,loginShell eq,pres
olcDbIndex: memberUid eq,pres,sub
olcDbIndex: nisMapName,nisMapEntry eq,pres,sub
olcDbIndex: uniqueMember eq,pres
olcDbMaxSize: 1073741824
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

Zugriffsrechte

Um die einzelnen im DIT Directory Information Tree enthaltenen Zugriffsrechte anpassen zu können, sollen zuerst die existierenden Zugriffsrechte mit nachfolgendem Befehl aufgelistet werden, um diese Informationen als Grundlage für Anpassungen verwenden zu können:

:!: HINWEIS - Es sollten aktuell noch KEINE Zugriffsrechte vorhanden sein !

# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={1}mdb,cn=config
# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={1}mdb,cn=config
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <olcDatabase={1}mdb,cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/openldap/openldap-data
olcSuffix: dc=tachtler,dc=net
olcRootDN: cn=Manager,dc=tachtler,dc=net
olcRootPW: {SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms
olcDbIndex: objectClass eq
olcDbIndex: uid pres,eq
olcDbIndex: mail pres,sub,eq
olcDbIndex: cn,sn pres,sub,eq
olcDbIndex: dc eq
olcDbIndex: uidNumber,gidNumber,loginShell eq,pres
olcDbIndex: memberUid eq,pres,sub
olcDbIndex: nisMapName,nisMapEntry eq,pres,sub
olcDbIndex: uniqueMember eq,pres
olcDbMaxSize: 1073741824
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

Zugriffsrechte definieren: /etc/openldap/ldif.d/config_acl.ldif

Mit nachfolgendem Befehl soll nun eine LDIF Datei in nachfolgendem Verzeichnis, mit nachfolgendem Namen und nachfolgendem Inhalt erstellt werden.

LDIF-Datei Verwendungszweck
/etc/openldap/ldif.d/config_acl.ldif Setzen von Zugriffsrechten/Beschränkungen
# touch /etc/openldap/ldif.d/config_acl.ldif

Die LDIF-Datei /etc/openldap/ldif.d/config_acl.ldif soll nachfolgenden Inhalt bekommen:

dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange,shadowMax,shadowWarning by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" read by anonymous auth by * none
olcAccess: {1}to dn="cn=Manager,dc=tachtler,dc=net" by self write by * none
olcAccess: {2}to dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by * none
olcAccess: {3}to dn.regex="cn=([^,]+),ou=Group,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=tachtler,dc=net" read by * none
olcAccess: {4}to dn.regex="uid=([^,]+),ou=People,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=tachtler,dc=net" read by * none
olcAccess: {5}to * by self write by dn.base="cn=Manager,dc=tachtler,dc=net" write by * read

Zugriffsrechte: Erklärungen

Nachfolgend die Erklärung für die einzelnen olcAccess-Zeilen.

Zugriffsrecht: attrs=userPassword,shadowLastChange,shadowMax,shadowWarning

olcAccess: {0}to attrs=userPassword,shadowLastChange,shadowMax,shadowWarning by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" read by anonymous auth by * none

Auf die Felder

  • userPassword
  • shadowLastChange
  • shadowMax
  • shadowWarning

können die nachfolgenden Benutzer mit nachfolgenden Rechten zugreifen:

Zugriffsformulierung Benutzer Zugriffsrecht
by self write self (selbst) schreiben
by dn=„cn=Manager,dc=tachtler,dc=net“ write Manager schreiben
by dn=„cn=Ersatzbenutzer,dc=tachtler,dc=net“ read Ersatzbenutzer lesen
by anonymous auth anonymous Authentifizieren
by * none <ALLE ANDEREN> <KEINE RECHTE>

Zugriffsrecht: cn=Manager,dc=tachtler,dc=net

olcAccess: {1}to dn="cn=Manager,dc=tachtler,dc=net" by self write by * none

Auf den Eintrag

  • cn=Manager,dc=tachtler,dc=net

können die nachfolgenden Benutzer mit nachfolgenden Rechten zugreifen:

Zugriffsformulierung Benutzer Zugriffsrecht
by self write self (selbst) schreiben
by * none <ALLE ANDEREN> <KEINE RECHTE>

Zugriffsrecht: cn=Ersatzbenutzer,dc=tachtler,dc=net

olcAccess: {2}to dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by * none

Auf den Eintrag

  • cn=Ersatzbenutzer,dc=tachtler,dc=net

können die nachfolgenden Benutzer mit nachfolgenden Rechten zugreifen:

Zugriffsformulierung Benutzer Zugriffsrecht
by self write self (selbst) schreiben
by dn=„cn=Manager,dc=tachtler,dc=net“ write Manager schreiben
by * none <ALLE ANDEREN> <KEINE RECHTE>

Zugriffsrecht: cn=([^,]+),ou=Group,dc=tachtler,dc=net

olcAccess: {3}to dn.regex="cn=([^,]+),ou=Group,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=tachtler,dc=net" read by * none

Auf den Eintrag

  • cn=([^,]+),ou=Group,dc=tachtler,dc=net

können die nachfolgenden Benutzer mit nachfolgenden Rechten zugreifen:

Zugriffsformulierung Benutzer Zugriffsrecht
by self write self (selbst) schreiben
by dn=„cn=Manager,dc=tachtler,dc=net“ write Manager schreiben
by dn=„cn=Ersatzbenutzer,dc=tachtler,dc=net“ read Ersatzbenutzer lesen
by dn.exact,expand=„uid=$1,ou=People,dc=tachtler,dc=net“ read (Gruppen)benutzer lesen
by * none <ALLE ANDEREN> <KEINE RECHTE>

Der Eintrag steht für die einzelne Gruppe im Teil des DIT Directory Information Tree ou=Group,dc=tachtler,dc=net für alle dort enthaltenen Einträge.

Zugriffsrecht: {uid=([^,]+),ou=People,dc=tachtler,dc=net

olcAccess: {4}to dn.regex="uid=([^,]+),ou=People,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=tachtler,dc=net" read by * none

Auf den Eintrag

  • uid=([^,]+),ou=People,dc=tachtler,dc=net

können die nachfolgenden Benutzer mit nachfolgenden Rechten zugreifen:

Zugriffsformulierung Benutzer Zugriffsrecht
by self write self (selbst) schreiben
by dn=„cn=Manager,dc=tachtler,dc=net“ write Manager schreiben
by dn=„cn=Ersatzbenutzer,dc=tachtler,dc=net“ read Ersatzbenutzer lesen
by dn.exact,expand=„uid=$1,ou=People,dc=tachtler,dc=net“ read Benutzer lesen
by * none <ALLE ANDEREN> <KEINE RECHTE>

Der Eintrag steht für den einzelnen Benutzer im Teil des DIT Directory Information Tree ou=People,dc=tachtler,dc=net für alle dort enthaltenen Einträge.

Zugriffsrecht: *

olcAccess: {5}to * by self write by dn.base="cn=Manager,dc=tachtler,dc=net" write by * read

Auf den Eintrag

  • *

können die nachfolgenden Benutzer mit nachfolgenden Rechten zugreifen:

Zugriffsformulierung Benutzer Zugriffsrecht
by self write self (selbst) schreiben
by dn=„cn=Manager,dc=tachtler,dc=net“ write Manager schreiben
by * read <ALLE ANDEREN> lesen

Der Eintrag steht für alle Einträge, ohne besondere Beschränkungen.

Zugriffsrechte: Anwendung

Zugriffsrechte: hinzufügen

Anschliessend wird mit nachfolgendem Befehl der Inhalt der LDIF Datei im laufendem Betrieb des OpenLDAP-Servers der Konfiguration hinzugefügt:

# ldapmodify -H ldapi:/// -W -x -D cn=config -f /etc/openldap/ldif.d/config_acl.ldif
# ldapmodify -H ldapi:/// -W -x -D cn=config -f /etc/openldap/ldif.d/config_acl.ldif
Enter LDAP Password: 
modifying entry "olcDatabase={1}mdb,cn=config"

Zur Überprüfung, ob die Veränderungen im DIT Directory Information Tree enthaltenen Zugriffsrechte auch richtig gesetzt wurden, kann nachfolgender Befehl genutzt werden, welcher eine entsprechende Anzeige zum Vorschein bringen sollte:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={1}mdb,cn=config
# ldapsearch -H ldapi:/// -W -x -D cn=config -b olcDatabase={1}mdb,cn=config
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <olcDatabase={1}mdb,cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/openldap/openldap-data
olcSuffix: dc=tachtler,dc=net
olcRootDN: cn=Manager,dc=tachtler,dc=net
olcRootPW: {SSHA}t9RX1sH1NkqgkuBWzZIkiS+Aqkk2i3ms
olcDbIndex: objectClass eq
olcDbIndex: uid pres,eq
olcDbIndex: mail pres,sub,eq
olcDbIndex: cn,sn pres,sub,eq
olcDbIndex: dc eq
olcDbIndex: uidNumber,gidNumber,loginShell eq,pres
olcDbIndex: memberUid eq,pres,sub
olcDbIndex: nisMapName,nisMapEntry eq,pres,sub
olcDbIndex: uniqueMember eq,pres
olcDbMaxSize: 1073741824
olcAccess: {0}to attrs=userPassword,shadowLastChange,shadowMax,shadowWarning b
 y self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenu
 tzer, dc=tachtler,dc=net" read by anonymous auth by * none
olcAccess: {1}to dn="cn=Manager,dc=tachtler,dc=net" by self write by * none
olcAccess: {2}to dn="cn=Ersatzbenutzer,dc=tachtler,dc=net" by self write by dn
 ="cn=Manager,dc=tachtler,dc=net" write by * none
olcAccess: {3}to dn.regex="cn=([^,]+),ou=Group,dc=tachtler,dc=net" by self wri
 te by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=ta
 chtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=tachtler,dc=net" 
 read by * none
olcAccess: {4}to dn.regex="uid=([^,]+),ou=People,dc=tachtler,dc=net" by self w
 rite by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzbenutzer,dc=
 tachtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=tachtler,dc=net
 " read by * none
olcAccess: {5}to * by self write by dn.base="cn=Manager,dc=tachtler,dc=net" wr
 ite by * read
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

Zugriffsrechte: überprüfen

Zur Überprüfung ob die Zugriffsbeschränkungen tatsächlich auch funktionieren, kann überprüft werden, ob der Benutzer

  • "uid=klaus,ou=People,dc=tachtler,dc=net"

die Daten des Benutzers

  • "uid=root,ou=People,dc=tachtler,dc=net"

abfragen kann.

Nachfolgend der Befehl zur Überprüfung:

:!: HINWEIS - Hier ist das Passwort von uid=klaus,ou=People,dc=tachtler,dc=net einzugeben!

# ldapsearch -LLL -H ldapi:/// -x -W -D "uid=klaus,ou=People,dc=tachtler,dc=net" -b "ou=People,dc=tachtler,dc=net" "uid=root"
# ldapsearch -LLL -H ldapi:/// -x -W -D "uid=klaus,ou=People,dc=tachtler,dc=net" -b "ou=People,dc=tachtler,dc=net" "uid=root"
Enter LDAP Password:

:!: WICHTIG - Es sollte KEINE Datenanzeige erfolgen!!!

Nachfolgender Befehl, sollte jedoch weiterhin ein Ergebnis zurück liefern, da hier als

  • "cn=Manager,dc=tachtler,dc=net"

die Abfrage durchgeführt wird:

:!: HINWEIS - Hier ist das Passwort von dc=Manager,dc=tachtler,dc=net einzugeben!

# ldapsearch -LLL -H ldapi:/// -x -W -D "cn=Manager,dc=tachtler,dc=net" -b "ou=People,dc=tachtler,dc=net" "uid=root"
# ldapsearch -LLL -H ldapi:/// -x -W -D "cn=Manager,dc=tachtler,dc=net" -b "ou=People,dc=tachtler,dc=net" "uid=root"
Enter LDAP Password: 
dn: uid=root,ou=People,dc=tachtler,dc=net
cn: root
gecos: root
gidNumber: 0
homeDirectory: /root
loginShell: /bin/bash
mail: root@tachtler.net
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowLastChange: 16383
shadowMax: 99999
shadowMin: 0
shadowWarning: 7
sn: root
givenName: root
uid: root
uidNumber: 0
userPassword:: WieimmerbleibtdaseinGeheimnis

Log-Schreibung

Um beim OpenLDAP die LOG-Schreibung zu aktivieren oder zu deaktivieren sind nachfolgende Schritte notwendig.

Log-Level: Erstellen /etc/openldap/ldif.d/config_loglevel_add.ldif

:!: HINWEIS - Damit der Parameter überhaupt verändert werden kann muss dieser zuerst einmal angelegt werden.

Der Parameter olcLogLevel setzt nach dem angegebenen Wert die Gesprächigkeit der LOG-Schreibung.

Level Schlüsselwort Beschreibung
-1 any Einschalten des kompletten Debugging (enable all debugging)
0 kein Debugging (no debugging)
1 (0x1 trace) trace function calls
2 (0x2 packets) debug packet handling
4 (0x4 args) heavy trace debugging
8 (0x8 conns) connection management
16 (0x10 BER) print out packets sent and received
32 (0x20 filter) search filter processing
64 (0x40 config) configuration processing
128 (0x80 ACL) access control list processing
256 (0x100 stats) stats log connections/operations/results
512 (0x200 stats2) stats log entries sent
1024 (0x400 shell) print communication with shell backends
2048 (0x800 parse) print entry parsing debugging
16384 (0x4000 sync) syncrepl consumer processing
32768 (0x8000 none) only messages that get logged regardless of configured log level

Mit nachfolgendem Befehl soll nun eine LDIF Datei in nachfolgendem Verzeichnis, mit nachfolgendem Namen und nachfolgendem Inhalt erstellt werden.

LDIF-Datei Verwendungszweck
/etc/openldap/ldif.d/config_loglevel_add.ldif Setzen des LOG-Level auf state (Standard)
# vim /etc/openldap/ldif.d/config_loglevel_add.ldif

Die LDIF Datei /etc/openldap/ldif.d/config_loglevel_add.ldif soll nachfolgenden Inhalt bekommen:

dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: stats

Anschliessend wird mit nachfolgendem Befehl der Inhalt der LDIF Datei im laufendem Betrieb des OpenLDAP-Servers der Konfiguration hinzugefügt:

# ldapmodify -H ldapi:/// -W -x -D cn=config -f /etc/openldap/ldif.d/config_loglevel_add.ldif
# ldapmodify -H ldapi:/// -W -x -D cn=config -f /etc/openldap/ldif.d/config_loglevel_add.ldif
Enter LDAP Password: 
modifying entry "cn=config"

Um überprüfen zu können, ob alle Änderungen erfolgreich durchgeführt wurden, kann nachfolgender Befehl genutzt werden und sollte eine Ausgabe wie nachfolgende zur Anzeige bringen:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b cn=config "(objectclass=olcGlobal)"
# ldapsearch -H ldapi:/// -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: /run/openldap/slapd.args
olcDisallows: bind_anon
olcIdleTimeout: 15
olcPidFile: /run/openldap/slapd.pid
olcReferral: ldap://ldap.idmz.tachtler.net
olcRequires: authc
olcTLSCACertificateFile: /etc/openldap/ssl/certs/CAcert.pem
olcTLSCACertificatePath: /etc/openldap/ssl/certs
olcTLSCertificateFile: /etc/openldap/ssl/certs/ldap.idmz.tachtler.net.pem
olcTLSCertificateKeyFile: /etc/openldap/ssl/private/ldap.idmz.tachtler.net.key
olcTLSCipherSuite: HIGH
olcTLSProtocolMin: 3.1
olcLogLevel: stats
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

Log-Schreibung: ausschalten /etc/openldap/ldif.d/config_loglevel_off.ldif

Um beim OpenLDAP die LOG-Schreibung zu deaktivieren wäre nachfolgender Schritt notwendig.

Mit nachfolgendem Befehl soll nun eine LDIF Datei in nachfolgendem Verzeichnis, mit nachfolgendem Namen und nachfolgendem Inhalt erstellt werden.

LDIF-Datei Verwendungszweck
/etc/openldap/ldif.d/config_loglevel_off.ldif Setzen des LOG-Level auf none
# vim /etc/openldap/ldif.d/config_loglevel_off.ldif

Die LDIF Datei /etc/openldap/ldif.d/config_loglevel_off.ldif soll nachfolgenden Inhalt bekommen:

dn: cn=config
changetype: modify
delete: olcLogLevel
olcLogLevel: stats
-
add: olcLogLevel
olcLogLevel: none

Eine Aktivierung kann mit nachfolgendem Befehl den Inhalt der LDIF Datei im laufendem Betrieb des OpenLDAP-Servers der Konfiguration hinzugefügen:

# ldapmodify -H ldapi:/// -W -x -D cn=config -f /etc/openldap/ldif.d/config_loglevel_off.ldif

Eine Überprüfung, ob alle Änderungen erfolgreich durchgeführt wurden, kann mit nachfolgendem Befehl durchgeführt werden:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b cn=config "(objectclass=olcGlobal)"

Log-Schreibung: einschalten /etc/openldap/ldif.d/config_loglevel_default.ldif

Um beim OpenLDAP die LOG-Schreibung wieder zu aktivieren ist nachfolgender Schritt notwendig.

Mit nachfolgendem Befehl soll nun eine LDIF Datei in nachfolgendem Verzeichnis, mit nachfolgendem Namen und nachfolgendem Inhalt erstellt werden.

LDIF-Datei Verwendungszweck
/etc/openldap/ldif.d/config_loglevel_default.ldif Setzen des LOG-Level auf state
# vim /etc/openldap/ldif.d/config_loglevel_default.ldif

Die LDIF Datei /etc/openldap/ldif.d/config_loglevel_default.ldif soll nachfolgenden Inhalt bekommen:

dn: cn=config
changetype: modify
delete: olcLogLevel
olcLogLevel: none
-
add: olcLogLevel
olcLogLevel: stats

Eine Aktivierung kann mit nachfolgendem Befehl den Inhalt der LDIF Datei im laufendem Betrieb des OpenLDAP-Servers der Konfiguration hinzugefügen:

# ldapmodify -H ldapi:/// -W -x -D cn=config -f /etc/openldap/ldif.d/config_loglevel_default.ldif

Eine Überprüfung, ob alle Änderungen erfolgreich durchgeführt wurden, kann mit nachfolgendem Befehl durchgeführt werden:

# ldapsearch -H ldapi:/// -W -x -D cn=config -b cn=config "(objectclass=olcGlobal)"

LDAP-Server: Backup

Um im Fall der Fälle ein vollständiges Backup der

  1. Konfigurationen
  2. Daten

des OpenLDAP-Servers vorhalten zu können, kann nachfolgende Art Backups zu erzeugen angewandt werden.

Alle Befehle, welche mit ldap beginnen sind Client-seitige Befehle und alle Befehle, welche mit slap beginnen, sind Server-seitige Befehle.

Zur Erstellung von Backups soll hier der Befehl slapcat zum Einsatz kommen.

Vorbereitend kann ein Verzeichnis zur Aufnahme der Backup-Dateien mit nachfolgenden Befehlen neu erstellt werden und mit den entsprechenden Besitz- und Datei-rechten versehen werden, wie nachfolgend dargestellt:

Neuanlage des Verzeichnisses: /var/lib/openldap/openldap-backup

# mkdir /var/lib/openldap/openldap-backup

Setzen der entsprechenden Besitzrechte:

# chown ldap:ldap /var/lib/openldap/openldap-backup

Setzen der entsprechenden Dateirechte:

# chmod 700 /var/lib/openldap/openldap-backup

LDAP-Server: Backup - Konfigurationen

Nachfolgender Befehl erstellt eine Datei im LDIF-Format mit allen Konfigurationen des OpenLDAP-Servers:

# sudo -u ldap slapcat -vF /etc/openldap/slapd.d/ -n 0 -l "/var/lib/openldap/openldap-backup/$(hostname)-ldap-mdb-conf-$(date '+%F_%H_%M_%S').ldif"
# sudo -u ldap slapcat -vF /etc/openldap/slapd.d/ -n 0 -l "/var/lib/openldap/openldap-backup/$(hostname)-ldap-mdb-conf-$(date '+%F_%H_%M_%S').ldif"
# id=00000001
# id=00000002
# id=00000003
# id=00000004
# id=00000005
# id=00000006
# id=00000007
# id=00000008
# id=00000009
# id=0000000a
# id=0000000b

Nachfolgender Befehl listet den aktuellen Inhalt des Verzeichnisses /var/lib/openldap/openldap-backup auf:

# ls -l /var/lib/openldap/openldap-backup
total 40
-rw-r--r-- 1 ldap ldap 40658 Mar 28 15:14 vml030-ldap-mdb-conf-2022-03-28_15_14_26.ldif

LDAP-Server: Backup - Daten

Nachfolgender Befehl erstellt eine Datei im LDIF-Format mit allen Daten des OpenLDAP-Servers:

# sudo -u ldap slapcat -v -n 1 -l "/var/lib/openldap/openldap-backup/$(hostname)-ldap-mdb-data-$(date '+%F_%H_%M_%S').ldif"
# sudo -u ldap slapcat -v -n 1 -l "/var/lib/openldap/openldap-backup/$(hostname)-ldap-mdb-data-$(date '+%F_%H_%M_%S').ldif"
# id=00000001
# id=00000002
# id=00000003
# id=00000004
# id=00000005
# id=00000006
# id=00000007
# id=00000008
# id=00000009
# id=0000000a
# id=0000000b

Nachfolgender Befehl listet den aktuellen Inhalt des Verzeichnisses /var/lib/openldap/openldap-backup auf:

# ls -l /var/lib/openldap/openldap-backup
total 48
-rw-r--r-- 1 ldap ldap 40658 Mar 28 15:14 vml030-ldap-mdb-conf-2022-03-28_15_14_26.ldif
-rw-r--r-- 1 ldap ldap  7808 Mar 28 15:15 vml030-ldap-mdb-data-2022-03-28_15_15_21.ldif

LDAP-Server: Restore

Um im Fall der Fälle ein vollständiges Restore der

  1. Konfigurationen
  2. Daten

des OpenLDAP-Servers wiederherstellen zu können, kann nachfolgende Art angewendet werden.

LDAP-Server: Restore - Server Stopp

Bevor ein vollständiger Restore durchgeführt werden kann, muss der OpenLDAP-Server gestoppt werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# systemctl stop slapd.service

Eine Überprüfung, ob der OpenLDAP-Server wirklich nicht mehr läuft und gestoppt wurde, kann mit nachfolgendem Befehl durchgeführt werden:

# systemctl status slapd.service
○ slapd.service - OpenLDAP Server Daemon
     Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor preset: disabled)
     Active: inactive (dead) since Mon 2022-03-28 15:16:06 CEST; 3s ago
       Docs: man:slapd
             man:slapd-config
             man:slapd-mdb
    Process: 2594 ExecStart=/usr/lib/slapd -d 0 -u ldap -g ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=>
   Main PID: 2594 (code=exited, status=0/SUCCESS)
        CPU: 15ms

Mar 28 15:11:29 server slapd[2594]: slapd starting
Mar 28 15:11:29 server systemd[1]: Started OpenLDAP Server Daemon.
Mar 28 15:16:06 server slapd[2594]: daemon: shutdown requested and initiated.
Mar 28 15:16:06 server slapd[2594]: slapd shutdown: waiting for 0 operations/tasks to finish
Mar 28 15:16:06 server systemd[1]: Stopping OpenLDAP Server Daemon...
Mar 28 15:16:06 server slapd[2594]: DIGEST-MD5 common mech free
Mar 28 15:16:06 server slapd[2594]: DIGEST-MD5 common mech free
Mar 28 15:16:06 server slapd[2594]: slapd stopped.
Mar 28 15:16:06 server systemd[1]: slapd.service: Deactivated successfully.
Mar 28 15:16:06 server systemd[1]: Stopped OpenLDAP Server Daemon.

LDAP-Server: Restore - Konfigurationen leeren

Nachfolgender Befehl leert alle Online-Konfigurationen des OpenLDAP-Servers:

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

:!: HINWEIS - Es erfolgen keine weiteren Ausgaben, wenn der Start erfolgreich war !

LDAP-Server: Restore - Daten leeren

Nachfolgender Befehl leert alle Daten des OpenLDAP-Servers:

# rm -rf /var/lib/openldap/openldap-data/*

:!: HINWEIS - Es erfolgen keine weiteren Ausgaben, wenn der Start erfolgreich war !

LDAP-Server: Restore - Konfigurationen

Nachfolgender Befehl stellt alle Konfigurationen des OpenLDAP-Servers wieder her:

# sudo -u ldap slapadd -v -n 0 -F /etc/openldap/slapd.d -l /var/lib/openldap/openldap-backup/server-ldap-mdb-conf-2022-03-28_15_14_26.ldif
# sudo -u ldap slapadd -v -n 0 -F /etc/openldap/slapd.d -l /var/lib/openldap/openldap-backup/server-ldap-mdb-conf-2022-03-28_15_14_26.ldif
added: "cn=config" (00000001)
added: "cn=module{0},cn=config" (00000001)
added: "cn=schema,cn=config" (00000001)
added: "cn={0}core,cn=schema,cn=config" (00000001)
added: "cn={1}cosine,cn=schema,cn=config" (00000001)
added: "cn={2}inetorgperson,cn=schema,cn=config" (00000001)
added: "cn={3}nis,cn=schema,cn=config" (00000001)
added: "olcDatabase={-1}frontend,cn=config" (00000001)
added: "olcDatabase={0}config,cn=config" (00000001)
added: "olcDatabase={1}mdb,cn=config" (00000001)
added: "olcDatabase={2}monitor,cn=config" (00000001)
Closing DB...

LDAP-Server: Restore - Daten

Nachfolgender Befehl stellt alle Daten des OpenLDAP-Servers wieder her:

# sudo -u ldap slapadd -v -n 1 -F /etc/openldap/slapd.d -l /var/lib/openldap/openldap-backup/server-ldap-mdb-data-2022-03-28_15_15_21.ldif
# sudo -u ldap slapadd -v -n 1 -F /etc/openldap/slapd.d -l /var/lib/openldap/openldap-backup/server-ldap-mdb-data-2022-03-28_15_15_21.ldif
added: "dc=tachtler,dc=net" (00000001)
added: "ou=People,dc=tachtler,dc=net" (00000002)
added: "ou=Group,dc=tachtler,dc=net" (00000003)
added: "cn=root,ou=Group,dc=tachtler,dc=net" (00000004)
added: "cn=klaus,ou=Group,dc=tachtler,dc=net" (00000005)
added: "cn=petra,ou=Group,dc=tachtler,dc=net" (00000006)
added: "cn=lena,ou=Group,dc=tachtler,dc=net" (00000007)
added: "cn=luis,ou=Group,dc=tachtler,dc=net" (00000008)
added: "uid=root,ou=People,dc=tachtler,dc=net" (00000009)
added: "uid=klaus,ou=People,dc=tachtler,dc=net" (0000000a)
added: "cn=Ersatzbenutzer,dc=tachtler,dc=net" (0000000b)
Closing DB...

LDAP-Server: Restore - Server Start

Abschliessend muss der Start des OpenLDAP-Servers wieder erfolgen, was mit nachfolgendem Befehl durchgeführt werden kann:

# systemctl start slapd.service

:!: HINWEIS - Es erfolgen keine weiteren Ausgaben, wenn der Start erfolgreich war !

Ob der OpenLDAP-Server, sprich der slapd-Dienst/Daemon auch tatsächlich als Hintergrundprozess läuft, kann mit nachfolgendem Befehl überprüft werden (Es sollte eine Ausgabe wie nachfolgend dargestellt erfolgen - es kommt auf die zweite Zeile an!):

# ps auxwf | grep slapd
root        2733  0.0  0.1   6992  2424 pts/0    S+   15:21   0:00                      \_ grep slapd
ldap        2728  0.0  0.7 1087044 16092 ?       Ssl  15:21   0:00 /usr/lib/slapd -d 0 -u ldap -g ldap -h ldap:/// ldapi:/// ldaps:///

und nachfolgender Befehl:

# ss -tulpen | grep slapd
tcp   LISTEN 0      2048                  0.0.0.0:389       0.0.0.0:*    users:(("slapd",pid=2728,fd=7)) ino:32948 sk:3 cgroup:/system.slice/slapd.service <->            
tcp   LISTEN 0      2048                  0.0.0.0:636       0.0.0.0:*    users:(("slapd",pid=2728,fd=10)) ino:32953 sk:5 cgroup:/system.slice/slapd.service <->           
tcp   LISTEN 0      2048                     [::]:389          [::]:*    users:(("slapd",pid=2728,fd=8)) ino:32949 sk:6 cgroup:/system.slice/slapd.service v6only:1 <->   
tcp   LISTEN 0      2048                     [::]:636          [::]:*    users:(("slapd",pid=2728,fd=11)) ino:32954 sk:9 cgroup:/system.slice/slapd.service v6only:1 <->

bzw. nachfolgender Befehl:

# systemctl status slapd.service
● slapd.service - OpenLDAP Server Daemon
     Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor pre>
     Active: active (running) since Mon 2022-03-28 15:21:42 CEST; 37s ago
       Docs: man:slapd
             man:slapd-config
             man:slapd-mdb
   Main PID: 2728 (slapd)
      Tasks: 2 (limit: 2340)
     Memory: 3.7M
        CPU: 19ms
     CGroup: /system.slice/slapd.service
             └─2728 /usr/lib/slapd -d 0 -u ldap -g ldap -h "ldap:/// ldapi:/// >

Mar 28 15:21:42 server systemd[1]: Starting OpenLDAP Server Daemon...
Mar 28 15:21:42 server slapd[2728]: @(#) $OpenLDAP: slapd 2.6.1 (Jan 20 2022 19>
                                            openldap
Mar 28 15:21:42 server slapd[2728]: slapd starting
Mar 28 15:21:42 server systemd[1]: Started OpenLDAP Server Daemon.
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
tachtler/ldap_archlinux.txt · Zuletzt geändert: 2023/04/10 08:16 von klaus