OpenLDAP worm

wall < "OpenLDAP – Grundlegende Einrichtung"

Broadcast message from spillerm@unixe.de (pts/1) (Di Okt 13 10:28:12 2015):
4
Diesen Beitrag schrieb ich vor 3 Jahren. Behalte das beim Lesen bitte im Hinterkopf.

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 wormDein 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 wegzuschmeissen 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 aussen 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 anschliessend 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 <dc=sysadmama,dc=de> 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 heisst ich erfasse sie in der Datei Struktur.ldifGITHUB und füge die Einträge anschliessend 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.shGITHUB, 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.ldifGITHUB), 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

Abschliessend möchte ich noch dafür sorgen, dass der Dienst ausschliesslich 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 ausschliesslich auf localhost — ein Setup, das in weiteren Schritten verfeinert werden kann.

4
  1. Pingback: OpenLDAP und munin - /sys/adm/ama

  2. Pingback: OpenLDAP, sendmail und aliases - /sys/adm/ama

Keine weitere Reaktionen mehr möglich.