LDAP-Anmeldung

Anmeldung über LDAP oder Active Directory einrichten und Gruppen auf Rollen abbilden

Zielgruppe: Technische Administration

Überblick

Neben lokalen Konten kann oPBWeb Benutzer gegen ein LDAP-Verzeichnis oder Active Directory anmelden. Die Rolle in oPBWeb ergibt sich dann aus den Gruppenmitgliedschaften im Verzeichnis. Du konfigurierst die Anbindung über LDAP_*-Variablen in der .env und das Passwort des Dienstkontos in secrets/ldap_bind_password.txt. In der Oberfläche gibt es dafür keine Einstellungen.

So läuft die Anmeldung ab

  1. Gibt es in oPBWeb ein lokales Konto mit dem eingegebenen Benutzernamen, meldet oPBWeb ausschließlich lokal an. Das Verzeichnis wird nicht gefragt, auch wenn das Passwort falsch ist.
  2. Sonst, bei LDAP_ENABLED=true, verbindet sich oPBWeb mit dem Dienstkonto (LDAP_BIND_DN) oder anonym, wenn kein Bind-DN gesetzt ist.
  3. oPBWeb sucht mit LDAP_USER_FILTER unterhalb von LDAP_USER_SEARCH_BASE (leer: LDAP_BASE_DN). Die Suche muss genau einen Eintrag liefern.
  4. Mit dem gefundenen DN und dem eingegebenen Passwort meldet sich oPBWeb als Benutzer an und prüft so das Passwort.
  5. Aus dem Attribut memberOf bestimmt oPBWeb die Rolle (siehe unten). Ohne passende Gruppe gibt es keinen Zugang.
  6. Beim ersten erfolgreichen Login legt oPBWeb das Konto mit der Herkunft „Verzeichnis (LDAP)“ an. Anzeigename (displayName), E-Mail (mail) und Rolle werden bei jeder Anmeldung neu aus dem Verzeichnis übernommen.

Lokale Konten bleiben also immer lokal, auch das erste Administrator-Konto. So kommst du auch bei einem Ausfall des Verzeichnisses noch an oPBWeb heran.

Variablen

VariableStandardBedeutung
LDAP_ENABLEDfalseLDAP-Anmeldung einschalten
LDAP_HOST–Hostname des Domänencontrollers bzw. LDAP-Servers
LDAP_PORT636Port
LDAP_USE_SSLtrueLDAPS (TLS ab Verbindungsaufbau); StartTLS wird nicht unterstützt
LDAP_TLS_VERIFYtrueServerzertifikat prüfen
LDAP_CA_CERTS_FILE–CA-Datei im Container, z. B. /run/certs/ldap/ca.pem
LDAP_BASE_DN–Basis-DN des Verzeichnisses
LDAP_USER_SEARCH_BASE–Suchbasis für Benutzer; leer = LDAP_BASE_DN
LDAP_USER_FILTER(&(objectClass=user)(sAMAccountName={username}))Suchfilter; {username} wird durch den eingegebenen Namen ersetzt (maskiert)
LDAP_BIND_DN–DN des Dienstkontos für die Suche; leer = anonyme Suche
LDAP_ADMIN_GROUPS–Gruppen-DNs für die Rolle Administrator
LDAP_RELEASER_GROUPS–Gruppen-DNs für die Rolle Releaser
LDAP_PACKAGER_GROUPS–Gruppen-DNs für die Rolle Packager
LDAP_VIEWER_GROUPS–Gruppen-DNs für die Rolle Leser

Das Passwort des Dienstkontos steht nicht in der .env, sondern in secrets/ldap_bind_password.txt (von init-secrets.sh leer angelegt). Die Verbindung hat ein Zeitlimit von 10 Sekunden für den Aufbau und 15 Sekunden für Antworten.

Beispiel Active Directory

Ein Beispiel für eine Domäne example.local. Ersetze alle Namen durch deine Werte:

LDAP_ENABLED=true
LDAP_HOST=dc01.example.local
LDAP_PORT=636
LDAP_USE_SSL=true
LDAP_TLS_VERIFY=true
LDAP_CA_CERTS_FILE=/run/certs/ldap/ca.pem
LDAP_BASE_DN=dc=example,dc=local
LDAP_USER_SEARCH_BASE=ou=Benutzer,dc=example,dc=local
LDAP_USER_FILTER=(&(objectClass=user)(sAMAccountName={username}))
LDAP_BIND_DN=cn=svc-opbweb,ou=Dienstkonten,dc=example,dc=local
LDAP_ADMIN_GROUPS=cn=opbweb-admins,ou=Gruppen,dc=example,dc=local
LDAP_RELEASER_GROUPS=cn=opbweb-releaser,ou=Gruppen,dc=example,dc=local
LDAP_PACKAGER_GROUPS=cn=opbweb-packager,ou=Gruppen,dc=example,dc=local;cn=client-team,ou=Gruppen,dc=example,dc=local
LDAP_VIEWER_GROUPS=cn=opbweb-leser,ou=Gruppen,dc=example,dc=local

Weitere Filter, an dein Verzeichnis anzupassen:

