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.
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.
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.
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).
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).
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.
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.
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.
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.