OpenLDAP - Grundlegende Einrichtung
- OpenLDAP konfigurieren
- Struktur in OpenLDAP
- Den ersten User in OpenLDAP einfügen
- OpenLDAP auf 127.0.0.1
- Herzlichen Glückwunsch!
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.
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.
Hintergrundbild: Bild genauer anschauen – © Marianne Spiller – Alle Rechte vorbehalten