ubuntuusers.deWikiOpenLDAP

OpenLDAP

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

OpenLDAP {en} stellt das Anwendungsprotokoll LDAP als freie Software für Linux zur Verfügung. Mit diesem Dienst ist es beispielsweise möglich, eine zentrale Benutzerverwaltung aufzubauen. Zudem kann OpenLDAP als Adressbuch eingesetzt werden. Der LDAP-Verzeichnisdienst ist eine hierarchische Datenbank, in der strukturierte Objekte abgelegt werden. Jedes Objekt wird mit einer Menge von Attributen ausgestattet, die in einer Objektklasse festgelegt sind. Ein Objekt kann dazu mehreren Objektklassen angehören, um unterschiedliche Eigenschaften auszudrücken.

Hinweis:

LDAP ist ein recht komplexes Thema. Es ist empfehlenswert vor der Nutzung weitere Literatur zu gebrauchen, um ein besseres Verständnis für die Funktionsweise und die Möglichkeiten zu bekommen.

Installation

Die Installation von OpenLDAP ist leider etwas kompliziert geworden. So wird nicht mehr nach einem Admin-Passwort gefragt, und man muss die Datenbank selbst aufsetzen. Das geht übrigens nur mehr mit dem Root-Benutzerrechten des Rechners, auf dem OpenLDAP später seine Arbeit verrichten soll. Hier {en} gibt es ein offizielles Statement dazu (in Kurzform: das ist Teil einer zukünftigen Strategie, um LDAP breitgefächerter - v.a. in Unternehmen - einzusetzen, Stichwort: z.B. Kerberos).

Hinweis:

Die folgenden Befehle müssen immer als root ausgeführt werden:

Ubuntu-Pakete installieren

Am Anfang steht natürlich die Installation[1] von OpenLDAP:

  • slapd

  • ldap-utils

Wiki/Vorlagen/Installbutton/button.png

Weitere Pakete sind optional und für die Funktionalität von OpenLDAP nicht zwingend erforderlich.

Achtung!

slapd kann nicht mehr mittels Dialog über dpkg-reconfigure slapd konfiguriert werden. Die Eingabe von dpkg-reconfigure slapd setzt das cn=config-Backend in den Ausgangszustand zurück. Alle nachfolgend beschriebenen Konfigurationsschritte an dem Backend müssen dann neu ausgeführt werden. Es ist deswegen ratsam, die für die Konfiguration verwendeten ldif-Dateien im Verzeichnis /etc/ldap abzulegen, damit die Informationen nicht verloren gehen. dpkg-reconfigure slapd sollte nur noch zum gezielten Zurücksetzen des Backends verwendet werden. Das eigentliche LDAP-Verzeichnis bleibt dabei erhalten.

LDAP-Schemata einfügen

Anschließend fügt man einige von Ubuntu im LDIF-Format schon mitgelieferte Schemata hinzu. Bis Ubuntu Maverick Meerkat 10.10 ist core.schema ist das einzige Schema, bei der Installation von slapd automatisch in das cn=config-Backend aufgenommen wird):

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif 

Ab Ubuntu Natty Narwhal 11.04 kann man auch noch folgende weitere Schemata hinzufügen:

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/misc.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/openldap.ldif 

Weitere Schemata (wie z. B. samba.schema), die nicht im LDIF-Format vorliegen, müssen zunächst konvertiert werden. Das folgende Beispiel fügt die gängigsten Schemata hinzu:

  1. Erstellen einer Datei schema_convert.conf im Verzeichnis /etc/ldap/schema mit folgendem Inhalt:

include /etc/ldap/schema/core.schema
include /etc/ldap/schema/collective.schema
include /etc/ldap/schema/corba.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/duaconf.schema
include /etc/ldap/schema/dyngroup.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/java.schema
include /etc/ldap/schema/misc.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/openldap.schema
include /etc/ldap/schema/ppolicy.schema
include /etc/ldap/schema/amavis.schema
include /etc/ldap/schema/ldapns.schema
# PMI schema makes problems when checking
# database with slapcat for correctness
# in Ubuntu 9.10; see bug report
# include /etc/ldap/schema/pmi.schema
include /etc/ldap/schema/samba.schema

Auch die schon in die cn=config-Datenbank eingefügten Schemata müssen in schema_convert.conf aufgeführt werden, da die anderen Schemata teilweise. auf sie aufbauen.

Hinweis:

Man beachte, dass Canonical darauf hinarbeitet, die OpenLDAP-Pakete von allen LDAP-anwendungsspezifischen Konfigurationen zu befreien und diese stattdessen in die Installationsskripts der Anwendungen zu verlagern. So könnte z.B. in zukünftigen Ubuntu-Releases ein Installationsskript des Samba-Pakets das samba.schema automatisch zum cn=config-Verzeichnis hinzufügen. Bis Ubuntu Natty Narwhal 11.04 läuft das leider noch nicht so komfortabel. Canonical legt stattdessen die Schemata 'samba.schema' und 'ldapns.schema' im doc-Verzeichnis der Anwendungen ab.

Das Schema samba.schema bekommt man über das Paket:

  • samba-doc

Wiki/Vorlagen/Installbutton/button.png

gunzip /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz
cp -v /usr/share/doc/samba-doc/examples/LDAP/samba.schema /etc/ldap/schema 

Das Schema amavis.schema ist über das gleichnamige Paket zu beziehen:

  • amavis

Wiki/Vorlagen/Installbutton/button.png

Bis Ubuntu Maverick Meerkat 10.10 bekommt man das Schema ldapns.schema über das Paket:

  • libpam-ldap

Wiki/Vorlagen/Installbutton/button.png

Bei der Installation des Pakets öffnet sich ein Konfigurationsdialog, der im Kapitel LDAP Authentication beschrieben wird. Spätere Änderungen an der LDAP-Authentication-Konfiguration sind jederzeit möglich durch Aufruf von dpkg-reconfigure ldap-auth-config.

cp -v /usr/share/doc/libpam-ldap/ldapns.schema /etc/ldap/schema 

Ab Ubuntu Natty Narwhal 11.04 muss man auch das Schema amavis.schema nachinstallieren. Man bekommt es über das Paket:

  • amavisd-new

Wiki/Vorlagen/Installbutton/button.png

direkt in das Verzeichnis /etc/ldap/schema installiert.

2. Erstellen eines temporären Verzeichnisses für die LDIF-Dateien

mkdir /tmp/ldif_output 

3. Konvertieren der Schemata ins LDIF-Format mit Hilfe von slapcat und Kopieren ins Verzeichnis /etc/ldap/schema:

cd /etc/ldap/schema
slapcat -f schema_convert.conf -F /tmp/ldif_output -n0 
cd /tmp/ldif_output/cn\=config/cn\=schema/
cp cn={11}ppolicy.ldif cn={12}amavis.ldif cn={13}ldapns.ldif cn={14}samba.ldif cn={2}corba.ldif cn={4}duaconf.ldif cn={5}dyngroup.ldif cn={7}java.ldif /etc/ldap/schema 

4. Öffnen der neuen LDIF-Dateien in einem Editor und Anpassen der Attribute dn (in der 1. Zeile) und cn (in der 3. Zeile), nachfolgend gezeigt am Beispiel des samba-Schemas:

dn: cn=samba,cn=schema,cn=config
...
cn: samba

Löschen der letzten sieben Zeilen in der LDIF-Datei:

structuralObjectClass: olcSchemaConfig
entryUUID: bc124984-712d-102e-9274-5bec14760b98
creatorsName: cn=config
createTimestamp: 20091129122324Z
entryCSN: 20091129122324.626040Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20091129122324Z

Wer mag, kann die neuen LDIF-Dateien anschließend noch umbenennen, um das lästige 'cn={x}' aus dem Dateinamen zu entfernen.