ZweckFilter
Anmeldung mit UPN statt Kontoname(&(objectClass=user)(userPrincipalName={username}))
deaktivierte AD-Konten ausschließen(&(objectClass=user)(sAMAccountName={username})(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
OpenLDAP mit uid(&(objectClass=inetOrgPerson)(uid={username})) – setzt das memberOf-Overlay voraus

Einrichten

  1. Trage die Variablen wie oben in die .env ein.

  2. Schreibe das Passwort des Dienstkontos in secrets/ldap_bind_password.txt (ohne Zeilenumbruch am Ende ist am sichersten; führende und abschließende Leerzeichen entfernt oPBWeb).

  3. Lege bei einer eigenen Unternehmens-CA das CA-Zertifikat im PEM-Format vor dem Setup als ldap-ca.pem neben setup-opbweb.sh (das Setup verschiebt es nach certs/ldap/ldap-ca.pem und schlägt es als CA-Datei vor) oder direkt unter certs/ldap/ ab. Das Verzeichnis certs/ldap/ ist im Container als /run/certs/ldap/ schreibgeschützt eingebunden; LDAP_CA_CERTS_FILE gibt den Pfad im Container an. Ohne CA-Datei prüft oPBWeb gegen die Standard-CAs des Containers.

  4. Starte den Stack neu, damit die API die neuen Werte und das Secret liest:

    ./stop.sh
    ./start.sh
    
  5. Melde dich mit einem Verzeichniskonto an. Unter Benutzer und Rollen erscheint das Konto mit der Herkunft „Verzeichnis (LDAP)“ und der zugeordneten Rolle.

Gruppen und Rollen

  • In jeder LDAP_*_GROUPS-Variablen stehen ein oder mehrere vollständige Gruppen-DNs, getrennt durch ;.
  • oPBWeb vergleicht die DNs ohne Rücksicht auf Groß- und Kleinschreibung, aber sonst exakt mit den Werten aus memberOf.
  • Die höchste Rolle gewinnt: Administrator vor Releaser vor Packager vor Leser.
  • Keine passende Gruppe, kein Zugang: Die Anmeldung scheitert mit „Keine Berechtigung für oPBWeb (keine passende Gruppe).“ Ist keine der vier Variablen gesetzt, kann sich niemand über LDAP anmelden.
  • Verschachtelte Gruppen löst oPBWeb nicht auf; maßgeblich ist nur, was memberOf direkt liefert. Die primäre Gruppe eines AD-Kontos (meist „Domänen-Benutzer“) steht nicht in memberOf.

Was die Rollen im Einzelnen dürfen, beschreibt Benutzer und Rollen .

Verhalten von Verzeichniskonten

ThemaVerhalten
Rollekommt aus den Gruppen und wird bei jeder Anmeldung neu gesetzt; in der Oberfläche nicht änderbar
Rollenänderung im Verzeichniswirkt erst bei der nächsten Anmeldung mit Passwort; eine laufende Sitzung erneuert sich bis zu 7 Tage lang ohne Rückfrage beim Verzeichnis
Passwortwird im Verzeichnis geändert; Passwort ändern und Passwort setzen gibt es für diese Konten nicht
Sperre nach Fehlversuchendie Kontosperre gilt nur für lokale Konten; für Verzeichniskonten greift die Sperrrichtlinie des Verzeichnisses. Die Grenze für Fehlversuche pro Adresse gilt auch für LDAP-Anmeldungen.
Deaktivieren in oPBWebmöglich; das Konto kann sich dann trotz gültigem Verzeichnis-Passwort nicht mehr anmelden
Zugang sofort entziehenKonto unter Benutzer und Rollen deaktivieren; das beendet auch laufende Sitzungen

Gleichnamige Konten: Existiert ein lokales Konto mit demselben Namen wie ein Verzeichniskonto, gilt immer das lokale Konto.

Fehlersuche

Meldung beim AnmeldenUrsacheAbhilfe
„Verzeichnisdienst nicht erreichbar.“Verbindung, TLS oder Suche mit dem Dienstkonto fehlgeschlagenLog der API prüfen (siehe unten): Host, Port, CA-Datei, Bind-DN und Passwort
„Benutzername oder Passwort falsch.“falsches Passwort, Benutzer nicht gefunden oder Filter liefert mehr als einen EintragFilter und Suchbasis prüfen; Anmeldung mit demselben Konto direkt am Verzeichnis testen
„Keine Berechtigung für oPBWeb (keine passende Gruppe).“Anmeldung gelungen, aber keine Gruppe passtGruppen-DNs exakt mit memberOf des Benutzers vergleichen; direkte Mitgliedschaft prüfen
„Konto ist deaktiviert.“Konto in oPBWeb deaktiviertunter Benutzer und Rollen wieder aktivieren

Fehler bei Verbindung und Suche schreibt die API ins Log:

docker logs opbweb-api 2>&1 | grep -i "LDAP search failed"

Typische Ursachen sind ein Hostname, der nicht zum Zertifikat passt, eine fehlende oder falsche CA-Datei (Pfad im Container, nicht auf dem Host), ein leeres secrets/ldap_bind_password.txt oder ein Domänencontroller, der vom Docker-Host aus nicht erreichbar ist.

Zum Gegenprüfen der Suche eignet sich ldapsearch auf einem Rechner mit den OpenLDAP-Werkzeugen. Beispiel, an deine Werte anzupassen:

ldapsearch -H ldaps://dc01.example.local:636 \
  -D "cn=svc-opbweb,ou=Dienstkonten,dc=example,dc=local" -W \
  -b "ou=Benutzer,dc=example,dc=local" \
  "(&(objectClass=user)(sAMAccountName=mmuster))" memberOf displayName mail

Die ausgegebenen memberOf-Werte kannst du direkt in die LDAP_*_GROUPS-Variablen übernehmen.