OpenLDAP - Grundlegende Einrichtung

Diesen Beitrag schrieb ich 6 Jahre und 11 Monate zuvor; die nachfolgenden Ausführungen müssen heute nicht unbedingt noch genau so funktionieren. Behalte das beim Lesen (und vor allem: beim Nachmachen!) bitte stets im Hinterkopf.

Geschätzte Lesezeit: 3 Minuten

Meine Services sind umgezogen - von einem kleinen „Spiel-VPS“ auf einen „richtigen“. Diese Gelegenheit nutzte ich, mein eigenes kleines OpenLDAP aufzuziehen und diverse Dienste daran anzubinden. Das verwendete System ist ein Ubuntu 14.04 LTS, und die Angaben sind, wie immer, ohne Gewähr: bitte unbedingt mitdenken beim Nachmachen :-) OpenLDAP ist sicherlich etwas für den fortgeschrittenen User.

OpenLDAP worm Dein erster Schritt besteht darin, den benötigten Dienst und all seine Abhängigkeiten zu installieren. Im Anschluss daran stoppst du den Dienst aber direkt wieder, weil er dir mit der Default-Konfig ohnehin nichts nutzt.

$ apt-get install slapd ldap-utils
$ service slapd stop
Stopping OpenLDAP: slapd.

OpenLDAP konfigurieren

Bis vor einiger Zeit wurde das OpenLDAP-Backend noch über die Datei /etc/ldap/slapd.conf konfiguriert. Das wurde aufgegeben zugunsten einer Konfiguration über eine eigene kleine Datenbank - ich persönlich empfinde es als wahnsinnig fummlig, sogar als Rückschritt, ist doch eine Konfiguration in einem zentralen Konfig-File ist eigentlich das, was ich auf einem Unix-System erwarte. Glücklicherweise gibt es die Möglichkeit, eine slapd.conf per Befehl in eine cn=config-Datenbank zu transportieren. Daher ist meine Vorgehensweise, die slapd.conf wie gewünscht anzupassen, die alte DB wegzuschmeißen und die Konfig in eine neue DB einzutüten. Möchtest du es so nicht handhaben, so bitte ich dich, an dieser Stelle nicht weiterzulesen und dir die entsprechenden RTFMs zu Gemüte zu führen (und sie mir bei Gelegenheit bitte zu erklären, hehe). Der Dienst ist also gestoppt; die existierende Konfigurationsdatenbank muss nun verworfen werden, und wenn du auf Nummer sicher gehen willst, benennst du sie um oder kopierst sie weg - ich lösche ;-)