5. Abschließend werden die Schemata dem config-Backend hinzugefügt:

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/ppolicy.ldif 
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/amavis.ldif 
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/ldapns.ldif 
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/samba.ldif 
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/corba.ldif 
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/duaconf.ldif 
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/dyngroup.ldif 
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/java.ldif  

Konfiguration über cn=config-Datenbank (/etc/ldap/slapd.d)

Nachdem nun alle Schemata ins Backend eingefügt worden sind, setzt man die initiale cn=config-Datenbank auf. Diese Datenbank hält die gesamte Konfiguration von OpenLDAP, welche bis Ubuntu 8.04 in /etc/ldap/slapd.conf geschrieben stand. Zunächst muss man dazu ein Passwort für die LDAP-Superuser festlegen. Für diesen Wiki-Artikel werden beispielhaft zwei Superuser im LDAP-Backend angelegt:

  • cn=admin,cn=config (Root für die cn=config-Datenbank, d. h. das Konfigurationsverzeichnis des LDAP-Servers)

  • cn=admin,dc=meinedomain,dc=local (Root für das eigentliche LDAP-Verzeichnis der Domäne meinedomain.local).

Beiden LDAP-Root-Benutzern wird beispielhaft das Passwort '1234' vergeben. Das Passwort sollte natürlich angepasst und nur verschlüsselt in cn=config abgelegt werden. Deshalb wird zunächst ein Hash des Passwortes erzeugt:

slappasswd 

New password: 1234
Re-enter new password: 1234
{SSHA}dx0sCgNBPlx98eRYnun1QBNfrWUR6qM1

Den Hash sollte man sich notieren, da er nachfolgend immer wieder benötigt wird.

Ab Ubuntu Natty Narwhal 11.04 wird die cn=config-Datenbank weitgehend schon bei der Installation aufgesetzt. Es sind dennoch einige Anpassungen ratsam. Dafür erstellt man eine Datei db.ldif. Dort fügt man folgendes ein:

###########################################################
# DEFAULT DATABASE MODIFICATION
###########################################################

# Modify directory database
dn: olcDatabase={1}hdb,cn=config
changeType: modify
delete: olcSuffix

dn: olcDatabase={1}hdb,cn=config
changeType: modify
add: olcSuffix
olcSuffix: dc=meinedomain,dc=local

dn: olcDatabase={1}hdb,cn=config
changeType: modify
delete: olcRootDN

dn: olcDatabase={1}hdb,cn=config
changeType: modify
add: olcRootDN
olcRootDN: cn=admin,dc=meinedomain,dc=local

dn: olcDatabase={1}hdb,cn=config
changeType: modify
delete: olcRootPW

dn: olcDatabase={1}hdb,cn=config
changeType: modify
add: olcRootPW
olcRootPW: {SSHA}dx0sCgNBPlx98eRYnun1QBNfrWUR6qM1

dn: olcDatabase={1}hdb,cn=config
changeType: modify
delete: olcDbIndex

dn: olcDatabase={1}hdb,cn=config
changeType: modify
add: olcDbIndex
olcDbIndex: uid pres,eq

dn: olcDatabase={1}hdb,cn=config
changeType: modify
delete: olcDbIndex

dn: olcDatabase={1}hdb,cn=config
changeType: modify
add: olcDbIndex
olcDbIndex: cn,sn,mail pres,eq,approx,sub

dn: olcDatabase={1}hdb,cn=config
changeType: modify
delete: olcDbIndex

dn: olcDatabase={1}hdb,cn=config
changeType: modify
add: olcDbIndex
olcDbIndex: objectClass eq

###########################################################
# REMOTE CONFIGURATION DEFAULTS
###########################################################
# Some defaults need to be added in order to allow remote 
# access by DN cn=admin,cn=config to the LDAP config 
# database. Otherwise only local root will 
# administrative access.

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootDN
olcRootDN: cn=admin,cn=config

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}dx0sCgNBPlx98eRYnun1QBNfrWUR6qM1

Bis Ubuntu Maverick Meerkat 10.10 sieht die Datei db.ldif wie folgt aus:

###########################################################
# DATABASE SETUP
###########################################################

# Load modules for database type
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_hdb

# Create directory database
dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=meinedomain,dc=local
olcRootDN: cn=admin,dc=meinedomain,dc=local
olcRootPW: {SSHA}dx0sCgNBPlx98eRYnun1QBNfrWUR6qM1
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=meinedomain,dc=local" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=meinedomain,dc=local" write by * read
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lk_max_objects 1500
olcDbConfig: {2}set_lk_max_locks 1500
olcDbConfig: {3}set_lk_max_lockers 1500
olcDbIndex: uid pres,eq
olcDbIndex: cn,sn,mail pres,eq,approx,sub
olcDbIndex: objectClass eq

###########################################################
# REMOTE CONFIGURATION DEFAULTS
###########################################################
# Some defaults need to be added in order to allow remote 
# access by DN cn=admin,cn=config to the LDAP config 
# database. Otherwise only local root will 
# administrative access.

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootDN
olcRootDN: cn=admin,cn=config

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}dx0sCgNBPlx98eRYnun1QBNfrWUR6qM1

Der Wert für das Attribut 'olcRootPW' sollte natürlich durch den weiter oben erzeugten eigenen Passwort-Hash ersetzt werden.

Diese Konfiguration wird mit folgendem Befehl in slapd eingelesen:

ldapadd -Y EXTERNAL -H ldapi:/// -f db.ldif 

Dadurch wird ein Superuser cn=admin,dc=meinedomain,dc=local mit dem Passwort 1234 erstellt, der von nun an alle Rechte am LDAP-Verzeichnis für meinedomain.local hat und über dessen Account nachfolgend das eigentliche LDAP-Verzeichnis initialisiert wird. Das Passwort sollte natürlich angepasst werden.

Bis Ubuntu Maverick Meerkat 10.10 muss man jetzt noch die minimalen Einträge für den LDAP DIT (= "Directory Information Tree", also das eigentliche Verzeichnis des LDAP-Servers) anlegen. Dazu erstellt man eine weitere Datei namens base.ldif und fügt dort folgendes ein:

# Tree root
dn: dc=meinedomain,dc=local
objectClass: dcObject
objectClass: organization
o: meinedomain.local
dc: meinedomain
description: Tree root

# LDAP admin
dn: cn=admin,dc=meinedomain,dc=local
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
userPassword: {SSHA}dx0sCgNBPlx98eRYnun1QBNfrWUR6qM1
description: LDAP administrator

Hier wird nun der eigentliche LDAP-Administrator für das meinedomain.local-Verzeichnis definiert. Über diesen Account wird nachfolgend dann das Verzeichnis Schritt für Schritt mit Daten (wie z. B. Beutzeraccounts und deren Passwörter) gefüllt. Bitte auch hier den Passwort-Hash entsprechend anpassen.

Die Datei base.ldif wird über den Superuser-Account "cn=admin,dc=meinedomain,dc=local" eingelesen (wenn nach dem Passwort gefragt wird, das weiter oben definierte Passwort, im Wiki-Artikel beispielhaft "1234", eingeben.):

ldapadd -x -D cn=admin,dc=meinedomain,dc=local -W -f base.ldif 

Ab jetzt sollte man auf dem Stand einer frischen Installation von OpenLDAP wie unter Ubuntu Jaunty Jackalope 9.04 sein und kann das LDAP-Verzeichnis ganz normal weiter aufsetzen.

Testen

Mit den folgenden Befehlen, die direkt auf dem Rechner mit dem OpenLDAP-Server ausgeführt werden müssen, kann die LDAP-Konfiguration testweise ausgelesen werden:

ldapsearch -xLLL -b cn=config -D cn=admin,cn=config -W olcDatabase={1}hdb
ldapsearch -xLLL -b cn=config -D cn=admin,cn=config -W 

