LDAP-Integration
Bindet owncloud.online an ein LDAP-Verzeichnis oder ein Active Directory an. Benutzer und Gruppen kommen aus dem Verzeichnis, die Anmeldung prüft der Verzeichnisdienst; owncloud.online speichert die Verzeichnis-Passwörter nicht.
Was die App tut
- Meldet ein Benutzer- und ein Gruppen-Backend an owncloud.online an, sobald mindestens eine aktive Konfiguration vorhanden ist.
- Liest Benutzer und Gruppen anhand von Filtern aus dem Verzeichnis.
- Übernimmt Attribute wie Anzeigename, E-Mail-Adresse, Speicherkontingent,
Home-Verzeichnis und – wenn Avatare systemweit aktiv sind – das Bild aus
jpegPhoto, ersatzweise austhumbnailPhoto. - Vergibt für jeden gefundenen Eintrag einen internen Benutzer- bzw.
Gruppennamen und hält die Zuordnung in den Tabellen
oc_ldap_user_mappingundoc_ldap_group_mappingfest. - Erlaubt mehrere Verzeichnisse nebeneinander. Jede Konfiguration hat eine eigene ID und wird getrennt gepflegt.
Voraussetzungen
- owncloud.online 11.x
- PHP 8.4 mit der Erweiterung
ldap– fehlt sie, zeigt die Einstellungsseite eine Warnung und das Backend arbeitet nicht - erreichbarer LDAP- oder AD-Server; für StartTLS bzw.
ldaps://muss das Zertifikat der Gegenstelle auf dem Server vertrauenswürdig sein - ein Bind-Konto mit Leserecht auf den benötigten Teilbaum, oder anonymer Lesezugriff
- ein laufender Cron, wenn der Abgleich regelmäßig laufen soll
- die App
user_webdavauthdarf nicht gleichzeitig aktiv sein – beide zusammen führen zu unerwartetem Verhalten und schreiben eine Warnung ins Log
Installation
Über den Market ist es der einfachere Weg. Von Hand:
cd /var/www/owncloud.online/apps
git clone https://github.com/BWTECH-github/user_ldap.git
cd user_ldap
composer install --no-dev
chown -R www-data:www-data .
sudo -u www-data php8.4 ../../occ app:enable user_ldap
Einstellungen
Die Oberfläche liegt unter Einstellungen → Administration →
Nutzer-Authentifizierung. Der Assistent führt durch die Reiter Server,
Benutzer, Loginattribute und Gruppen; dazu kommen Fortgeschritten
und Experte. Alle Werte landen in der Tabelle oc_appconfig unter der
App-Kennung user_ldap, jeweils mit der Konfigurations-ID als Präfix.
Verbindung
Im Reiter Server stehen Host und Port. Das Protokoll können Sie
weglassen; für LDAP über SSL beginnen Sie mit ldaps://. Benutze StartTLS
support schaltet StartTLS ein – das ist etwas anderes als
LDAPS, für das dieses Kästchen nicht gesetzt werden muss.
Unter Fortgeschritten → Verbindungseinstellungen liegen Konfiguration aktiv (ohne diesen Haken wird die Konfiguration übersprungen), Backup-Host (Kopie) nebst Port, Hauptserver deaktivieren, das Abschalten der SSL-Zertifikatsprüfung, Speichere Time-To-Live zwischen (Cache, Vorgabe 600 Sekunden) und Netzwerk-Zeitüberschreitung (Vorgabe 15 Sekunden). Die Zertifikatsprüfung sollten Sie höchstens zum Eingrenzen eines Fehlers abschalten; besser importieren Sie das Zertifikat des LDAP-Servers.
Bind-Konto
Benutzer-DN und Passwort im Reiter Server sind die Zugangsdaten des
Kontos, mit dem der Bind durchgeführt wird, zum Beispiel
uid=agent,dc=example,dc=com. Für anonymen Zugriff lassen Sie beide Felder
leer. Das Passwort wird base64-kodiert in oc_appconfig abgelegt – das ist
keine Verschlüsselung; geben Sie dem Konto nur Leserechte.
Basis-DN
Server → Einen Basis-DN pro Zeile (ldap_base) nimmt einen oder mehrere
Bäume auf. Getrennte Bäume für Benutzer und Gruppen stellen Sie unter
Fortgeschritten → Ordnereinstellungen als Basis-Benutzerbaum
(ldap_base_users) und Basis-Gruppenbaum (ldap_base_groups) ein. Die
Schaltflächen Base DN ermitteln und Base DN testen prüfen die Eingabe
gegen den Server.
Benutzer-, Anmelde- und Gruppenfilter
| Reiter | Wofür der Filter gilt | Schlüssel |
|---|---|---|
| Benutzer | welche Einträge als Benutzer gelten (Auflistung, Suche) | ldap_userlist_filter |
| Loginattribute | welcher Eintrag zum eingegebenen Anmeldenamen gehört | ldap_login_filter |
| Gruppen | welche Einträge als Gruppen gelten | ldap_group_filter |
Im geführten Modus wählen Sie Nur diese Objektklassen: und Nur aus diesen
Gruppen:; über LDAP-Abfrage bearbeiten schreiben Sie den Filter selbst.
Im Anmeldefilter steht %uid für den eingegebenen Anmeldenamen, Beispiel
uid=%uid; ohne diesen Platzhalter meldet die App die Konfiguration als
fehlerhaft. Im Reiter Loginattribute legen Sie zusätzlich fest, ob die
Anmeldung über LDAP-/AD-Benutzername:, LDAP-/AD-E-Mail-Adresse: oder
Andere Attribute: erlaubt ist.
Bei großen Verzeichnissen empfiehlt sich LDAP-Filter manuell eingeben. Das verhindert die automatischen Sammelabfragen des Assistenten.
Attributzuordnung
Benutzer- und Gruppenattribute liegen unter Fortgeschritten → Ordnereinstellungen bzw. Spezielle Eigenschaften.
| Feld | Schlüssel | Vorgabe |
|---|---|---|
| Feld für den Anzeigenamen des Benutzers | ldap_display_name |
displayName |
| 2. Benutzeranzeigename Feld | ldap_user_display_name_2 |
leer |
| Feld für den Anzeigenamen der Gruppe | ldap_group_display_name |
cn |
| E-Mail-Feld | ldap_email_attr |
leer |
| Kontingent Feld | ldap_quota_attr |
leer |
| Standard Kontingent | ldap_quota_def |
leer |
| Benennungsregel für das Home-Verzeichnis des Benutzers | home_folder_naming_rule |
leer |
| Benutzersucheigenschaften | ldap_attributes_for_user_search |
leer |
| Gruppensucheigenschaften | ldap_attributes_for_group_search |
leer |
Leere Felder bedeuten das jeweilige Standardverhalten: Anzeigename aus
displayName, Kontingent aus den Vorgaben von owncloud.online, Home-
Verzeichnis nach dem internen Benutzernamen. Suchattribute werden zeilenweise
eingetragen; jeder Attributwert wird dabei auf 191 Zeichen gekürzt.
Die Gruppenzugehörigkeit steuern Assoziation zwischen Gruppe und Benutzer
(ldap_group_member_assoc_attribute, Vorgabe uniqueMember, daneben
memberUid und member – im Auswahlfeld als „member (AD)“ beschriftet) und
Gruppen-Mitglied Algorithmus (ldap_group_member_algo):
| Wert | Bedingung |
|---|---|
groupScan (Vorgabe) |
ohne Einschränkungen, unterstützt verschachtelte Gruppen |
memberOf |
setzt das Attribut memberOf voraus, keine verschachtelten Gruppen |
recursiveMemberOf (im Auswahlfeld „recursiveMemberOf (AD)“) |
setzt memberOf und den Operator LDAP_MATCHING_RULE_IN_CHAIN voraus; berücksichtigt nur explizit eingetragene Mitglieder, die AD-Primärgruppe also nicht |
Im Zweifel bleibt groupScan die sichere Wahl. Eingebundene Gruppen
(ldap_nested_groups) funktioniert nur, wenn das Mitgliedsattribut DNs
enthält. Dynamische Gruppenmitglied URL
(ldap_dynamic_group_member_url) schaltet dynamische Mitgliedschaften ein;
leer heißt aus.
Der interne Benutzername
Der interne Benutzername identifiziert das Konto innerhalb von
owncloud.online. Er wird standardmäßig aus dem UUID-Attribut gebildet, darf
nur die Zeichen a-zA-Z0-9+_.@- enthalten und bekommt bei Namenskollisionen
eine Zahl angehängt. Er ist zugleich der Vorgabename des Home-Verzeichnisses
und Bestandteil der Remote-URLs, etwa für alle *DAV-Dienste.
Genau deshalb ändert man ihn nicht nachträglich. Die Zuordnung interner Name
↔ Verzeichniseintrag steht in oc_ldap_user_mapping; Dateien, Freigaben,
Home-Verzeichnis und die von den Clients gespeicherten URLs hängen daran. Die
Felder Attribut für internen Benutzernamen: (ldap_expert_username_attr),
Attribut für internen Gruppennamen: (ldap_expert_groupname_attr) sowie
UUID-Attribute für Benutzer: / UUID-Attribute für Gruppen:
(ldap_expert_uuid_user_attr, ldap_expert_uuid_group_attr) im Reiter
Experte wirken sich ausschließlich auf neu zugeordnete Einträge aus –
bestehende Konten behalten ihren Namen.
Die Schaltflächen LDAP-Benutzernamenzuordnung löschen und LDAP-Gruppennamenzuordnung löschen leeren die Zuordnungstabellen für alle LDAP-Konfigurationen und hinterlassen überall Restdaten. Benutzen Sie sie nur in Test- oder Experimentierumgebungen.
Abgleich per Cron
Die App bringt selbst keinen Hintergrundauftrag mit. Den Abgleich stößt der
Kernbefehl occ user:sync an; er trägt die Konten des Backends in die
Kontentabelle ein. Die Backend-Klasse für LDAP ist
OCA\User_LDAP\User_Proxy, die Kurzform ldap tut es ebenso.
# alle Konten abgleichen
sudo -u www-data php8.4 occ user:sync 'OCA\User_LDAP\User_Proxy'
# Konten, die im Verzeichnis nicht mehr vorkommen, deaktivieren
sudo -u www-data php8.4 occ user:sync -m disable 'OCA\User_LDAP\User_Proxy'
# ein einzelnes Konto abgleichen
sudo -u www-data php8.4 occ user:sync -u jmeier 'OCA\User_LDAP\User_Proxy'
Für --missing-account-action (kurz -m) sind disable und remove
zulässig; remove löscht das Konto samt Daten und Dateien. Ohne diese Option
fragt der Befehl interaktiv nach – im Cron geben Sie sie deshalb immer mit an,
damit gesperrte oder entfernte Verzeichniseinträge auch in owncloud.online
nachgezogen werden.
Kommandozeile
Die App bringt acht Befehle mit. Die Konfigurations-ID vergibt
ldap:create-empty-config selbst (s01, s02, …); bei sehr alten
Installationen kann die allererste Konfiguration eine leere ID haben.
# neue, leere Konfiguration anlegen
sudo -u www-data php8.4 occ ldap:create-empty-config
# Konfigurationen anzeigen – ohne ID alle
sudo -u www-data php8.4 occ ldap:show-config
sudo -u www-data php8.4 occ ldap:show-config s01 --show-password
# einzelnen Wert setzen
sudo -u www-data php8.4 occ ldap:set-config s01 ldap_host ldap.example.com
# Konfiguration prüfen (Verbindung und Bind)
sudo -u www-data php8.4 occ ldap:test-config s01
# Konfiguration löschen
sudo -u www-data php8.4 occ ldap:delete-config s01
# Benutzer oder Gruppen suchen
sudo -u www-data php8.4 occ ldap:search "meier"
sudo -u www-data php8.4 occ ldap:search "" --group --limit 50
# prüfen, ob ein Konto im Verzeichnis noch vorhanden ist
sudo -u www-data php8.4 occ ldap:check-user jmeier
# Cache der LDAP-Backends leeren
sudo -u www-data php8.4 occ ldap:invalidate-cache
ldap:search kennt --group, --offset und --limit (Vorgabe 15, 0 hebt
die Begrenzung auf; der Offset muss ein Vielfaches des Limits sein).
ldap:check-user kennt --force, um auch bei abgeschalteter Konfiguration zu
prüfen.
Weitere Schalter
Diese Werte haben keine Oberfläche. Sie gelten für alle LDAP-Konfigurationen gemeinsam.
Über occ config:app:set user_ldap …:
| Schlüssel | Vorgabe | Wirkung |
|---|---|---|
reuse_accounts |
no |
Bei yes darf eine Zuordnung auf ein bereits vorhandenes Konto gleichen Namens zeigen, sofern dieses aus demselben LDAP-Backend stammt. Konten aus anderen Backends werden immer abgelehnt und protokolliert. |
enforce_home_folder_naming_rule |
true |
Fehlt einem Benutzer das Attribut aus der Benennungsregel für das Home-Verzeichnis, bricht die App mit einem Fehler ab. Auf false gesetzt, gilt stattdessen die Vorgabe. |
resolve_uid_by_legacy_dn |
true |
Als letzter Versuch wird ein Benutzer auch über die alte DN-Schreibweise in der Zuordnungstabelle gesucht und der Eintrag danach auf den aktuellen DN gehoben. |
In config.php:
-
'user_ldap.enable_medial_search' => trueStandardmäßig trifft eine Suche nur den Anfang des Namens: Bei den Benutzern „erl“ und „peter“ findet die Eingabe „er“ nur „erl“. Mit dieser Option wird zusätzlich in der Mitte gesucht, „er“ findet dann beide. Beachten Sie dabei:
- Die Option gilt für alle LDAP-Verbindungen, nicht je Konfiguration.
- Sie kann große Verzeichnisse belasten, weil für solche Suchen meist kein Index greift. Ob Ihr Verzeichnis das unterstützt, klären Sie mit dem Betreiber; die Option arbeitet auch ohne passenden Index, und kleine Installationen kommen damit oft gut zurecht.
- Sie wirkt nur, wenn die Benutzerauflistung im Freigabedialog erlaubt ist
(
core/shareapi_allow_share_dialog_user_enumeration).
-
'ldapIgnoreNamingRules' => trueSchaltet die Bereinigung des internen Benutzernamens ab – keine Transliteration, keine Einschränkung auf
a-zA-Z0-9+_.@-. Wirkt nur auf neu zugeordnete Einträge und kann Namen erzeugen, mit denen andere Teile des Systems nicht rechnen.
Fehlersuche
| Symptom | Ursache | Abhilfe |
|---|---|---|
| Warnung auf der Einstellungsseite, Anmeldung schlägt fehl | PHP-Modul ldap fehlt |
Erweiterung installieren, PHP-FPM neu starten |
| Bind schlägt fehl, Konfiguration wird als ungültig gemeldet | Host, Port, Bind-Konto oder Zertifikat stimmen nicht | occ ldap:test-config <ID>; Zertifikat importieren; zum Eingrenzen kurzzeitig die Zertifikatsprüfung abschalten |
| Konfiguration bleibt wirkungslos | Konfiguration aktiv ist nicht gesetzt | Haken unter Fortgeschritten → Verbindungseinstellungen setzen |
| Keine Benutzer sichtbar | Basis-DN oder Benutzerfilter passen nicht | occ ldap:search "" und die Filter im Assistenten prüfen |
| Anmeldung schlägt trotz korrektem Passwort fehl | Anmeldefilter trifft den Eintrag nicht oder enthält kein %uid |
Filter im Reiter Loginattribute prüfen, Loginnamen testen benutzen |
| Gruppen bleiben leer | falsches Mitgliedsattribut oder ungeeigneter Algorithmus | Assoziation zwischen Gruppe und Benutzer prüfen, Algorithmus auf groupScan stellen |
| Geändertes Kontingent oder geänderte E-Mail kommen nicht an | Cache | occ ldap:invalidate-cache, notfalls Speichere Time-To-Live zwischen senken |
| Verzeichniseintrag gelöscht, Konto bleibt bestehen | kein Abgleich eingerichtet | occ ldap:check-user <name>, danach occ user:sync -m disable … |
| Suche findet nur Treffer am Wortanfang | Standardverhalten | user_ldap.enable_medial_search setzen |
| Timeouts oder abgeschnittene Ergebnislisten | Paging oder Zeitgrenze zu knapp | Seitenstücke (Paging chunksize) und Netzwerk-Zeitüberschreitung anpassen |
| Unerwartetes Verhalten, Warnung im Log | user_webdavauth ist ebenfalls aktiv |
eine der beiden Apps abschalten |
Tests
make test-php-unit # PHPUnit
make test-php-style # Code-Stil
make test-php-phan # Phan
make test-php-phpstan # PHPStan
Herkunft
Fork der App user_ldap der ownCloud GmbH, gepflegt von der BW-Tech GmbH für
owncloud.online und PHP 8.4. Lizenz: AGPLv3.
Quelltext: https://github.com/BWTECH-github/user_ldap