$ rm -rf /etc/ldap/slapd.d/*

Nun legst du dir eine Datei /etc/ldap/slapd.conf an, für den Anfang mit relativ minimalem Inhalt - sie wird ständig erweitert und an die jeweiligen Bedürfnisse angepasst. Binde die wichtigsten Schemata für den grundlegenden Betrieb ein, konfiguriere, wo deine Daten abgelegt werden sollen. Als Backend entscheide ich mich für Berkeley Data Base (BDB), auch wenn der Setup-Dialog die Verwendung von HDB empfiehlt (LDBM wird nicht mehr weiter gepflegt und sollte nicht mehr verwendet werden) - lies dich ein, was für deine Belange am ehesten passt. Als DNS Domain Name setze ich sysadmama.de ein, und meinen Admin-User nenne ich papaschlumpf (unter anderem auch deshalb, weil die meisten Attacken von außen gegen den User admin gehen); auch das ist Geschmackssache, du darfst dich kreativ austoben. Der User braucht ein Passwort; dazu rufst du in der Shell slappasswd auf, gibst das Passwort (doppelt) ein und kopierst den String ins Konfig-File (vgl. rootpw). Der User papaschlumpf darf im weiteren alles (rootdn is always granted unlimited privileges). Und so sieht das File aus:

## /etc/ldap/slapd.conf
include		/etc/ldap/schema/core.schema
include		/etc/ldap/schema/cosine.schema
include		/etc/ldap/schema/inetorgperson.schema
include		/etc/ldap/schema/nis.schema
pidfile		/var/run/slapd/slapd.pid
argsfile	/var/run/slapd/slapd.args
logfile		/var/log/slapd.log
#######################################################################
modulepath	/usr/lib/ldap
moduleload	back_bdb.la
database	bdb
suffix		"dc=sysadmama,dc=de"
rootdn		"cn=papaschlumpf,dc=sysadmama,dc=de"
rootpw		{SSHA}blablablablablablablablablabla
directory	/var/lib/ldap
index		objectClass,mail,surname,givenname	eq,pres
index		uidNumber,gidNumber,loginShell		eq,pres
index		uid,memberUid				eq,pres,sub
#######################################################################

Hieraus kannst du dir nun deine Konfigurationsdatenbank erstellen; wenn du das getan hast ist es extrem wichtig, die Zugriffsrechte zu korrigieren, da der Dienst sonst nicht mehr starten wird. Starte den Dienst anschließend durch und mache dich mit den Logs (zumeist in /var/log/syslog) vertraut - und ja, die sind durchaus gewöhnungsbedürftig…

$ slaptest -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d
$ chown -R openldap:openldap /etc/ldap/slapd.d/*
$ service slapd restart

Du kannst nun die erste Anfrage auf deinen OpenLDAP loslassen (die Ausgabe ist limitiert auf 499 Objekte, das nur so am Rande) - ein spannender Moment ;-) Du gehst als User papaschlumpf ran, das ist der, den du vorhin in der slapd.conf angelegt hattest, und genau dieses Passwort brauchst du nun auch. OpenLDAP ist leer, es muss erst noch mit Leben gefüllt werden …

$ ldapsearch -b 'dc=sysadmama,dc=de' -D 'cn=papaschlumpf,dc=sysadmama,dc=de' -W -s sub '(objectclass=*)'
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base  with scope subtree
# filter: (objectclass=*)
# requesting: ALL
# ...

Allerdings ist es ziemlich umständlich, immerzu das Passwort auf der Konsole einhacken zu müssen - insbesondere das Scripten wird dann schwierig. Du kannst es in einem nur für root lesbaren File ablegen und deine Aufrufe entsprechend anpassen:

$ echo DeinStrengGeheimesOpenLDAPPasswort > /etc/ldap/ldap.secret
$ chmod 0600 /etc/ldap/ldap.secret
$ ldapsearch -b 'dc=sysadmama,dc=de' -D 'cn=papaschlumpf,dc=sysadmama,dc=de' -w `cat /etc/ldap/ldap.secret` -s sub '(objectclass=*)'
...

Struktur in OpenLDAP

Für meinen Dienst habe ich folgenden Entwurf gewählt: im People-Ast sollen die aktiven User stecken, im Group-Ast die dazugehörigen Gruppen; und nicht mehr aktive User, die jedoch nicht direkt gelöscht werden sollen, finden ihren Platz in InactivePeople, ihre Gruppen analog dazu in InactiveGroup.

dc=sysadmama,dc=de
  + cn=papaschlumpf
  + ou=People
  + ou=Group
  + ou=InactivePeople
  + ou=InactiveGroup
  + ...

Diese initiale Struktur muss dem OpenLDAP nun beigebracht werden, ich entscheide mich für den Weg über ein LDIF, das heißt ich erfasse sie in der Datei Struktur.ldif und füge die Einträge anschließend mittels ldapadd hinzu:

$ ldapadd \
> -x \
> -D 'cn=papaschlumpf,dc=sysadmama,dc=de' \
> -w `cat /etc/ldap/ldap.secret` \
>-f Struktur.ldif
adding new entry "dc=sysadmama,dc=de"

adding new entry "cn=papaschlumpf,dc=sysadmama,dc=de"

adding new entry "ou=People,dc=sysadmama,dc=de"

adding new entry "ou=Group,dc=sysadmama,dc=de"

adding new entry "ou=InactivePeople,dc=sysadmama,dc=de"

adding new entry "ou=InactiveGroup,dc=sysadmama,dc=de"

Ich werde noch so einige Einträge hinzufügen - deshalb erstelle ich mir ein kleines Script /root/bin/AddLdapEntry.sh, das mir die Arbeit im folgenden erleichtern wird - der Aufruf von Struktur.ldif sähe damit dann so aus:

$ /root/bin/AddLdapEntry.sh Struktur.ldif

Den ersten User in OpenLDAP einfügen

+ dc=sysadmama,dc=de
  + cn=papaschlumpf
  + ou=People
  | + uid=firstuser
  | + ...
  + ou=Group
  | + cn=firstuser
  | + ...
  + ...

Zeit, den ersten User zu erstellen; er soll den Usernamen firstuser erhalten (FirstUser.ldif), denn sein Vorname ist First und sein Nachname ist User; UID/GID sollen jeweils 1000 sein, und er ist sozusagen ein Blatt am People-Ast. Auch sein Passwort wird mittels slappasswd ermittelt und im LDIF als userpassword hinterlegt. Die Gruppe firstuser wird ein Blatt am Group-Ast.

# Entry 1: uid=firstuser,ou=People,dc=sysadmama,dc=de
dn: uid=firstuser,ou=People,dc=sysadmama,dc=de
cn: First User
gecos: First User
gidnumber: 1000
givenname: First
homedirectory: /home/firstuser
homephone: +49 11 8 33
loginshell: /bin/bash
mail: firstuser@example.org
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: shadowAccount
objectclass: top
shadowinactive: 30
shadowlastchange: 16715
shadowmax: 90
shadowmin: 7
shadowwarning: 14
sn: User
uid: firstuser
uidnumber: 1000
userpassword: {SSHA}blablablablablablablablablabla

# Entry 1: cn=firstuser,ou=Group,dc=sysadmama,dc=de
dn: cn=firstuser,ou=Group,dc=sysadmama,dc=de
cn: firstuser
gidnumber: 1000
memberuid: firstuser
objectclass: posixGroup
objectclass: top
$ /root/bin/AddLdapEntry.sh FirstUser.ldif
adding new entry "uid=firstuser,ou=People,dc=sysadmama,dc=de

adding new entry "cn=firstuser,ou=Group,dc=sysadmama,dc=de"

OpenLDAP auf 127.0.0.1

Abschließend möchte ich noch dafür sorgen, dass der Dienst ausschließlich auf localhost lauscht; hierzu bearbeite ich die /etc/default/slapd wie nachfolgend und starte den Dienst durch:

SLAPD_SERVICES="ldap://127.0.0.1:389"
$ service slapd restart
$ ps aux | grep slapd
openldap  9073  0.0  0.2 117436  5520 ?        Ssl  22:15   0:00 /usr/sbin/slapd -h ldap://127.0.0.1:389 -g openldap -u openldap -F /etc/ldap/slapd.d
$ netstat -tulpen | grep slapd
tcp        0      0 127.0.0.1:389           0.0.0.0:*               LISTEN      0          3960253     9073/slapd

Herzlichen Glückwunsch!

Somit hast du ein grundlegendes OpenLDAP-Setup realisiert: der Dienst ist bereit, Anfragen entgegen zu nehmen. Noch läuft er unverschlüsselt, und aus Sicherheitsgründen lauscht er ausschließlich auf localhost - ein Setup, das dann in weiteren Schritten verfeinert werden kann.