Um die Konfiguration etwas komfortabler darzustellen, kann ein beliebiger LDAP-Browser verwendet werden, indem als Basis-DN 'cn=config' (nicht: dc=meinedomain,dc=local) angegeben wird.

Zum Auslesen der eigentlichen Verzeichnisdaten dient folgender Befehl (diesmal als anonymer Benutzer ohne Passworteingabe - daher wird beim Eintrag unter cn=admin,dc=meinedomain,dc=local das Passwort-Attribut nicht angezeigt):

ldapsearch -xLLL -b dc=meinedomain,dc=local 

Weitere Konfiguration

Im nachfolgenden Kapitel wird nun zunächst die Installation des LDAP-Servers bis Ubuntu Jaunty Jackalope 9.04 beschrieben. Anschließend folgen weitere Kapitel, in denen z. B. die Migration existierender Benutzer-Accounts nach LDAP und die LDAP-Authentication vorgestellt werden. Mit nachfolgendem Link gelangen Nutzer von Ubuntu 9.10 und später direkt dorthin: {Weitere Konfiguration}

Installation bis Ubuntu 9.04

Ubuntu-Pakete installieren

Hinweis:

Die folgenden Befehle müssen immer als root ausgeführt werden:

Als erstes müssen die entsprechenden Pakete heruntergeladen und installiert werden:

  • slapd

  • ldap-utils

  • php5-ldap

  • db4.2-util

Wiki/Vorlagen/Installbutton/button.png

Paketliste zum Kopieren:

sudo apt-get install slapd ldap-utils php5-ldap db4.2-util 

sudo aptitude install slapd ldap-utils php5-ldap db4.2-util 

Zum Testen wird außerdem - optional - das Paket

  • nmap

Wiki/Vorlagen/Installbutton/button.png

benötigt.

Unter Ubuntu 8.10 und 9.04 wurde das Verfahren zum Einrichten des LDAP-Servers sehr vereinfacht. Nach der Installation gibt man am Terminal

sudo dpkg-reconfigure slapd

ein und wird dann mit ein paar Fragen durch die Grundkonfiguration geführt. Danach kann man die weitere Konfiguration bequem mit phpldapadmin durchführen. Dieses Verfahren funktioniert allerdings ab Ubuntu 9.10 nicht mehr.

Damit ist die Grundinstallation abgeschlossen. Während der Installation von slapd wird man übrigens nach einem Passwort gefragt. Dort gibt man ein neues Passwort ein.

{top}

Vorbereitung und Allgemeines

Test mittels lsof

Wenn man nmap noch nicht installiert hat bzw. nicht installieren möchte, kann man aber auch lsof zum Überprüfen des LDAP-Servers verwenden [3]. Dieses ist meistens schon in der Grundinstallation von Ubuntu enthalten.

lsof -a -i TCP:389 -c slapd  

Die Ausgabe sollte etwa so aussehen:

COMMAND  PID     USER   FD   TYPE  DEVICE SIZE NODE NAME
slapd   9395 openldap    8u  IPv6 1616216       TCP *:ldap (LISTEN)
slapd   9395 openldap    9u  IPv4 1616217       TCP *:ldap (LISTEN)

Hier ist zu erkennen, dass slapd auf Port 389 lauscht. Der Server läuft also ordnungsgemäß.

Test mittels nmap

Jetzt kann man überprüfen, ob der neue LDAP-Server auch läuft. Dazu kann man z.B. nmap nutzen [3].

nmap localhost | grep ldap 

Nun sollte Folgendes erscheinen:

389/tcp open ldap

SSHA-Schlüssel

Bis einschließlich Ubuntu Hard Heron 8.04 benötigt man einen SSHA-Schlüssel als Passwort, der durch folgenden Befehl vom System generiert wird:

slappasswd 
New password: PASSWORT
Re-enter new password: PASSWORT
{SSHA}...

Den so generierten Schlüssel muss man sich nun merken, er wird später für die Konfiguration benötigt.

Konfiguration mittels slapd.conf

Hinweis:

Seit Ubuntu 8.10 wird nicht mehr die slapd.conf-Konfigurationsdatei verwendet, sondern die Konfiguration ins LDAP-Verzeichnis (cn=config) selbst geschrieben. Das hat einige Vorteile, u.a. dass der OpenLDAP-Server bei Konfigurationsänderungen nicht mehr neu gestartet werden muss. Die Vorteile werden allerdings mit einer etwas umständlicheren Konfiguration erkauft.

Wer also statt der cn=config lieber die alte Konfigurationsmethode über die Datei slapd.conf verwenden will, erstellt die Datei slapd.conf im Verzeichnis /etc/ldap und kopiert nachfolgende Konfiguration in die Datei.

# This is the main slapd configuration file. See slapd.conf for more
# info on the configuration options.

#######################################################################
# Global Directives:

# Features to permit
# allow bind_v2

# Schema and objectClass definitions
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema

# Where the pid file is put. The init.d script
# will not stop the server if you change this.
pidfile         /var/run/slapd/slapd.pid

# List of arguments that were passed to the server
argsfile        /var/run/slapd/slapd.args

# Read slapd.conf(5) for possible values
loglevel        none

# Where the dynamically loaded modules are stored
modulepath    /usr/lib/ldap
moduleload    back_hdb

# The maximum number of entries that is returned for a search operation
sizelimit 500

# The tool-threads parameter sets the actual amount of cpu's that is used
# for indexing.
tool-threads 1

#######################################################################
# Specific Backend Directives for hdb:
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
backend        hdb

#######################################################################
# Specific Backend Directives for 'other':
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
#backend        <other>
database config
#######################################################################
# Specific Directives for database #1, of type hdb:
# Database specific directives apply to this databasse until another
# 'database' directive occurs
database        hdb

# The base of your directory in database #1
suffix          "dc=yourdomain,dc=tld"

# rootdn directive for specifying a superuser on the database. This is needed
# for syncrepl.
rootdn          "cn=admin,cn=config"

# Where the database file are physically stored for database #1
directory       "/var/lib/ldap"

# The dbconfig settings are used to generate a DB_CONFIG file the first
# time slapd starts.  They do NOT override existing an existing DB_CONFIG
# file.  You should therefore change these settings in DB_CONFIG directly
# or remove DB_CONFIG and restart slapd for changes to take effect.

# For the Debian package we use 2MB as default but be sure to update this
# value if you have plenty of RAM
dbconfig set_cachesize 0 2097152 0

# Sven Hartge reported that he had to set this value incredibly high
# to get slapd running at all. See http://bugs.debian.org/303057 for more
# information.

# Number of objects that can be locked at the same time.
dbconfig set_lk_max_objects 1500
# Number of locks (both requested and granted)
dbconfig set_lk_max_locks 1500
# Number of lockers
dbconfig set_lk_max_lockers 1500

# Indexing options for database #1
index           objectClass eq

# Save the time that the entry gets modified, for database #1
lastmod         on

# Checkpoint the BerkeleyDB database periodically in case of system
# failure and to speed slapd shutdown.
checkpoint      512 30

# Where to store the replica logs for database #1
# replogfile    /var/lib/ldap/replog

# The userPassword by default can be changed
# by the entry owning it if they are authenticated.
# Others should not be able to see it, except the
# admin entry below
# These access lines apply to database #1 only
# acl specific for phamm

access to attrs=userPassword,shadowLastChange
        by dn="cn=admin,dc=webhabitat,dc=be" write
        by anonymous auth
        by self write
        by * none

access to *
        by dn="cn=admin,dc=yourdomain,dc=tld" write
        by * read

access to dn.base="" by * read

# For Netscape Roaming support, each user gets a roaming
# profile for which they have write access to
#access to dn=".*,ou=Roaming,o=morsnet"
#        by dn="cn=admin,dc=yourdomain,dc=tld" write
#        by dnattr=owner write

