Logo der ic engineering & research GmbH
OpenLDAP

OpenLDAP

Einleitung

Für grössere Installationen und für Konzepte wie z.B. Single-Sign-On ist eine zentrale Benutzer-Datenbank unerlässlich. OpenLDAP stellt ein LDAP-Verzeichnis zur Verfügung, in welches man beliebig viele und unterschiedliche Informationen ablegen kann. So kann man z.B. DNS-Informationen, DHCP-Konfigurations-Daten und natürlich auch normale Benutzer-Konten speichern.

In diesem Dokument wird aufgezeigt, wie man die normale Benutzer-Verwaltung eines Linux-Systems so umstellt, dass die Konten direkt aus dem LDAP-Server kommen.

Voraussetzungen

Als Distribution und Grundlage setzen wir einen Server mit SuSE Linux 8.1 Professional ein.

Der LDAP-Server wird durch OpenLDAP2 in der Version 2.1.4 realisiert. Als Base-DN für den LDAP benutzen wir dc=icer, dc=local.

Hilfreich zum Verständnis der Datenbank und als Frontend praktisches Tool hat sich der LDAPBrowser(external link) bewährt.

Durch den Einsatz von SuSE 8.1 als Distribution wird einem ein Grossteil der notwendigen Konfigurationsschritte erspart; In diesem Dokument werden lediglich die notwendigen Ergänzungen bzw. Modifikationen beschrieben, um im LDAP Benutzer-Konten führen zu können. Bei anderen Distributionen sind z.T. weitere Modifikationen notwendig, auf die hier (noch) nicht eingegangen wird.

Vorbereitung

Zuerst muss mittels dem Verwaltungstool yast das OpenLDAP-Paket (Client und Server) installiert werden. Ebenfalls muss dafür gesorgt werden, dass der LDAP-Server in allen relevanten Runlevel gestartet wird.

ldap.conf

Die Datei /etc/openldap/ldap.conf enthält Konfigurations-Daten für LDAP-Clients. Einige Applikationen berücksichtigen diese Angaben und es ist deshalb sinnvoll, diese Datei korrekt aufzusetzen.

# $OpenLDAP
#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

#BASE   dc=example, dc=com
#URI    ldap://ldap.example.com ldap://ldap-master.example.com:666

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never
base    dc=icer, dc=local
uri     ldap://localhost
host    localhost
ldap_version    3

Die Datei enthält die Angabe zur Base-DN (dc=icer, dc=local), sowie wo der LDAP-Server gefunden wird (uri).

slapd.conf

Diese Datei, zu finden als /etc/openldap/slapd.conf, enthält die Konfiguration des LDAP-Servers. Hier wird definiert, welche Schemata er kennt, wer wie auf die Daten zugreifen darf (Protokollversion, Zugriffsrechte), und für welche Attribute ein Index angelegt werden soll. Die Base-DN wird unter dem Stichwort suffix eingetragen. Die Angaben rootdn sowie rootpw definieren den Administrations-Benutzer (da man ja im LDAP-Baum noch keinen Admin-Benutzer anlegen konnte. Wird rootpw so übernommen, lautet das Passwort ldapadmin).

Alternativ kann natürlich auch ein eigenes Passwort generiert werden. Dies erfolgt mittels slappasswd. Dieses Tool fragt nach dem Passwort und gibt anschliessend das Passwort als kodierten String aus, den man anschliessend in die slapd.conf-Datei eintragen kann. Beispiel aus der Datei: {SSHA}KKkJzYo8Kr9qA09dMcpXIZmZdEL+AINx.

# $OpenLDAP
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include    /etc/openldap/schema/core.schema
include    /etc/openldap/schema/cosine.schema
include    /etc/openldap/schema/nis.schema
include    /etc/openldap/schema/inetorgperson.schema

# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral  ldap://root.openldap.org

pidfile    /var/run/slapd/slapd.pid
argsfile  /var/run/slapd/slapd.args

# Load dynamic backend modules:
# modulepath  /usr/lib/openldap/openldap
# moduleload  back_bdb.la
# moduleload  back_ldap.la
# moduleload  back_ldbm.la
# moduleload  back_passwd.la
# moduleload  back_shell.la

#
# Sample access control policy:
#  Allow read access of root DSE
#  Allow self write access
#  Allow authenticated users read access
#  Allow anonymous users to authenticate
# Directives needed to implement policy:
#access to dn.base="" by * read
#access to *
#  by self write
#  by users read
#  by anonymous auth
#
# if no access controls are present, the default policy is:
#  Allow read by all
#
# rootdn can always write!

access to attr=userPassword
  by self read
  by anonymous auth
  by dn="cn=ldapadmin,dc=icer,dc=local" write
  by * none

access to *
  by dn="cn=ldapadmin,dc=icer,dc=local" write
  by * read

