OpenLDAP Server

Aufsetzen eines OpenLDAP Servers (slapd) unter Debian Bookworm (12). Zugriff auf den LDAP Server soll auf den verschlüsselten Zugriff per LDAPS (Port 636) eingeschränkt werde. Das Standard nis Schema soll gegen das neuere rfc2307bis Schema ausgetauscht werden. Das rfc2307bis Schema erlaubt Gruppen mit objectClass posixGroup als auch groupOfNames. Erweiterung des Schema damit für Benutzer der SSH public keys abgelegt werden kann.

Voraussetzung ist ein laufendes Debian System und ein SSL Zertifikat. Die folgenden Befehle erfordern root Berechtigung.

Installation

Installation der notwendigen Pakete.

apt install slapd libldap-common gosa-schema ldapvi

Schema anpassen

Das nis Schema kann nicht direkt gegen das rfc2306bis ersetzt werden. Um rfc2306bis nutzen zu können muss das gesamte Verzeichnis neu aufgesetzt, neu initialisiert werde. Dabei gehen alle bestehenden Einträge verloren. Ein Backup kann nicht direkt zurück gespielt werden, dafür müssen vorher alle Gruppen angepasst werden.

Zuerst das Schema rfc2306bis kopieren danach kann das Paket gosa-schema wieder entfernt werden.

cp /etc/ldap/schema/gosa/rfc2307bis.ldif /etc/ldap/schema/rfc2307bis.ldif
apt remove --purge gosa-schema

Die Schema- Erweiterung kann auch ohne neu Initialisierung eingebunden werden, idealerweise macht man dies aber direkt beim Aufbau des LDAP Servers mit.

Schema openssh-lpk als /etc/ldap/schema/openssh-lpk.ldif anlegen um SSH public keys zu speichern.

#
dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
#
olcAttributeTypes: (
    1.3.6.1.4.1.24552.500.1.1.1.13
    NAME 'sshPublicKey'
    DESC 'MANDATORY: OpenSSH Public key'
    EQUALITY octetStringMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.40
    )
#
olcObjectClasses: (
    1.3.6.1.4.1.24552.500.1.1.2.0
    NAME 'ldapPublicKey'
    SUP top
    AUXILIARY
    DESC 'MANDATORY: OpenSSH LPK objectclass'
    MAY ( sshPublicKey $ uid )
    )
#

Berechtigungen der Schema Dateien anpassen