#######################################################################
# Specific Directives for database #2, of type 'other' (can be hdb too):
# Database specific directives apply to this databasse until another
# 'database' directive occurs
#database        <other>

# The base of your directory for database #2
#suffix        "dc=debian,dc=org"

Nun sucht man folgende Zeile und ändert diese nach seinen Bedürfnissen ab:

suffix "dc=meinedomain,dc=local"

Und am Ende der Datei fügt man Folgendes ein:

rootdn "cn=admin,dc=meinedomain,dc=local"
rootpw {SSHA}...

Dort fügt man den SSHA-Schlüssel ein, den man vorhin generiert habt.

slapd.conf "aktivieren"

Jetzt muss die neue slapd.conf erst „aktiviert“ werden.

Zunächst stoppt man den LDAP-Server:

/etc/init.d/slapd stop 

Danach geht man in den entsprechenden Ordner /etc/ldap

Die alte Konfiguration slapd.d wird zunächst gesichert, z.B. im Terminal [2] mit

mv slapd.d slapd.d.bck 

Danach erstellt man ein neues slapd.d-Verzeichnis und lädt die slapd.conf

mkdir slapd.d
slaptest -f slapd.conf -F slapd.d 

Nun sollte Folgendes erscheinen:

config file testing succeeded

Jetzt werden nur noch die Benutzerrechte der neuen Konfigurationsdatei geändert [4]:

chown -R openldap:openldap slapd.d 

Nun kann der LDAP-Server wieder gestartet werden:

/etc/init.d/slapd start 

Jetzt könnte man die slapd.conf wieder löschen, es empfiehlt sich allerdings, diese für eine spätere Änderung beizubehalten. Dazu muss man diese allerdings wieder wie oben beschrieben Schritt für Schritt „aktivieren“.

Dies ist aber erst ab Ubuntu 8.10 nötig. Bei älteren Versionen reicht das Bearbeiten der slapd.conf und anschließende Neustarten des LDAP-Servers aus.

LDAP-Admin-Benutzer hinzufügen

Im nächsten Schritt muss man dem LDAP-Server einen Verzeichnisadministrator mitteilen. Dazu erstellt man eine Datei base.ldif. Dort fügt man Folgendes ein:

dn:dc=meinedomain,dc=local
objectClass: dcObject
objectClass: organization
o: meinedomain
dc: meinedomain

dn:cn=admin,dc=meinedomain,dc=local
objectClass: organizationalRole
cn: admin

Dieses muss jetzt nur noch in die LDAP-Datenbank eingefügt werden.

ldapadd -x -h <hostname> (-p <port>) -W -D cn=admin,dc=meinedomain,dc=local -f base.ldif 

Enter LDAP Password: PASSWORT
adding new entry "dc=meinedomain,dc=local"
adding new entry "cn=admin,dc=meinedomain,dc=local"

Jetzt überprüft man nur noch, ob der neue Benutzer auch eingetragen wurde:

ldapsearch -x 

# extended LDIF
#
# LDAPv3
# base <> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#
# meinedomain.local
dn: dc=meinedomain,dc=local
objectClass: dcObject
objectClass: organization
o: meinedomain
dc: meinedomain
# admin, meinedomain.local
dn: cn=admin,dc=meinedomain,dc=local
objectClass: organizationalRole
cn: admin
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2

Damit ist die Konfiguration abgeschlossen und der LDAP-Server läuft.

LDAP Client konfigurieren

Damit die Clients wissen, wo sie den LDAP-Server finden, müssen ihnen ein paar grundlegende Informationen bekannt gemacht werden. Dazu öffnet man die Datei [3] /etc/ldap/ldap.conf und ändert den Inhalt:

ldap_version 3
URI ldap://meinedomain.local
SIZELIMIT 0
TIMELIMIT 0
DEREF never
BASE dc=meinedomain,dc=local 

Danach wird die Datei gespeichert und geschlossen.

{top}

Linux-Benutzeraccounts nach LDAP migrieren

Für die Migration der in den Dateien /etc/passwd und /etc/group abgelegten Linux-Benutzer- und Gruppen-Accounts stellt Ubuntu ein Skript zur Verfügung. Dieses Skript ist Teil des Pakets smbldap-tools, das eigentlich Werkzeuge für die vereinfachte Konfiguration eines Samba-Servers zur Verfügung stellt. Es kann aber auch, ohne dass ein Samba-Server verwendet wird, benutzt werden. Nachfolgend die für die Migration erforderlichen Schritte:

  1. Anlegen der für die Migration benötigten LDAP-OUs

Erstellen der Datei init.ldif im Verzeichnis /etc/ldap. Ersetze 'dc=meinedomain,dc=local' durch den eigenen Domänenname:

dn: ou=Users,dc=meinedomain,dc=local
objectClass: organizationalUnit
ou: Users

dn: ou=Groups,dc=meinedomain,dc=local
objectClass: organizationalUnit
ou: Groups

dn: ou=Computers,dc=meinedomain,dc=local
objectClass: organizationalUnit
ou: Computers

dn: ou=Idmap,dc=meinedomain,dc=local
objectClass: organizationalUnit
ou: Idmap

Diese müssen jetzt nur noch in die LDAP-Datenbank eingefügt werden:

sudo ldapadd -x -h <hostname> (-p <port>) -W -D cn=admin,dc=meinedomain,dc=local -f init.ldif 

2. Installation und Konfiguration des Pakets

  • smbldap-tools

Wiki/Vorlagen/Installbutton/button.png

Die Skripte aus dem smbldap-tools-Paket werden über die Dateien smbldap.conf und smbldap_bind.conf im Verzeichnis /etc/smbldap-tools konfiguriert. Das Verzeichnis ist nach der Installation des Paketes zwar vorhanden, es fehlen aber die Konfigurationsdateien. Die Vorlagen hierfür liegen unter /usr/share/doc/smbldap-tools/examples. Die nachfolgenden Befehle müssen immer als root ausgeführt werden:

cd /etc/smbldap-tools
zcat /usr/share/doc/smbldap-tools/examples/smbldap.conf.gz > smbldap.conf
cat /usr/share/doc/smbldap-tools/examples/smbldap_bind.conf > smbldap_bind.conf
chmod 0644 smbldap.conf
chmod 0600 smbldap_bind.conf 

Anschließend die Datei smbldap.conf editieren und das LDAP-Suffix korrekt einstellen, d.h. auf das bei der Konfiguration von OpenLDAP (siehe oben) verwendete Suffix dc=meinedomain,dc=local. Wenn kein Samba-Server installiert ist, sollten die Einträge für SID und sambaDomain auskommentiert werden. Wenn kein TLS für den LDAP-Server verwendet wird, sollten auch die Werte für verify, cafile, clientcert und clientkey entfernt werden. Andernfalls entsprechend der slapd.conf bzw. des cn=config-Backends einstellen. Die abgeänderte Datei sollte dann in etwa so aussehen:

...
##############################################################################
#
# General Configuration
#
##############################################################################

# Put your own SID. To obtain this number do: "net getlocalsid".
# If not defined, parameter is taking from "net getlocalsid" return
# SID="S-1-5-21-2252255531-4061614174-2474224977"

# Domain name the Samba server is in charged.
# If not defined, parameter is taking from smb.conf configuration file
# Ex: sambaDomain="IDEALX-NT"
# sambaDomain="DOMSMB"

##############################################################################
#
# LDAP Configuration
#
##############################################################################

# Notes: to use to dual ldap servers backend for Samba, you must patch
# Samba with the dual-head patch from IDEALX. If not using this patch
# just use the same server for slaveLDAP and masterLDAP.
# Those two servers declarations can also be used when you have 
# . one master LDAP server where all writing operations must be done
# . one slave LDAP server where all reading operations must be done
#   (typically a replication directory)

