Simon Szustkowski

Ein Blog über alles, was mir gerade so durch den Kopf geht

Sep 21, 2016

netatalk Login-Fehler mit SMB

Ich habe den heutigen Abend mal wieder mit Debugging verbracht. Und zwar habe ich auf dem Homeserver zwei Filesharing-Dienste, nämlich SMB und AFP laufen, um die Dateien für Macs und Windowsrechner freigeben zu können. Den AFP-Server über netatalk hatte ich schon seit Monaten im Einsatz, und alles lief sauber. Ich habe dann neulich den SMB-Server über samba nachinstalliert und -konfiguriert, und es lief auch noch halbwegs gut, bis ich heute nach einem Reboot des Hosts feststellen musste, dass der Login auf den AFP-Server absolut nicht mehr funktionierte - der Childprozess, der die Session handlen sollte, stürzte nach jedem erfolgreichen Loginversuch zuverlässig ab. Und so habe ich den Abend mit Debugging verbracht.

Ich habe das Problem dann irgendwann auf die Authentication-Libraries eingegrenzt, vor allem hat uams_dhx_pam.so Stress gemacht, was unter Netatalk erstmal standardmäßig die Authentifizierung erledigt. Erster und einfachster Workaround ist, die Zeile uam list = uams_dhx2_passwd.so in die [Global]-Sektion der afp.conf einzufügen, was dafür sorgt, dass ebenjenes Modul die Authentifizierung übernimmt, und nicht das “fehlerhafte” Modul. Klappt soweit erstmal.

Problematisch wird es aber dann, wenn man den AFP-Server an einen LDAP anbinden möchte, das kann dieses Modul nämlich nicht, sondern man braucht das erste, fehlerhafte. Und wieso ist das Problem bei mir überhaupt aufgetreten, wo doch Netatalk erst monatelang butterweich funktionierte? Die Wurzel allen Übels liegt in samba, bzw. in dessen Eigenart, eine eigene Userdatenbank zu besitzen, und nicht einfach auf die Linux-Systemaccounts zuzugreifen. Hat bestimmt seine Daseinsberechtigung, allerdings ging das den Linuxadmins auf den Sack, und sie haben Mechanismen implementiert, die diese beiden Nutzerdatenbanken (Samba und Linux) synchron zu halten. Unter anderem gibt es ein pam-Modul, unter Debian namentlich libpam-smbpass, was bei Login via SSH auf den Host das Passwort abgreift, und in der Samba-UserDB updatet. Diese Sequenz mag das uams_dhx_pam.so-Modul nicht. Klar, Authentifizierung ist ein kritischer Vorgang, wenn da irgendwas reinpfuscht, bricht man lieber ab.

Wenn man also AFP mit LDAP und SMB parallel laufen lassen möchte, geht man hin, und kopiert die /etc/pam.d/common-auth und die /etc/pam.d/common-password nach /etc/pam.d/common-auth-nosmb und /etc/pam.d/common-password-nosmb und entfernt bei beiden nosmb Dateien die Zeilen, die auf pam-smbpass.so referenzieren. Dann editiert man die /etc/pam.d/netatalk und ändert die Referenzen von common-auth und common-password auf die jeweiligen nosmb-Versionen. Voilà, schon hat man wieder friedlich koexistierende AFP- und SMB-Server.

Dieser Bug scheint übrigens alle Ubuntu-Versionen ab Oneiric Ocelot 11.10 zu betreffen, und vermutlich auch alle Debian-Versionen ab dem Zeitpunkt (ich habe es auf Debian 8 Jessie) entdeckt. Der Bugreport ist übrigens seit 5 Jahren offen.