.. toctree:: OpenLDAP-Server unter Debian =============================================== **Datum: 01.03.2015** (letzte Änderung 14.05.2021) Zielstellung: Installation von LDAP, Hinzufügen von Objekten Installation ------------------------------------ Neben dem Daemon 'slapd' benötigen wir die 'ldap-utils', um z.B. ldif-Dateien einbinden oden nach Datensätzen suchen zu können. ``apt-get install slapd ldap-utils`` Dabei ist lediglich das Passwort für den LDAP-Administrator namens 'admin' zu vergeben, das später z.B. für authentifizierte Abfragen gebraucht wird. Wesentlich mehr Einstellungsmöglichkeiten werden angeboten, wenn man zu einem späteren Zeitpunkt ``dpkg-reconfigure slapd`` ausführt. ACHTUNG: Lässt man dabei zu, dass ein Backup von der Datenbank gemacht wird, landet es im Verzeichnis '/var/backups'. Solange aber dieses Backup in dem Verzeichnis verbleibt, lässt sich der reconfigure-Vorgang nicht noch einmal durchführen! Konfiguration --------------------- Die Konfiguration wird heutzutage direkt in der Datenbank selbst gespeichet (olc = Online Configuration) und nicht mehr in einer Datei, was für eine umfassende Replikation auch wichtig ist. Allerdings erschwert sich damit die Arbeit des Admins um einiges. Aber halb so schlimm - das Passwort wurde bei der Installation ja schon gesetzt und auch sonst gibt es für den Anfang nicht allzuviel einzustellen. Eine erste anonyme Read-Only-Suchabfrage unter Verwendung des Basis-DNs, der üblicherweise mit ``hostname -f`` identisch sein sollte, liefert als einziges Blattobjekt den Administrator des LDAP-Systemes, den 'admin': ``ldapsearch -x -b dc=kitdd,dc=intern`` Will man es vermeiden, den Basis-DN immer mit angeben zu müssen, kann die Client-Konfigurationsdatei des Servers angepasst werden: ``vi /etc/ldap/ldap.conf`` Als Inhalt wird nur diese eine Zeile angepasst:: BASE dc=kitdd,dc=intern Jetzt kann man eine Abfrage kurz und knapp ausführen mit: ``ldapsearch -x`` Importieren von Daten in die Datenbank --------------------------------------- Zuerst brauchen wir eine Grundstruktur, in die dann Benutzer aufgenommen werden können: ``vi organisation.ldif`` Hier ist der Inhalt der Datei:: dn: ou=people,dc=kitdd,dc=intern objectClass: organizationalUnit ou: people dn: ou=group,dc=kitdd,dc=intern objectClass: organizationalUnit ou: group Mit folgender Zeile wird nun das Ganze in die Datenbank befördert: ``ldapadd -x -D cn=admin,dc=kitdd,dc=intern -W -f organisation.ldif`` Zweitens wäre ein Beispielbenutzer sinnvoll, wir erstellen dafür wieder eine Datei: ``vi fritz.ldif`` Als Inhalt schreiben wir folgendes hinein:: dn: cn=office,ou=group,dc=kitdd,dc=intern objectClass: top objectClass: posixGroup description: Gruppe Office cn: office gidNumber: 10000 dn: uid=fritz,ou=group,dc=kitdd,dc=intern objectClass: top objectClass: person objectClass: posixAccount objectClass: shadowAccount objectClass: inetOrgPerson uid: fritz uidNumber: 10000 gidNumber: 10000 cn: fritz sn: Meier loginShell: /bin/bash homeDirectory: /home/fritz Auch dies muss wieder in die Datenbank gelangen: ``ldapadd -x -D cn=admin,dc=kitdd,dc=intern -W -f fritz.ldif`` Was noch fehlt, ist das Setzen eines Passwortes für fritz: ``ldappasswd -x -D cn=admin,dc=kitdd,dc=intern -W -S uid=fritz,ou=group,dc=kitdd,dc=intern`` Kommt kein Fehler vor, kann es mit dem Testen weitergehen... Abfrage des Datenbestandes ---------------------------- Zur Kontrolle kann mit 'ldapsearch' wieder der Datenbestand ausgegeben werden. Hier sollen nur die Objekte ausgegeben werden, die mit 'fr' beginnen und also auch unseren fritz betreffen: ``ldapsearch -x cn=fr*`` Wollen wir das gehashte Passwort von fritz sehen, muss die Abfrage authentifiziert erfolgen: ``ldapsearch -x -W -D cn=admin,dc=kitdd,dc=intern cn=fr*`` Daten exportieren --------------------------------- Daten lassen sich ganz leicht exportieren, so dass sie später weiterverarbeitet werden können, z.B. den Benutzer fritz: ``ldapsearch -x -LLL uid=fritz -D cn=admin,dc=kitdd,dc=intern -w admin > fritz.ldif`` Benutzer erzeugen und entfernen ------------------------------------- Nun haben wir damit auch eine Vorlage-LDIF-Datei für neue Benutzer erhalten. Es soll ein neuer Benutzer namens 'opa' angelegt werden: ``cp fritz.ldif opa.ldif`` Jetzt müssen noch ein paar Dinge angepasst werden, zuerst natürlich der Benutzername: ``sed -i 's/fritz/opa/' opa.ldif`` Weitere Anpassungen betreffen auf alle Fälle noch die UID (evl. auch sambaSID) sowie GID ``vi opa.ldif`` Der neue Benutzer wird als nächstes mit ``ldapadd -x -D cn=admin,dc=kitdd,dc=intern -W -f opa.ldif`` importiert, abschließend muss ihm noch mit ``ldappasswd -x -D cn=admin,dc=kitdd,dc=intern -W -S uid=opa,ou=group,dc=kitdd,dc=intern`` das Secret gesetzt werden. Im Szenario "Samba-PDC mit LDAP-Backend" ist bei gesetztem Schalter 'ldap passwd sync = yes' anstelle von 'ldappasswd' das Kommando ``smbpasswd opa`` einzusetzen! Letztendlich soll der eben angelegte Benutzer wieder aus dem LDAP-Verzeichnis entfernt werden: ``ldapdelete -x -D cn=admin,dc=kitdd,dc=intern -W uid=opa,ou=group,dc=kitdd,dc=intern`` Linux-Login mit Hilfe der LDAP-Accounts --------------------------------------- Mit den neuen Benutzern wird es nun möglich, sich am Linux-System anzumelden. Die Koppelung LDAP/Unix-Account wird mit Hilfe der im "nis.schema" definierten Objektklasse "posixAccount" abgewickelt. Clientseitig müssen dafür jedoch noch die "NSS module for using LDAP as a naming service" sowie die LDAP-Module für den PAM-Mechanismus, der sich ja um den Login kümmert, installiert und konfiguriert werden: ``apt-get install libnss-ldap libpam-ldap`` Die Einrichtung der beiden Pakete mittels Assistenten läuft hintereinander ab, zum Teil werden die gleichen Fragen gestellt, die dann einfach identisch beantwortet werden. Wichtige Punkte (oft richtig voreingestellt) sind: * URI des LDAP-Servers (FQDN oder IP-Adresse, z.B. ldap://192.168.2.201) * Angabe eines eindeutigen Namen der LDAP-Suchbasis (z.B. dc=kitdd,dc=intern) * Gewünschte LDAP-Version auswählen (empfohlen: 3) * Administrativen LDAP-Zugang festlegen (z.B. cn=admin,dc=kitdd,dc=intern mit zugehörigem Passwort) * Erlaubnis geben, dass der LDAP-Admin sich wie der lokale root verhalten darf (damit die verschiedenen Tools die lokalen Kennwörter ändern dürfen) * Bestätigen, dass keine Anmeldung erforderlich ist, um eine unauthorisierte Datenbankabfrage vorzunehmen. Bei Bedarf können die Einstellungen später mit folgender Zeile geändert werden: ``dpkg-reconfigure libnss-ldap`` HINWEIS zur URI: Wenn Client und Server auf derselben Maschine laufen, kann die Vorgabe ``ldapi://`` einfach übernommen werden (man beachte das kleine "i"). Es wird dann automatisch die lokale Socketdatei des *slapd* verwendet. Die beiden Dateien sehen dann so aus (ohne Kommentare und Leerzeilen): :: root@deb10srv:~# cat /etc/pam_ldap.conf base dc=dom1,dc=test uri ldapi:// ldap_version 3 rootbinddn cn=admin,dc=dom1,dc=test pam_password crypt root@deb10srv:~# root@deb10srv:~# root@deb10srv:~# cat /etc/libnss-ldap.conf base dc=dom1,dc=test uri ldapi:// ldap_version 3 rootbinddn cn=admin,dc=dom1,dc=test root@deb10srv:~# Mit dieser Installation kommt auch automatisch der Caching-Dienst 'nscd' mit, der nicht unbedingt benötigt wird. Er sollte, da er manchmal eher für Verwirrung sorgt als Nutzen bringt, gleich wieder deinstalliert werden: ``apt-get remove nscd`` Soeben während der Installation haben wir erfahren, dass wir die Datei '**/etc/nsswitch.conf**' von Hand anpassen müssen. Den betreffenden drei Zeilen wird die Zeichenkette 'ldap' angefügt, so dass sie dann so aussehen:: passwd: compat ldap group: compat ldap shadow: compat ldap Für einen ersten Test können wir uns mit der kleinen, nützlichen Kommandozeile ``getent passwd`` die Gesamtheit aller vorhandenen Benutzer aus der '/etc/passwd' und dem LDAP-Verzeichnis ausgeben lassen. Nun wäre zwar schon ein Login z.B. mit dem Benutzer "fritz" möglich, aber er stünde ohne Heimatverzeichnis da. Soll es beim Erstlogin automatisch erzeugt werden, erweitert man die Datei ``/etc/pam.d/common-session`` um diese Zeile (ans Ende anhängen):: session required pam_mkhomedir.so skel=/etc/skel/ umask=0022 Nun hoffen wir, dass alles funktioniert, wenn Fritz sich einloggt. Das Ganze am besten von einem anderen Nutzeraccount aus testen (nicht als root, damit der Passwortprompt kommt): ``su - fritz`` <= Have a lot of fun... =>