# Slave LDAP server
# Ex: slaveLDAP=127.0.0.1
# If not defined, parameter is set to "127.0.0.1"
slaveLDAP="127.0.0.1"

# Slave LDAP port
# If not defined, parameter is set to "389"
slavePort="389"

# Master LDAP server: needed for write operations
# Ex: masterLDAP=127.0.0.1
# If not defined, parameter is set to "127.0.0.1"
masterLDAP="127.0.0.1"

# Master LDAP port
# If not defined, parameter is set to "389"
masterPort="389"

# Use TLS for LDAP
# If set to 1, this option will use start_tls for connection
# (you should also used the port 389)
# If not defined, parameter is set to "1"
ldapTLS="0"

# How to verify the server's certificate (none, optional or require)
# see "man Net::LDAP" in start_tls section for more details
verify=""

# CA certificate
# see "man Net::LDAP" in start_tls section for more details
cafile=""

# certificate to use to connect to the ldap server
# see "man Net::LDAP" in start_tls section for more details
clientcert=""

# key certificate to use to connect to the ldap server
# see "man Net::LDAP" in start_tls section for more details
clientkey=""

# LDAP Suffix
# Ex: suffix=dc=IDEALX,dc=ORG
suffix="dc=meinedomain,dc=local"

# Where are stored Users
# Ex: usersdn="ou=Users,dc=IDEALX,dc=ORG"
# Warning: if 'suffix' is not set here, you must set the full dn for usersdn
usersdn="ou=Users,${suffix}"

# Where are stored Computers
# Ex: computersdn="ou=Computers,dc=IDEALX,dc=ORG"
# Warning: if 'suffix' is not set here, you must set the full dn for computersdn
computersdn="ou=Computers,${suffix}"

# Where are stored Groups
# Ex: groupsdn="ou=Groups,dc=IDEALX,dc=ORG"
# Warning: if 'suffix' is not set here, you must set the full dn for groupsdn
groupsdn="ou=Groups,${suffix}"

# Where are stored Idmap entries (used if samba is a domain member server)
# Ex: groupsdn="ou=Idmap,dc=IDEALX,dc=ORG"
# Warning: if 'suffix' is not set here, you must set the full dn for idmapdn
idmapdn="ou=Idmap,${suffix}"

# Where to store next uidNumber and gidNumber available for new users and groups
# If not defined, entries are stored in sambaDomainName object.
# Ex: sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"
# Ex: sambaUnixIdPooldn="cn=NextFreeUnixId,${suffix}"
sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"

# Default scope Used
scope="sub"

# Unix password encryption (CRYPT, MD5, SMD5, SSHA, SHA, CLEARTEXT)
hash_encrypt="SSHA"

# if hash_encrypt is set to CRYPT, you may set a salt format.
# default is "%s", but many systems will generate MD5 hashed
# passwords if you use "$1$%.8s". This parameter is optional!
crypt_salt_format=""

##############################################################################
# 
# Unix Accounts Configuration
# 
##############################################################################

# Login defs
# Default Login Shell
# Ex: userLoginShell="/bin/bash"
userLoginShell="/bin/bash"

# Home directory
# Ex: userHome="/home/%U"
userHome="/home/%U"

# Default mode used for user homeDirectory
userHomeDirectoryMode="700"

# Gecos
userGecos="System User"

# Default User (POSIX and Samba) GID
defaultUserGid="513"

# Default Computer (Samba) GID
defaultComputerGid="515"

# Skel dir
skeletonDir="/etc/skel"

# Default password validation time (time in days) Comment the next line if
# you don't want password to be enable for defaultMaxPasswordAge days (be
# careful to the sambaPwdMustChange attribute's value)
defaultMaxPasswordAge="45"

##############################################################################
#
# SAMBA Configuration
#
##############################################################################

# The UNC path to home drives location (%U username substitution)
# Just set it to a null string if you want to use the smb.conf 'logon home'
# directive and/or disable roaming profiles
# Ex: userSmbHome="\\PDC-SMB3\%U"
userSmbHome="\\PDC-SRV\%U"

# The UNC path to profiles locations (%U username substitution)
# Just set it to a null string if you want to use the smb.conf 'logon path'
# directive and/or disable roaming profiles
# Ex: userProfile="\\PDC-SMB3\profiles\%U"
userProfile="\\PDC-SRV\profiles\%U"

# The default Home Drive Letter mapping
# (will be automatically mapped at logon time if home directory exist)
# Ex: userHomeDrive="H:"
userHomeDrive="H:"

# The default user netlogon script name (%U username substitution)
# if not used, will be automatically username.cmd
# make sure script file is edited under dos
# Ex: userScript="startup.cmd" # make sure script file is edited under dos
userScript="logon.bat"

# Domain appended to the users "mail"-attribute
# when smbldap-useradd -M is used
# Ex: mailDomain="idealx.com"
mailDomain="idealx.com"

##############################################################################
#
# SMBLDAP-TOOLS Configuration (default are ok for a RedHat)
#
##############################################################################

# Allows not to use smbpasswd (if with_smbpasswd == 0 in smbldap_conf.pm) but
# prefer Crypt::SmbHash library
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"

# Allows not to use slappasswd (if with_slappasswd == 0 in smbldap_conf.pm)
# but prefer Crypt:: libraries
with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"

# comment out the following line to get rid of the default banner
# no_banner="1"

Zum Schluss werden noch in der Datei smbldap_bind.conf die Einträge für den LDAP-Administrator und dessen Passwort angepasst. Dass Passwort muss als Klartext hinterlegt werden, weswegen die Zugriffsrechte weiter oben auf root beschränkt worden sind:

############################
# Credential Configuration #
############################
# Notes: you can specify two differents configuration if you use a
# master ldap for writing access and a slave ldap server for reading access
# By default, we will use the same DN (so it will work for standard Samba
# release)
slaveDN="cn=admin,dc=meinedomain,dc=local"
slavePw="1234"
masterDN="cn=admin,dc=meinedomain,dc=local"
masterPw="1234"

3. Linux-Benutzeraccounts nach LDAP migrieren

Mit Hilfe des Skripts smbldap-migrate-unix-accounts werden alle Linux-Benutzer und Passwörter nach LDAP migriert. Das Skript verwendet dabei die Konfigurationsdatei von smbldap-tools (/etc/smbldap-tools/smbldap.conf).

Normalerweise sollten nicht alle Benutzer aus der /etc/passwd nach LDAP übernommen werden. Insbesondere die Systembenutzer (root, sys, daemon, ...) belässt man besser lokal in der /etc/passwd, da diese Accounts nicht über LDAP an die anderen PCs im Netz exportiert werden sollten. Deshalb erstellt man zuerst eine Kopie der /etc/passwd und entfernt dort alle System- und Computeraccounts.

cd /root
zcat /usr/share/doc/smbldap-tools/examples/migration_scripts/smbldap-migrate-unix-accounts.gz > smbldap-migrate-unix-accounts
chmod u+x smbldap-migrate-unix-accounts
cp /etc/passwd passwd.users
vi passwd.users
... (Benutzer entfernen, die nicht importiert werden sollen) 

Jetzt können die zu migrierenden Accounts in die LDAP-Datenbank übernommen werden:

./smbldap-migrate-unix-accounts -P passwd.users -S /etc/shadow -v 

Hinweis:

Die Datei /etc/shadow kann direkt verwendet werden, da hieraus nur die Zeilen mit entsprechendem Eintrag in der angegebenen passwd.users-Datei übernommen werden.

4. Linux-Gruppen nach LDAP migrieren

Die Migration der Linux-Gruppen funktioniert nach demselben Prinzip wie die Migration der Benutzer. Es werden nur die Gruppen in die Datenbank übertragen, die nicht Systemgruppen sind.

