Univention Bugzilla – Bug 17519
Anonymous Bind unterbinden
Last modified: 2019-11-05 22:13:57 CET
Wir sollten mit UCS 3.0 den Anonymous Bind per Default abschalten. Über eine UCR Variable sollte das alte Verhalten wieder aktivierbar sein.
Es gibt jetzt im Scope ucs_2.3-0-restrictedbind ein geforktes Source Paket univention-ldap, in dem univention-ldap-acl-{master,slave} so erweitert sind, dass zwei neue UCR Variablen ausgewertet werden: ldap/acl/read/anonymous ldap/acl/read/ips Durch univention-ldap-config.postinst werden in ldap/acl/read/ips alle aktuell gesetzten interfaces/.*/address Werte eingetragen, wenn diese Variable noch nicht gesetzt ist. Dadurch haben alle Anfragen, die von einem lokalen Interface kommen, Leseberechtigung auf LDAP-Daten, die nicht durch andere ACLs reglementiert sind. Das alte Verhalten kann man dadurch wiederherstellen, dass man ldap/acl/read/anonymous auf 'yes' oder 'true' setzt und den slapd neu startet. In der QA sollten alle Systemrollen mit lokalem LDAP getestet werden (Master, Backup, Slave), sowie ein Memberserver. Die IP des Memberservers muss bei dem System zusätzlich in UCR:ldap/acl/read/ips eingetragen werden, der für ihn als UCR:ldap/master festgelegt ist. Neben der Replikation muss univention-policy-result und die libnss-ldap Anbindung funktionieren.
Fixed in Scope
Um über diese erste Einschränkung hinaus anonymous binds zu vermeiden, müssten wohl zusätzlich zumindest folgende Dateien angepasst werden: /usr/share/univention-directory-manager/uniconf/modrelogin.py /etc/univention/templates/files/etc/libnss-ldap.conf ln -sf /etc/some.secret /etc/libnss-ldap.secret /etc/univention/templates/files/etc/dhcp3/dhcpd.conf /usr/lib/univention-directory-listener/system/bind.py /etc/univention/templates/files/etc/postfix/main.cf.d/40_ldap /etc/univention/templates/files/etc/imapd/imapd.conf (auth_ldap_group) /etc/horde/horde3/conf.php und /etc/horde/horde3/kolab.php /etc/init.d/slapd sowie univention-policy-result Man kann root zusätzlich die Angabe eines standard-BaseDN dadurch abnehemen, dass man ihn in /root/.ldaprc einträgt, das BindPW lässt sich dort nicht hinterlegen, sondern müsste bei den ldap-utils separat übergeben werden.
Ich würde vorschlagen, dass wir in UCS 3.0 es folgendermaßen umsetzen: ldap/acl/read/anonymous auf yes oder true erlaubt global den anonymen Lesezugriff. Wenn der Wert auf no oder false gesetzt ist (defualt), so wird der anonyme Zugriff nur von den in ldap/acl/read/ips erlaubt. Per default setzen wir den Wert auf 127.0.0.1. Alle lokalen Dienste, die LDAP benötigen, sollten dann localhost verwendent.
Auf Systemen, die für nss, pam und ldapsearch nicht einen lokalen LDAP-Server verwendet, müssen bind-Credentials hinterlegt sein: A) Falls machine.secret existiert, können Prozesse, die mit root-Privilegien laufen diese verwenden. Da in ldap.conf anscheinend keine Datei angegeben werden kann, müssten die Aufrufe des ldapsearch-Binaries durch einen Wrapper ersetzt werden, der "ldapsearch -D $binddn -y $pwd_file" mit den besten Credentials aufruft, die für den Aufrufer lesbar sind. B) Für Thinclients müsste ein Weg geschaffen werden, pseudo-anonym zu Suchen, z.B. durch Verwendung eines gemeinsamen Bind-DNs, dessen Passwort im Thin-Client-root hinterlegt ist und das regelmäßig automatisch rotiert wird. Damit das domänenweit funktioniert, müsste dieses Passwort vermutlich auch im Klartext im LDAP hinterlegt sein. C) Da unprivilegierte Benutzer nicht an machine.secret herankommen, funktioniert getent passwd für sie nur, wenn der nscd läuft (der für nss_ldap den "rootbinddn" aus libnss_ldap.conf verwendet). Wenn es den in B) angesprochenen BindDN für pseudo-anonyme Suche gibt, dann könnte man diesen für normale Benutzer konfigurieren ( libnss_ldap.conf und pam_ldap bieten hierfür extra die Optionen "binddn" und "bindpw", letzteres ist dann aber für alle lokalen Benutzer lesbar ).
Als Alternative könnten die Adressen der Thin Clients und Memberserver per Listener in eine UCR-Variable geschrieben werden, so das der Zugriff anonym erlaubt ist. Das sollte dann aber de-aktivierbar sein, so dass der Administrator die IPs manuell pflegen kann.
Für Thinclients ist jetzt Bug 22633 angelegt.
Der aktuelle Stand der Anpassungen für diesen Bug ist: * LDAP-ACLs erlauben anonyme Suche nur noch von 127.0.0.1 und den IPs des lokalen Systems (per UCR:ldap/acl/read/ips) * libnss-ldap verwendet bei Zugriffen durch root die machine credentials, das Gleiche gilt für libpam-ldap. Diese Anpassung ist für Memberserver vorgenommen worden, auf denen dadurch eine Benutzer/Gruppenauflösung per nscd möglich wird. Durch diese Lösung wird eine neue Abhängigkeit eingeführt: Falls der nscd nicht läuft, können nicht-privilegierte Benutzer keine Benutzer/Gruppen auflösen. * Es gibt ein Skript univention-ldapsearch, das die machine credentails verwendet, falls keine anderen angegeben sind. Leider ließ sich das nicht analog zu libnss-ldap.conf per /etc/ldap/ldap.conf regeln, da man in der ldap.conf keine Passwortdatei angeben kann --Eine Alternative wäre, das in ldap-tools zu erweitern und den Patch upstream zu schicken.
Die schema-Suche im slapd-Initskript erfolgt jetzt per ldapi-Interface.
Per Default wird jetzt ein anonymer Bind nicht mehr zugelassen. Auch nicht von den lokalen IP-Adressen. Im Wiki sind Lösungen aufgeführt: http://wiki.univention.de/index.php?title=UCS_3.0_LDAP Etwas problematisch war die Umstellung in univention-join. Problem ist, dass der Benutzername in eine DN umgewandelt werden muss. Das wird jetzt folgendermaßen versucht: - auf dem Master wird versucht per udm users/user list die DN zu bekommen. Der Join User muss dann Zugriff auf die ldap.secret haben - auf dem Master wird als zweites versucht per ldapi-Interface zu suchen. Dafür muss der Join User Zugriff auf die ldapi-Socketdatei haben - als letztes wird versucht anonym zu suchen
In folgenden Paketen wurden die Aufrufe für univention_policy_result so angepasst, dass per '-D'/'-y' Maschinen-Credentials übergeben werden: * univention-updater * univention-samba * univention-printclient * univention-quota * univention-server * univention-home-mounter * univention-directory-manager-modules * univention-kde Dabei wurde auch wo nötig das Wording für baseconfig angepasst. Bug 23201 wurde absepariert, da der Aufruf aus Skripten mit Benutzerrechten noch nicht in RC1 funktionieren muss.
Configure 20univention-directory-policy.inst Traceback (most recent call last): File "/usr/lib/univention-directory-policy/univention-policy-set-repository-server", line 100, in <module> main() File "/usr/lib/univention-directory-policy/univention-policy-set-repository-server", line 82, in main new_server, update = query_policy() File "/usr/lib/univention-directory-policy/univention-policy-set-repository-server", line 66, in query_policy return (server, update) UnboundLocalError: local variable 'update' referenced before assignment run-parts: /usr/lib/univention-directory-policy/univention-policy-set-repository-server exited with return code 1
Der Fehler aus Comment 12 ist behoben. Folgende Quell-Pakete wurden so angepasst, dass der hostaccount bei der LDAPsuche verwendet wird: univention-lib ## reicht jetzt zusätzliche Argumente -D/-y durch univention-quota univention-nagios-servicechecks univention-nfs univention-bind univention-squid univention-printserver univention-samba univention-pkgdb univention-printquota univention-ldap-overlay-memberof univention-ldap univention-join univention-directory-manager-modules univention-system-setup Dabei wurden einige Python-Skripte das ConfigRegistry-Wording angepasst und ucslint konforme Anpassungen vorgenommen.
Die Änderung r26004 fügt Bash-Spezifika zu joinscripthelper.lib hinzu, diese muss aber sh-kompatibel sein. (Siehe auch Bug #23006)
Die Änderung r26004 ist jetzt entfernt, Paket univention-join baut gerade neu. Changelog Eintrag ist jetzt auch eingecheckt.
Wie du irgendwann schon vorgeschlagen hast, sollten pam_ldap und libnss-ldap auch nach dem Update den Host Account verwenden, also pamldap/auth und nssldap/auth auf yes.
Die UCR-Variablen werden jetzt im postinst per ucr?default auf true gesetzt, sowohl bei Update als auch bei Neuinstallation.
OK, das funktioniert soweit.
Created attachment 3811 [details] Simple Bind Failed: NT_STATUS_LOGON_FAILURE
(In reply to comment #19) > Created an attachment (id=3811) [details] > Simple Bind Failed: NT_STATUS_LOGON_FAILURE Dort wird der S4 LDAP Server gefragt (Port 389).
(In reply to comment #20) > (In reply to comment #19) > > Created an attachment (id=3811) [details] [details] > > Simple Bind Failed: NT_STATUS_LOGON_FAILURE > > Dort wird der S4 LDAP Server gefragt (Port 389). Ohne Korrektur funktioniert die automatische Quotaübernahme über /usr/sbin/univention-user-quota nicht.
Comment 19 betraf eigentlich Bug 23231, das Problem sollte jetzt gefixt sein, Paket ist neu gebaut.
Funktioniert, die Quota Einstellungen werden jetzt auch auf einem S4 System übernommen.
UCS 3.0-0 wurde veröffentlicht. Sollte der hier beschriebene Bug mit einer neueren Version von UCS erneut auftreten, so sollte dieser Bug dupliziert werden: "Clone This Bug"