OpenLDAP system user auth

wall < "Authentifizierung der Systemuser gegen OpenLDAP"

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

Wollen wir, dass sich unsere System-User gegen OpenLDAP authentifizieren dürfen, müssen wir zuerst einige Pakete nachinstallieren:

apt-get install libnss-ldap libpam-ldap nscd

/etc/ldap/ldap.conf

The ldap.conf configuration file is used to set system-wide defaults to be applied when running ldap clients.man 5 ldap.conf

Generell wird beim login immer die Information dieser Datei ausgewertet. Es ist also unbedingt notwendig, hier den Zugriff auf den zentralen OpenLDAP-Server — in unserem Fall 127.0.0.1 — einzutragen.

BASE    dc=sysadmama,dc=de
URI     ldap://127.0.0.1:389

/etc/ldap.conf

This is the configuration file for the LDAP nameservice switch library (libnss-ldap) and the LDAP PAM (libpam-ldap) module.

base dc=sysadmama,dc=de
uri ldap://127.0.0.1:389
ldap_version 3
bind_policy soft
pam_groupdn             ou=People,dc=sysadmama,dc=de
nss_base_passwd         dc=sysadmama,dc=de?sub
nss_base_shadow         ou=People,dc=sysadmama,dc=de?one
nss_base_group          dc=sysadmama,dc=de?sub

Sowohl passwd als auch group werden unserem OpenLDAP-Server entnommen — und zwar beginnend bei dc=sysadmama,dc=de. Das sub gibt an, dass ab hier der gesamte Bestand durchsucht wird. Theoretisch ermöglichen wir somit auch den Usern in InactivePeople ein Login.
Jedoch: pam_groupdn erzwingt sich für Logins eine Zugehörigkeit in den ou=People-Ast! Welche Vorteile bringt das? Nun, Logins sind ausschliesslich für User aus People möglich. Jedoch: Dateien im System können nun zweifelsfrei zugeordnet werden, da sie, auch wenn ein User deaktiviert wurde, weiterhin einem Usernamen anstelle einer ID gehören, und mehr noch: scriptest du dir beispielsweise, dass User, wenn sie deaktiviert werden, ihren Usernamem zu x-username ändern, so siehst du anhand des x- auch immer direkt, dass es sich um einen deaktivierten User handelt.

Rufst du dir die System-User auf stellst du an dieser Stelle jedoch fest, dass die OpenLDAP-User nach wie vor nicht angezeigt werden. Etwas fehlt noch…

$ getent passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
...

/etc/nsswitch.conf

The Name Service Switch (NSS) configuration file, /etc/nsswitch.conf, is used by the GNU C Library to determine the sources from which to obtain name-service information in a range of categories, and in what order.man 5 nsswitch.conf

Wollen wir also unsere System-User aus unserem OpenLDAP ziehen, so müssen wir an dieser Stelle hinterlegen, dass im OpenLDAP danach gesucht werden soll. Doch Obacht: seit Einführung des systemd ist hier die Reihenfolge extrem wichtig! Lasse ich zuerst in ldap und dann in files (oder compat) suchen, fährt die Maschine einfach nicht mehr hoch! Deshalb: erst files, dann ldap.

# /etc/nsswitch.conf
passwd:         files [NOTFOUND=continue] ldap
group:          files [NOTFOUND=continue] ldap
shadow:         files [NOTFOUND=continue] ldap
...

Tipp: Mit Änderungen an dieser Stelle ist nicht zu spassen — du kannst dir das System so weit zerschiessen, dass du dich nicht mehr einloggen kannst, die Maschine nicht mehr sauber hochfährt, sudo nicht mehr funktioniert… Lege dir sicherheitshalber ein Backup der nsswitch.conf nach /etc, das du im Ernstfall wieder an Ort und Stelle schieben kannst.

Und hier ist er nun, unser User firstuser, proudly presented from OpenLDAP ;-) Nach Änderungen kann es manchmal nötig sein, den nscd neu zu starten, da sonst Antworten aus dem Cache geliefert werden.

$ service nscd restart
  * Restarting Name Service Cache Daemon nscd
$ getent passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
firstuser:x:1000:1000:First User:/home/firstuser:/bin/bash
...

Passwortänderung mit passwd

firstuser kann sich also erfolgreich mit seinem Passwort einloggen. Doch dann will er sein Passwort per passwd ändern und — peng! — nichts geht…

$ passwd
Enter login(LDAP) password:
passwd: Authentication information cannot be recovered
passwd: password unchanged

Sollen unsere User die Möglichkeit erhalten ihr Passwort ändern zu können, so müssen wir zuerst ein weiteres benötigtes Paket installieren:

apt-get install libpam-cracklib
$ passwd
Enter login(LDAP) password:
New password:
Retype new password:
LDAP password information update failed: Insufficient access
passwd: Permission denied
passwd: password unchanged

Unser User firstuser ist nicht in der Lage, sein Passwort zu ändern — weil er seinen OpenLDAP-Eintrag nicht ändern darf. Deshalb müssen wir an dieser Stelle erneut die /etc/ldap/slapd.conf anpacken und um eine Rechtevergabe erweitern; anschliessend muss die Konfiguration neu gebaut werden, wie es an dieser Stelle ausführlich beschrieben ist:

## /etc/ldap/slapd.conf
...
access to attrs=userPassword
        by anonymous auth
        by self write
        by * none
 
access to attrs=shadowLastChange
        by self write
        by * read
 
access to *
        by * read
...
$ passwd
Enter login(LDAP) password:
New password:
Retype new password:
LDAP password information changed for firstuser
passwd: password updated successfully

Tipp: Die slapd.conf ist ziemlich zickig, was Kommentare angeht; Kommentaren wird üblicherweise ein # vorangestellt, dennoch schiesst sich der Parser immer mal wieder ins Knie, wenn er auf ein Kommentarzeichen stösst, wo er keines erwartet. Kommentare dürfen nie innerhalb einer Zeile erscheinen und auch nicht innerhalb von Anweisungsblöcken!

access to attrs=userPassword
        ## by anonymous auth - Dies ist ein Beispiel für einen Kommentar, der den Parser zum Sterben bringt
        by self write

Nachdem die Authentifizierung der User nun also erfolgreich eingerichtet ist, können weitere Dienste an OpenLDAP angebunden werden — wenn wir uns den Stress schon geben, soll es sich wenigstens lohnen ;-)

4
  1. Respekt… Du machst wirklich freiwillig LDAP… Ich habs so früh wie möglich abgefackelt weils kacke war… xD

Keine weitere Reaktionen mehr möglich.