zcat /usr/share/doc/smbldap-tools/examples/migration_scripts/smbldap-migrate-unix-groups.gz > smbldap-migrate-unix-groups
chmod u+x smbldap-migrate-unix-groups
cp /etc/group group.import
vi group.import
... (Gruppen entfernen, die nicht importiert werden sollen)
./smbldap-migrate-unix-groups -G group.import -v 

Hinweis:

Falls das Hinzufügen von Benutzern oder Gruppen fehlschlägt (bisher nur unter Ubuntu 11.10 aufgetreten) muss man die Dateien smbldap-migrate-unix-groups und smbldap-migrate-unix-accounts editieren: Man sucht die Zeile mit dem Eintrag my $ldap_master=connect_ldap_master(); und fügt darunter folgendes ein:

1
2
3
$ldap_master->bind ( "cn=admin,dc=meinedomain,dc=local",
                       password => "1234",
                       version => 3 );

Man muss eventuell die Werte für das Passwort und den Adminuser anpassen.

5. Test, ob die Linux-Benutzer und -Gruppen im LDAP-Verzeichnis eingetragen sind

Nach Eingabe von

ldapsearch -x -D cn=admin,dc=meinedomain,dc=local -W -b dc=meinedomain,dc=local 

sollten alle Benutzer und Gruppen mit den dazugehörigen Attributen angezeigt werden.

Achtung!

Ubuntu verwendet zumindest seit Release 9.10 standardmäßig Simple Authentication and Security Layer (SASL) als Authentifizierungs-Framework für OpenLDAP. Damit das korrekt funktioniert, müssen die Passwörter der LDAP-Benutzer im LDAP-Directory als Klartext im Attribut userPassword hinterlegt sein. Das Migrationsscript hinterlegt sie aber standardmäßig verschlüsselt. In diesem Fall funktioniert nur die einfache Authentifizierung am LDAP-Server, z. B. mittels ldapsearch -x -D cn=carmen,dc=meinedomain,dc=local -W -b dc=meinedomain,dc=local für die Benutzerin carmen. Die deutlich sichere Methode über SASL mittels: ldapsearch -b dc=meinedomain,dc=local scheitert nach der Passwortabfrage durch SASL mit Fehlermeldung Invalid credentials (49). Abhilfe schafft, die Passwörter nochmals neu zu setzen, wie im nachfolgenden Kapitel gezeigt.

{top}

Verwendung von SASL

Die von OpenLDAP bereitgestellten LDAP-Client-Tools wie ldapsearch und ldapmodify versuchen standardmäßig, die Benutzer am LDAP-Verzeichnis-Server über Simple Authentication and Security Layer (SASL) mit DIGEST-MD5-Mechanismus zu authentifizieren. Daneben gibt es noch eine einfache Authentifizierung (mittels Option -x), die in den vorangegangenen Installations- und Konfigurationskapiteln zur Anwendung kam. Mit ein paar zusätzlichen Schritten kann aber jedem Benutzer der Zugriff auf das LDAP-Verzeichnis mittels SASL-Authentifizierung ermöglicht werden. Dazu müssen die Linux-Benutzeraccounts wie vorangehend beschrieben in das LDAP-Verzeichnis migriert werden. Darüber hinaus müssen einige Attribute im cn=config-Backend bzw. der Konfigurationsdatei slapd.conf (im Verzeichnis /etc/ldap) korrekt gesetzt sein.

Für den Fall der Konfiguration mittels cn=config-Backend muss eine Datei sasl-digestmd5.ldif im Verzeichnis /etc/ldap mit nachfolgendem Inhalt erstellt werden.

###########################################################
# DEFAULTS MODIFICATION for SASL DIGEST-MD5
###########################################################
# Some of the defaults need to be modified in order to allow
# SASL supported access to the LDAP config. 

# The LDAP administrator will need to tell the slapd server 
# how to map an authentication request DN to a user's 
# authentication DN. This is done by adding one or more 
# olcAuthzRegexp attributes to the cn=config backend. 
# This attribute takes two arguments:
#
# olcAuthzRegexp   <search pattern>   <replacement pattern>
# 
# Please note, that more than one attribute can be specified. 
# The LDAP server will serve them sequentially.

dn: cn=config
changetype: modify
add: olcAuthzRegexp
olcAuthzRegexp: uid=root,cn=[^,]*,cn=auth cn=admin,dc=meinedomain,dc=local

dn: cn=config
changetype: modify
add: olcAuthzRegexp
olcAuthzRegexp: uid=([^,]*),cn=[^,]*,cn=auth uid=$1,ou=Users,dc=meinedomain,dc=local

# set the correct authentication policy
dn: cn=config
changetype: modify
add: olcAuthzPolicy
olcAuthzPolicy: to

# User passwords have to stored as cleartext within the 
# LDAP directory
dn: olcDatabase={-1}frontend,cn=config
changetype: modify
add: olcPasswordHash
olcPasswordHash: {CLEARTEXT}

Diese muss dann anschließend in das LDAP-Backend eingefügt werden:

ldapadd -x -D cn=admin,cn=config -W -f /etc/ldap/sasl-digestmd5.ldif 

Falls OpenLDAP noch über slapd.conf im Verzeichnis /etc/ldap konfiguriert wird, müssen folgende Einträge hinzugefügt bzw. angepasst werden.

# SASL DIGEST-MD5 authorisation replacement directive
# This parameter is in the format of:
# uid=<username>,cn=<realm>,cn=<mech>,cn=auth
# The username is taken from sasl and inserted into the ldap search 
# string in the place of $1. Your realm is supposed to be your FQDN 
# (fully qualified domain name)
authz-regexp uid=admin,cn=[^,]*,cn=auth cn=admin,dc=meinedomain,dc=local
authz-regexp uid=([^,]*),cn=[^,]*,cn=auth uid=$1,ou=Users,dc=meinedomain,dc=local
authz-policy      to
# enable LDAP to help SASL to use passworts stored in LDAP database
password-hash   {CLEARTEXT}

Neustart von slapd mittels:

sudo /etc/init.d/slapd restart 

Nun müssen noch die Passwörter in Klartext im LDAP-Verzeichnis hinterlegt werden. Dazu muss das Passwort neu gesetzt werden. Dies kann jeder Benutzer (z. B. carmen) selber durchführen:

ldappasswd -x -D uid=carmen,ou=Users,dc=meinedomain,dc=local -W -s MeinPasswort uid=carmen,ou=Users,dc=meinedomain,dc=local 

oder der LDAP-Administrator (durch Neuvergabe)

sudo ldappasswd -x -D cn=admin,dc=meinedomain,dc=local -W -s NeuesPasswort uid=carmen,ou=Users,dc=meinedomain,dc=local 

Nach Eingabe von

carmen@MeinComputer:~$ ldapsearch -b dc=meinedomain,dc=local 

und dem Passwort sollte jeder Benutzer die im LDAP-Verzeichnis hinterlegten Benutzer und Gruppen mit den dazugehörigen Attributen angezeigt bekommen.

SASL/DIGEST-MD5 authentication started
Please enter your password: 
SASL username: carmen
SASL SSF: 128
SASL data security layer installed.
# extended LDIF
#
# LDAPv3
# base <dc=meinedomain,dc=local> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# meinedomain.local
dn: dc=meinedomain,dc=local
objectClass: dcObject
objectClass: organization
o: meinedomain.local
dc: meinedomain
description: Tree root

# admin, meinedomain.local
dn: cn=admin,dc=meinedomain,dc=local
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
...

Zum Abschluss muss auch noch dass Passwort des LDAP-Verzeichnis-Administrators (cn=admin,dc=meinedomain,dc=local) in Klartext in dem LDAP-Verzeichnis hinterlegt werden. Ganz zu Beginn der Installation des OpenLDAP-Servers wurde ja nur ein Passwort-Hash eingetragen. Der von den LDAP-Client-Tools standardmäßig für die Benutzerauthentifizierung verwendete SASL-DIGEST-MD5-Mechanismus erfordert aber zwingend die Ablage der Passwörter in Klartext im LDAP-Verzeichnis. LDAP-Abfragen durch den Ubuntu-Superuser root wie z. B.