chmod 644 /etc/ldap/schema/*.ldif

Initialisierungsdatei kopieren.

cp /usr/share/slapd/slapd.init.ldif slapd.init.ldif

Die kopierten Datei slapd.init.ldif anpassen. Dabei das nis Schema durch das rfc2307bis Schema ersetzen und die Erweiterungen openssh-lpk hinzufügen.

Den Platzhalter @SUFFIX@ durch die eigene LDAP Base ersetzen hier im Beispiel dc=example,dc=net.

Den Platzhalter @PASSWORD@ mit dem eigenen generierten Passworthash ersetzen. Dafür mit slappasswd -h '{CRYPT}' den passenden Hash generieren.

 1 include: file:///etc/ldap/schema/core.ldif
 2 include: file:///etc/ldap/schema/cosine.ldif
 3-include: file:///etc/ldap/schema/nis.ldif
 4+include: file:///etc/ldap/schema/rfc2307bis.ldif
 5 include: file:///etc/ldap/schema/inetorgperson.ldif
 6+include: file:///etc/ldap/schema/openssh-lpk.ldif
 7
 8 # The base of your directory in database #1
 9-olcSuffix: @SUFFIX@
10+olcSuffix: dc=example,dc=net
11
12 # Database superuser credentials
13-olcRootDN: cn=admin,@SUFFIX@
14+olcRootDN: cn=admin,dc=example,dc=net
15-olcRootPW: @PASSWORD@
16+olcRootPW: {CRYPT}vDREzhYp9SnpE

LDAP Server stoppen und die initial angelegte Konfiguration und Datenbank löschen, dann den LDAP Server neu initialisieren.

systemctl stop slapd.service
rm -r /var/lib/ldap/*
rm -r /etc/ldap/slapd.d/cn=config
rm /etc/ldap/slapd.d/cn=config.ldif
slapadd -F /etc/ldap/slapd.d -b cn=config -l slapd.init.ldif
rm /etc/ldap/slapd.init.ldif
chown -R openldap:openldap /etc/ldap/slapd.d/cn=config
chown openldap:openldap /etc/ldap/slapd.d/cn=config.ldif
systemctl start slapd.service

Prüfen ob das Scheme rfc2307bis und die Erweiterung openldap-lpk erfolgreich eingetragen wurden. Dazu sich mit ldapvi die Konfiguration anzeigen lassen und prüfen ob die entsprechenden Einträge vorhanden sind.

ldapvi -Y EXTERNAL -h ldapi:// -b cn=config

MemberOf Modul einrichten

Mehr Informationen zum Modul findet man in man slapo-memberof. Das Modul muss zuerst geladen sein bevor die entsprechenden Gruppen angelegt werden.

Die Konfiguration öffnen

ldapvi -Y EXTERNAL -h ldapi:// -b cn=config

Das Modul mit add in der Konfiguration hinzufügen, die Zahl {1} muss gegebenenfalls angepasst werden je nachdem wieviele Module bereits verwendet werden. Immer die nächste freie Zahl verwenden.

add cn=module{1},cn=config
objectClass: olcModuleList
cn: module{1}
olcModulePath: /usr/lib/ldap
olcModuleLoad: memberof

Speichern und den Editor schließen ldapvi sollte den Eintrag korrekt übernehmen.

Konfiguration wieder öffnen und nach dem Eintrag olcDatabase={1}mdb,cn=config suchen, gegebenenfalls muss auch hier die Zahl {1} angepasst werden. Die Zahl muss mit der Datenbank die man verwenden möchte übereinstimmen.

add olcOverlay=memberof,olcDatabase={1}mdb,cn=config
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf

Auf LDAPS umstellen

Benutzer unter dem der LDAP Server läuft zur Gruppe ssl-cert hinzufügen, für Zugriff auf den privaten Schlüssel unter /etc/ssl/private/.

adduser openldap ssl-cert
sudo systemctl restart slapd.service

Die Konfiguration öffnen

ldapvi -Y EXTERNAL -h ldapi:// -b cn=config

Zum Objekt cn=config die folgenden Attribute hinzufügen. Wobei server.key und server.crt der eigene Schlüssel und dem eigene Zertifikat entspricht, der vorhanden sein muss und vom Dienst slapd lesbar. Das root- Zertifikat vom dem das Server- Zertifikat signiert wurde muss in der ca-certificates.crt enthalten sein.

dn: cn=config
olcTLSCACertificateFile: /etc/ssl/certs/ca-certificates.crt
olcTLSCertificateKeyFile: /etc/ssl/private/server.key
olcTLSCertificateFile: /etc/ssl/certs/server.crt
olcLocalSSF: 128
olcSecurity: ssf=128

Startparameter in der Datei /etc/default/slapd anpassen damit der Service nur auf ldapi und ldaps lauscht.

1-SLAPD_SERVICES="ldap:/// ldapi:///"
2+SLAPD_SERVICES="ldaps:/// ldapi:///"

Dienst neu starten

systemctl restart slapd.service

Mit ss -ltnp | grep slapd kann geprüft werden ob slapd nun nur noch auf dem Port :636 also LDAPS hört.

LISTEN 0  2048  0.0.0.0:636  0.0.0.0:*  users:(("slapd",pid=1650,fd=8))
LISTEN 0  2048     [::]:636     [::]:*  users:(("slapd",pid=1650,fd=9))

LDAP Base Objekt

Das Base Objekt in der Datei base.ldif erzeugen

dc=example,dc=net
objectClass: top
objectClass: dcObject
objectClass: organization
dc: example
o: example.net

Mit slapadd die neue Base zum LDAP Server hinzufügen

systemctl stop slapd.service
slapadd -b dc=example,dc=net -l base.ldif
systemctl start slapd.service

Einträge anlegen

Zum anmelden an LDAP Server um die ersten Einträge hinzufügen zu können muss zunächst die Umgebungsvariable LDAPTLS_CACERT gesetzt werden die auf die Datei ca-certificates.crt verweist die wiederrum das Root- Zertifikat des LDAP Server Zertifikates enthält. Anmeldung erfolgt mit dem Admin User (olcRootDN) und dem dazugehörigen Passwort (olcRootPW) was beim Initialisieren angegeben wurde. Damit das Zertifikat erfolgreich validiert werden kann muss der für die Anmeldung verwendete <fqdn> im Zertifikat enthalten sein.

export LDAPTLS_CACERT=/etc/ssl/certs/ca-certificates.crt
ldapvi -b dc=example,dc=net -h ldaps://<fqdn> -D cn=admin,dc=example,dc=net

Im Editor können nun die ersten Einträge angelegt werden.

add ou=users,dc=example,dc=net
objectClass: organizationalUnit
objectClass: top
ou: users

add ou=groups,dc=example,dc=net
objectClass: organizationalUnit
objectClass: top

add uid=stku,ou=users,dc=example,dc=net
objectClass: inetOrgPerson
objectClass: ldapPublicKey
objectClass: organizationalPerson
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
objectClass: top
uidNumber: 1101
gidNumber: 1101
homeDirectory: /home/stku
loginShell: /bin/bash
userPassword: password0815
sshPublicKey: ssh-ed25519 ...
uid: stku
givenName: Stefan
sn: Kublik
cn: Stefan Kublik
mail: stku@example.net

add cn=stku,ou=groups,dc=example,dc=net
objectClass: groupOfNames
objectClass: posixGroup
objectClass: top
cn: stku
gidNumber: 1101
member: uid=stku,ou=users,dc=example,dc=net

add cn=admins,ou=groups,dc=example,dc=net
objectClass: groupOfNames
objectClass: posixGroup
objectClass: top
cn: admins
gidNumber: 1201
member: uid=stku,ou=users,dc=example,dc=net

Prüfen ob das MemberOf Modul funktioniert (mit anonymer Anmeldung).

ldapsearch -LLL -x -b dc=example,dc=net -H ldaps://<fqdn> uid=stku memberOf

Prüfen ob der neu angelegte User sich anmelden kann

ldapsearch -LLL -x -b dc=example,dc=net -H ldaps://<fqdn> \
    -D uid=stku,ou=users,dc=example,dc=net -W

Zugriffsregeln anpassen

Mit ldapvi die Konfiguration öffnen. (die {1} gegebenenfalls anpassen)

ldapvi -Y EXTERNAL -h ldapi:// -b olcDatabase={1}mdb,cn=config

Die bestehenden olcAccess Attribute wie folgt ersetzen. Die Zahlen legen die Reihenfolge der Zugriffsregeln fest.

Die oben angelegt Gruppe admins soll vollen Zugriff erhalten, jeder User soll seine eigenen Einträge editieren können, Abfrage der Daten nur mit einer erfolgreichen Anmeldung.

olcAccess: {0}to attrs=userPassword by self write by anonymous auth by group.exact=cn=admins,ou=groups,dc=example,dc=net write by * none
olcAccess: {1}to attrs=shadowLastChange by self write by group.exact=cn=admins,ou=groups,dc=example,dc=net write by users read by * none
olcAccess: {2}to attrs=uid,givenName,sn,cn,mail,sshPublicKey,jpegPhoto by self write by group.exact=cn=admins,ou=groups,dc=example,dc=net write by users read by * none
olcAccess: {3}to * by group.exact=cn=admins,ou=groups,dc=example,dc=net write by users read by * none