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 der notwendigen Pakete.
apt install slapd libldap-common gosa-schema ldapvi
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
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
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))
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
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
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