sudo ldapsearch -b ou=Users,dc=meinedomain,dc=local -LLL uid=carmen
SASL/DIGEST-MD5 authentication started
Please enter your password: 
SASL username: root
SASL SSF: 128
SASL data security layer installed

werden aus Sicherheitsgründen mittels der oben definierten Authentication-Replace-Anweisung authz-regexp uid=admin,cn=[^,]*,cn=auth cn=admin,dc=meinedomain,dc=local über den LDAP-Admin authentifiziert. Unter Please enter your password: ist deshalb das Passwort des LDAP-Admin einzugeben (z. B. "1234"). So kann root, ohne selbst im LDAP-Verzeichnis abgelegt zu sein, auf dasselbe zugreifen. Die Hinterlegung des Passwortes in Klartext erfolgt über

ldappasswd -x -D cn=admin,dc=meinedomain,dc=local -W -S cn=admin,dc=meinedomain,dc=local 

{top}

LDAP Authentication

Nachdem der LDAP-Server eingerichtet ist, die Linux-Accounts in das LDAP-Verzeichnis migriert worden sind und auch die Authentifizierung am LDAP-Server mittels Simple Authentication and Security Layer (SASL) mit DIGEST-MD5-Mechanismus funktioniert, wird in diesem Abschnitt der Ubuntu-Client in die Lage versetzt, Benutzer mit Eintrag im LDAP-Verzeichnis am LDAP-Server zu authentifizieren. Aufgrund umfangreicher und nach wie vor noch nicht abgeschlossener Umbauten der PAM-basierten Authentifizierung ist die Einrichtung der LDAP-Authentifizierung nicht trivial. Zum Glück gibt es aber einige Ubuntu-Pakete, die, sofern man sie einsetzt, die Arbeit doch erheblich erleichtern.

Achtung!

Die Konfiguration der LDAP-basierten Authentifizierung in Ubuntu ändert sich zur Zeit von Release zu Release. Sie ist schlecht dokumentiert. Selbst der Ubuntu Server Guide {en} behandelt das Thema nur sehr oberflächlich. Das hier beschriebene Vorgehen ist aber bis Ubuntu Natty Narwhal 11.04 getestet. Ob es für frühere Releases anwendbar ist, ist zumindest zweifelhaft. Für Ubuntu Dapper Drake 6.06 und ggf. nachfolgende nicht mehr unterstützte Releases wird auf den Artikel LDAP Client Authentifizierung verwiesen.

Es werden folgende Pakete zusätzlich benötigt:

  • libnss-ldapd

  • libpam-ldapd

  • auth-client-config

  • ldap-auth-client

  • ldap-auth-config

  • nslcd

  • nscd

Wiki/Vorlagen/Installbutton/button.png

Paketliste zum Kopieren:

sudo apt-get install libnss-ldapd libpam-ldapd auth-client-config ldap-auth-client ldap-auth-config nslcd nscd 

sudo aptitude install libnss-ldapd libpam-ldapd auth-client-config ldap-auth-client ldap-auth-config nslcd nscd 

Hinweis:

Das Paket libpam-ldapd steht erst ab Ubuntu Lucid Lynx 10.04 zur Verfügung. Für frühere Ubuntu-Versionen muss stattdessen die veraltete libpam-ldap-Bibliothek installiert werden. Doch auch ab Ubuntu Lucid Lynx 10.04 kommt man an libpam-ldap nicht ganz vorbei, da nur es das LDAP-Schema ldapns.schema bereitstellt. Sobald die zugehörige ldif-Datei aber erstellt ist, kann libpam-ldap bedenkenlos wieder per Hand oder automatisch durch die Installation von libpam-ldapd vom System entfernt werden. Falls alternde Passwörter im LDAP Schema, d. h. Eigenschaften wie ShadowLastChange aus dem ShadowAccount-Schema, verwendet werden und das Datum der letzten Passwortänderung nicht aktualisiert wird: Unter Umständen kann das Problem gelöst werden, indem man die neueren Bibliotheken libnss-ldapd und libpam-ldapd durch die älteren libnss-ldap und libpam-ldap ersetzt.

Benötigte Pakete installieren und konfigurieren

Man startet mit libnss-ldapd, das ein Name-Service-Switch-Modul (NSS) zur Verfügung stellt, mit dem der LDAP-Server seine Clients mit Benutzer-Accounts, Gruppen, Host-Namen, Aliases und weiteren Informationen, die üblicherweise in Konfigurationsdateien im Verzeichnis /etc abgelegt sind, versorgen kann.

Es öffnet sich ein Konfigurationsdialog, mit dem festgelegt wird, welche Services mittels LDAP-Lookup zugänglich sein sollen. Zumindest die folgenden Services werden benötigt:

  • "group"

  • "passwd"

  • "shadow"

und sollten markiert werden.

Danach werden die Pakete nslcd und nscd installiert. Die beiden Pakete stellen Dämonen bereit, mittels derer lokale Applikationen (z.B. PAM-Module) die über libnss-ldapd aus dem LDAP-Verzeichnis geholten Informationen entweder direkt oder aus einem Cache abfragen können.

Hinweis:

Ohne nslcd ist kein LDAP-authentifizierter Benutzer-Login möglich. PAM bricht ab mit Fehlermeldung "User not known to the underlying authentication module" auf die Konsole und "login: pam_env(login:session): No such user!?" sowie "login: User not known to the underlying authentication module" im Logfile.

Nach Installation von nslcd