#######################################################################
# ldbm database definitions
#######################################################################

database  bdb
suffix    "dc=icer,dc=local"
rootdn    "cn=ldapadmin,dc=icer,dc=local"
# Cleartext passwords, especially for the rootdn, should
# be avoid.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
# PW: ldapadmin
rootpw    {SSHA}KKkJzYo8Kr9qA09dMcpXIZmZdEL+AINx
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd/tools. Mode 700 recommended.
directory  /var/lib/ldap
# Indices to maintain
index  objectClass  eq

Weitere Infos zu dieser Datei findet man in der Manual-Page (man slapd.conf).

LDAP-Grundstruktur erstellen

Nun geht es darum, unseren LDAP-Server mit ersten Daten zu versorgen. Mit diesen ersten Daten definieren wir eine Grundstruktur bzw. Organisation der Daten. Dies umfasst als erstes die Basis aller Informationen (dn: dc=icer,dc=local), sowie eine logische Gruppierung der Benutzer-Konten (dn: ou=people,dc=icer,dc=local).

dn: dc=icer,dc=local
objectclass: dcObject
objectclass: organization
o: Struktur ic engineering & research GmbH
dc: icer

dn: ou=people,dc=icer,dc=local
objectclass: top
objectclass: organizationalUnit
ou: people

Diese Angaben speichert man als /etc/openldap/base.ldif. LDIF-Dateien sind genormte Dateien für LDAP-Einträge und können problemlos importiert bzw. auch aus dem LDAP-Server exportiert werden.

Diese Daten kann man nun mittels dem Kommando ldapadd in den LDAP-Server importieren:

ldapadd -f /etc/openldap/base.ldif -x -D "cn=ldapadmin,dc=icer,dc=local" \
  -w ldapadmin

Es ist zu beachten, dass ldapadmin das Passwort für cn=ldapadmin,dc=icer,dc=local angibt.

Der erste Test

So, nun gilt es ernst. Nun sollte man mittels dem Tool LDAPBrowser mit dem LDAP-Server verbinden können (mit dem Benutzernamen cn=ldapadmin,dc=icer,dc=local und dem Passwort ldapadmin (sofern man bei den Vorgaben geblieben ist). Es sollten nun zwei Einträge sichtbar sein: dc=icer,dc=local und als Unter-"Ordner" ou=people,dc=icer,dc=local.

Benutzer anlegen

Wir wollen nun einen Benutzer anlegen. Als Namen vergeben wir user001. Alle Schritte führen wir manuell aus. Diese lassen sich aber natürlich auch automatisieren.

Als erstes legen wir das Home-Verzeichnis des neuen Benutzers an: mkdir /home/user001.

Nun erstellen wir eine entsprechende LDIF-Datei für den neuen Benutzer und speichern sie als /etc/openldap/user001.ldif:

dn: cn=user001,ou=people,dc=icer,dc=local
objectclass: organizationalRole
objectclass: posixAccount
cn: user001
uid: user001
uidNumber: 1000
gidNumber: 100
loginShell: /bin/bash
homeDirectory: /home/user001

Diese Daten lassen wir wiederum in den LDAP-Server eintragen:

ldapadd -f /etc/openldap/user001.ldif -x -D "cn=ldapadmin,dc=icer,dc=local" \
  -w ldapadmin

Nun muss dem Benutzer user001 nur noch ein Passwort vergeben werden. Dies wird mittels dem Tool ldappasswd erledigt:

ldappasswd -xv -D "cn=ldapadmin,dc=icer,dc=local" -w ldapadmin \
  -S "cn=user001,ou=people,dc=icer,dc=local"

Man wird analog dem Befehl passwd nach dem zu setzenden Passwort gefragt.

Nun muss man nur noch mittels chown user001:users /home/user001 den korrekten Benutzer sowie die korrekte Benutzergruppe setzen.

Jetzt ist es vollbracht. Nun sollte die Anmeldung als Benutzer user001 mit dem Passwort, das man vorher gesetzt hat, klappen.

Troubleshooting

Etwas ist schief gelaufen; die Anmeldung als Benutzer user001 klappt nicht.

Zuerst mittels dem LDAPBrowser prüfen, ob die Daten auch korrekt eingetragen wurden und das Attribut userPassword existiert (wird mittels dem Kommando ldappasswd generiert).

Scheint soweit alles i.O. zu sein, gilt es den Anmeldevorgang zu überwachen: In einem Terminal wird das Kommando tail -f /var/log/messages ausgeführt. Auf einem anderen Terminal versucht man sich als Benutzer user001 anzumelden. In der Log-Datei sollte man nun sehen, was schief läuft.

Weitere Infos

 

ic engineering & research GmbH
Oberfeldstrasse 120d
CH-8408 Winterthur
Telefon 052 223 13 70