öffnet sich wiederum ein Konfigurationsdialog, mit welchem die zu verwendende LDAP-Server-URI (z. B. ldap://127.0.0.1/, wenn der LDAP-Server auf demselben Rechner läuft) und das LDAP-Suffix (also dc=meinedomain,dc=local) festgelegt werden.

Danach müssen noch die Pakete libpam-ldapd und ldap-auth-config installiert werden.

Letzteres installiert automatisch noch die Pakete auth-client-config und ldap-auth-client mit, sofern diese nicht schon auf dem System vorhanden sind. Anschließend müssen die ldap-auth-Pakete noch konfiguriert werden mittels:

sudo dpkg-reconfigure ldap-auth-config 

In dem sich öffnenden Dialog legt man die Konfigurationsoptionen fest, die dann in den Dateien /etc/ldap.conf und /etc/ldap.secret abgelegt werden:

  • LDAP server Uniform Resource Identifier: ldap://xxxx - hier die LDAP-URI des LDAP-Servers eingeben (z. B. 127.0.0.1, wenn lokal)

  • Distinguished name of the search base: dc=meinedomain,dc=local - das bei der Installation festgelegte LDAP-Suffix eingeben

  • LDAP version to use: 3

  • Make local root Database admin: Yes

  • Does the LDAP database require login? No

  • LDAP account for root: cn=admin,dc=meinedomain,dc=local

  • LDAP root account password: 1234 - hier LDAP-Admin-Passwort eingeben; wird in ldap.secret abgelegt und ist nur root zugänglich

Spätere Änderungen an der Konfiguration sollten wenn möglich ebenfalls nur mit Hilfe von dpkg-reconfigure ldap-auth-config durchgeführt werden, um besser gewappnet zu sein für die weiter oben schon erwähnten zu erwartenden Änderungen bei einem Release-Upgrade.

Nun müssen noch die Konfigurationsdateien für die mit der Authentifizierung betrauten Systemdatenbanken (vorwiegend von PAM verwaltet) und das Name-Service-Switch-Modul (NSS) angepasst werden. Dafür stehen zwei Tools zur Verfügung:

sudo auth-client-config -t nss -p lac_ldap 

passt die Datei /etc/nsswitch.conf auf Basis eines in der Profildatenbank im Verzeichnis /etc/auth-client-config/profile.d/ enthaltenen LDAP-Schemas (lac_ldap) an.

Und

sudo pam-auth-update 

die PAM-Konfiguration im Verzeichnis /etc/pam.d/. Nach Eingabe des Kommandos erscheint ein Dialog, in dem die zu aktivierenden PAM-Profile ausgewählt werden müssen. Zunächst sollten die Profile

  • Unix authentication und

  • LDAP Authentication

ausgewählt werden. Nun sollte das System für die LDAP-Authentifizierung eingerichtet sein.

Test

Bevor nun vollständig auf Authentifizierung mittels LDAP umgestiegen wird, sollte das System noch getestet werden. Dazu legt man zunächst einen neuen Benutzer test im LDAP-Verzeichnis an. Hierfür empfiehlt sich die Installation eines weiteren Paketes mit sehr hilfreichen Skripten.

Installation von LDAP-Admin-Skripts

  • ldapscripts

  • pwgen

Wiki/Vorlagen/Installbutton/button.png

Achtung!

In /etc/ldapscripts/ldapscripts.conf wird suggeriert, dass die ldapscripts Parameter wie 'SERVER' automatisch aus einer anderen Konfigurationsdatei lesen können: 'DEBIAN: values from /etc/pam_ldap.conf are used.' Aufgrund eines Bugs im Installationskript unterstützt Ubuntu dies aber nicht. Alle für die ldapscripts benötigten Parameter müssen weiterhin in /etc/ldapscripts/ldapscripts.conf definiert werden.

Dann die Datei /etc/ldapscripts/ldapscripts.conf editieren, Kommentarzeichen löschen und anpassen wie folgt:

SERVER=localhost  # falls der LDAP-Server lokal, sonst ldapi///
BINDDN='cn=admin,dc=meinedomain,dc=local'
BINDPWDFILE="/etc/ldapscripts/ldapscripts.passwd"
SUFFIX='dc=meinedomain,dc=local'
GSUFFIX='ou=Groups'
USUFFIX='ou=Users'
MSUFFIX='ou=Computers'
GIDSTART=10000
UIDSTART=10000
MIDSTART=10000
PASSWORDGEN="pwgen"

Anschließend noch die Datei ldapscripts.passwd erstellen für den authentifizierten Admin-Zugang zum LDAP-Verzeichnis:

sudo sh -c "echo -n '1234' > /etc/ldapscripts/ldapscripts.passwd"
sudo chmod 400 /etc/ldapscripts/ldapscripts.passwd 

Anmerkung: '1234' muss natürlich durch das tatsächliche Passwort des LDAP-Administrators ersetzt werden.

Achtung!

/etc/ldapscripts/ldapscripts.passwd darf keine Zeilenumbrüche enthalten und sollte deshalb ausschließlich mit o. g. echo-Befehl erstellt und modifiziert werden.

Testbenutzer anlegen

Anschließend wird der neue Benutzer angelegt mit

sudo ldapaddgroup test
sudo ldapadduser test test
sudo ldapsetpasswd test 

Danach kann überprüft werden, ob test korrekt im LDAP-Verzeichnis angelegt wurde. Unter einem beliebigen nach obiger Migrationsanleitung von /etc/passwd ins LDAP-Verzeichnis migrierten User-Account lässt man sich die Daten des test-Benutzers ausgeben:

carmen@MeinComputer:~$ ldapsearch -b dc=meinedomain,dc=local uid=test 

Ausgabe:

SASL/DIGEST-MD5 authentication started
Please enter your password: 
SASL username: carmen
SASL SSF: 128
SASL data security layer installed.
# extended LDIF
#
# LDAPv3
# base dc=meinedomain,dc=local with scope subtree
# filter: uid=test
# requesting: ALL
#

# test, Users, meinedomain.local
dn: uid=test,ou=Users,dc=gas,dc=de
objectClass: account
objectClass: posixAccount
cn: test
uid: test
uidNumber: 10001
gidNumber: 10001
homeDirectory: /home/test
loginShell: /bin/sh
gecos: test
description: User account

# search result
search: 4
result: 0 Success

# numResponses: 2
# numEntries: 1

Der Benutzer test ist nur im LDAP-Verzeichnis abgelegt, wovon man sich durch Überprüfen der Datei /etc/passwd überzeugen kann. Nun mittels Strg + Alt + F3 auf ein Terminal wechseln und einen Login durchführen für den Benutzer test mit dem gerade eben vergebenen Passwort.

Weitere Tests

Da OpenLDAP ein doch sehr kompliziertes und recht fehleranfälliges Thema ist, empfehlen sich weitere Tests, die hier aber nur noch kurz aufgezählt werden:

  • getent group muss alle Unix-Gruppen sowie die neue LDAP-Gruppe test ausgeben

  • getent passwd gibt alle Unix-Accounts und den Benutzer test aus

  • unter root (z. B. mit sudo bash) das System über das Skript pam-auth-update auf reine "LDAP Authentication" umstellen und Logins sowie sudo-Kommandos ausführen

Experten-Info:

Liegt der LDAP-Server auf einem anderen PC als der Client und sollte in der Ausgabe getent passwd der Benutzer test, trotz der oben aufgeführten Konfiguration nicht auffindbar sein, ist es möglich das der LDAP-Server die Verbindung ablehnt.

Um dies zu Verifizieren sollte in der ersten Konsole tail -f /var/log/syslog eingegeben werden. In der zweiten Konsole wird nochmals der Befehl getent passwd bestätigt. Erscheint nun in der ersten Konsole die Ausgabe failed to bind to LDAP server ldap://yourLdapServerIP/: Can't contact LDAP server: Transport endpoint is not connected, wird der Client vom Server abgewiesen.

Dieser Fehler tritt auf da LDAP nur auf der virtuellen Loopback (localhost o. 127.0.0.1) Netzwerkkarte auf ein kommende Verbindungen wartet. Dies kommt unter anderem mit einem Sicherheitsgewinn einher, da kein externer Client auf den Datenbestand des Servers zugreifen kann.

Abhilfe schafft folgendes: Es muss auf dem LDAP-Server die Datei /etc/default/slapd bearbeitet werden. Genauer es muss die Zeile

1
SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"

eingefügt werden. Alle anderen Zeilen mit dem Eintrag SLAPD_SERVICES müssen mit einem beginnenden # auskommentiert werden. Daraufhin sollte nochmals der Befehl getent passwd auf dem Client aufgerufen werden. Die nun folgende Ausgabe sollte den Benutzer test enthalten.

Abschließende Arbeiten

Wenn man sich genügend von der korrekten Funktion der LDAP-Authentifizerung überzeugt hat, kann man mittels des Befehls deluser die Unix-Accounts der migrierten Benutzer löschen und sich voll auf das LDAP-Verzeichnis verlassen. Ein Parallelbetrieb ist aber genauso möglich. Es sollten beide Authentifizierungsprofile (LDAP-, Unix-Authentification) eingestellt bleiben, da ja nicht alle Benutzer migriert worden sind, was auch wenig sinnvoll wäre.

Wer einen Samba-Server betreibt, kann relativ einfach die migrierten LDAP-Benutzereinträge um Samba-spezifische Attribute erweitern und weitere Accounts (z. B. Computer) hinzufügen, so dass LDAP zur Authentifizierung und als Backend für Samba verwendet werden kann. Dazu existieren zahlreiche Howtos. Nach Abschluss der Arbeiten sollte der Server neu gestartet werden.

Hinweise

Zur weiteren Konfiguration und Verwaltung kann man dann z.B. phpLDAPadmin oder luma nutzen.

Diese Revision wurde am 6. Februar 2012 um 15:58 Uhr von haaz0r erstellt.
Dieser Seite wurden folgende Begriffe zugeordnet: Server, Internet

Passwort vergessen?