WvdS.DokuWiki.Entra Plugin
Plugin: wvdsentra
Version: 1.0.0 (Phase 1)
Namespace: lib/plugins/wvdsentra/
Typ: Authentifizierungs-Backend (authtype)
Autor: Wolfgang van der Stille Wolfgang.van.der.Stille@gmail.com (The White Knight Labs)
Lizenz: GPL 2
$conf['authtype'] steht weiterhin auf authplain). Zum Aktivieren die Verbindungsdaten
konfigurieren und authtype auf wvdsentra umstellen — vorher den Login-Simulator in der
Admin-UI nutzen, um Aussperrung zu vermeiden.
Definition
Das wvdsentra Plugin authentifiziert DokuWiki-Benutzer gegen Entra ID / Azure AD in Hybrid-Umgebungen (On-Prem AD oder Azure AD DS mit erreichbarem LDAP) und hält die IdP-Gruppenmitgliedschaft mit den DokuWiki-ACL-Gruppen zur Laufzeit synchron.
Es erweitert das gebündelte authad-Backend und ändert daran nur zwei Dinge:
- Gruppen-Remapping — rohe AD-Gruppen werden über eine konfigurierbare Tabelle auf
DokuWiki-Gruppen (@user/@wvds/@wvdse/@admin) abgebildet.
- Break-Glass-Fallback — konfigurierte lokale Konten werden gegen
conf/users.auth.php
geprüft, auch bei AD-Ausfall (Schutz vor Total-Aussperrung).
Die gesamte adLDAP-/memberOf-/SSO-Mechanik stammt unverändert von authad.
Funktionsprinzip (Runtime-Claims-Modell)
- Entra/AD ist Quelle der Wahrheit für Identität + Gruppenmitgliedschaft.
acl.auth.phpbleibt handgepflegte Quelle der Wahrheit dafür, was jede Gruppe darf.- Bei jedem Login schreibt das Plugin die gemappten DokuWiki-Gruppen in
$USERINFO['grps'].
Dieselbe eine Injektion steuert Kern-ACL, <ifgroup> (wvdscond) und wkacmenu.
- Es wird niemals in
acl.auth.phpoderusers.auth.phpgeschrieben — keine Drift,
kein Cron-Job.
Anwendungsfaelle
- Zentrale Zugriffssteuerung — AD-Gruppen bestimmen die Wiki-Berechtigung; neue Mitarbeiter
erhalten Zugriff automatisch über ihre AD-Mitgliedschaft.
- Hybrid-SSO — Formular-Login gegen AD, optional echtes Windows-SSO über IIS Integrated
Windows Authentication (sso=1, REMOTE_USER) auf domänen-/Azure-AD-DS-gejointem Host.
- KRITIS/NIS2-konforme Rechtevergabe — Autorisierung bleibt nachvollziehbar in der
handgepflegten ACL; Identität kommt aus dem zentralen, gehärteten Verzeichnis.
Aktivierung
// conf/local.php $conf['authtype'] = 'wvdsentra'; $conf['plugin']['wvdsentra']['base_dn'] = 'DC=corp,DC=example,DC=org'; $conf['plugin']['wvdsentra']['domain_controllers'] = 'dc01.corp.example.org'; $conf['plugin']['wvdsentra']['use_ssl'] = 1; // LDAPS (empfohlen) $conf['plugin']['wvdsentra']['account_suffix'] = '@corp.example.org'; $conf['plugin']['wvdsentra']['local_fallback_users'] = 'zpetrusic,wvdsverify'; // Break-Glass-Admins // Optional echtes Windows-SSO (domaenen-gejointer IIS-Host): // $conf['plugin']['wvdsentra']['sso'] = 1;
Die Gruppen-Abbildung wird nicht hier, sondern in der Admin-UI gepflegt (Ablage
conf/wvdsentra.json).
Gruppen-Mapping
Die Abbildung bildet rohe IdP-Gruppennamen (case-insensitiv) auf DokuWiki-Gruppen ab.
| Modus | Verhalten |
|---|---|
| Whitelist an | Nur explizit gemappte Gruppen werden übernommen (Rauschen wird verworfen) |
| Whitelist aus | Nicht gemappte Gruppen werden unter ihrem normalisierten Rohnamen übernommen |
- Die Standardgruppe (Default:
user) wird immer ergänzt, sodass jeder authentifizierte
Nutzer mindestens die Basis-Leserolle erhält.
- GUID-Schlüssel (reine Entra-Cloud-Gruppen, Phase 2) werden wie normale Schlüssel behandelt.
Admin-UI
Aufruf: do=admin&page=wvdsentra (nur Superuser). Vier Panels:
| Panel | Zweck |
|---|---|
| Übersicht | Status-Dashboard: Verbindung (On-Demand-Test), Modus, Mapping-Abdeckung, Break-Glass-Admins, Lockout-Guard |
| Gruppen-Mapping | Editor IdP-Gruppe → DokuWiki-Gruppe, Whitelist-Schalter, Standardgruppe, Live-Validierung, CSRF-gesichertes Speichern |
| Login-Simulator | Read-only Kette roh → Mapping → ACL-Wirkung für einen Benutzer; verändert keine Session |
| Sicherheit | Break-Glass-Konten, Transport-Härtung (LDAPS), Recovery-Anleitung |
Login-Simulator
Der Simulator ist das zentrale Werkzeug, um eine Abbildung vor dem Scharfschalten zu prüfen:
Er zeigt für einen Testbenutzer die rohen IdP-Gruppen, die daraus abgeleiteten DokuWiki-Gruppen und
die resultierende ACL-Wirkung (NONE/READ/EDIT/UPLOAD/ADMIN) an repräsentativen Namespaces — gegen
die derzeit aktive acl.auth.php, ohne die Session zu verändern.
Sicherheit
- Aussperr-Schutz — Break-Glass-Fallback plus Lockout-Guard (warnt, wenn keine Regel auf eine
Superuser-Gruppe mappt). Recovery: authtype temporär auf authplain.
- Transport — LDAPS/StartTLS erzwingen; Service-Bind-Passwort nur in
local.php/Vault,
nie im Output (CWE-319).
- CSRF — jeder Schreibpfad prüft
checkSecurityToken()(CWE-352). - XSS — alle IdP-/Nutzer-Werte via
hsc()bzw. clientseitigem Escaping (CWE-79). - Least Privilege — Admin-UI und AJAX-Endpunkte sind superuser-only (
auth_isadmin()).
Design-System-Tokens
Die Admin-UI ist unter .wk-entra gescopet und färbt sich über den WvdS-Styles-Contract ein.
Jeder –we-*-Token konsumiert einen Contract-Token mit Fluent-getöntem Literal als Fallback,
sodass die UI auch im Stock-dokuwiki-Template professionell aussieht. Vollständige Tabelle:
siehe lib/plugins/wvdsentra/README.md und Styles-Contract (--wk-*).
Ausbaustufen
| Phase | Inhalt | Status |
|---|---|---|
| Phase 1 | LDAP-Front + Gruppen-Remapping + Break-Glass + Admin-UI + Login-Simulator | Umgesetzt |
| Phase 2 | OIDC-Browser-SSO gegen Entra (Auth-Code+PKCE, App-Roles/Graph-Overage) über trustExternal(), nutzt denselben GroupMapper | Geplant (Spike) |
| Phase 3 | Provisioning-Mirror (Graph /users → SQLite), nur falls Offline-User-Listing nötig | Optional |
Voraussetzungen
- PHP-
ldap-Erweiterung (im IIS-PHP geprüft: vorhanden inC:\PHP\8.3). - Erreichbarer LDAP(S)-Endpunkt zu On-Prem AD oder Azure AD DS.
- Phase 2 (OIDC) zusätzlich: stabile HTTPS-Redirect-URI und eine JWT-Bibliothek.
Versionshinweise
| Version | Datum | Aenderungen |
|---|---|---|
| 1.0.0 (Phase 1) | 2026-07-05 | Erstveröffentlichung: LDAP-Front, Gruppen-Remapping, Break-Glass-Fallback, Admin-UI mit Login-Simulator |
Siehe auch
- wkacmenu — ACL-aware Akkordeon-Menü, filtert nach Lesbarkeit
- Styles-Contract (--wk-*) — Verbindliche
–wk-*-Design-Tokens
Technische Referenz
Klasse: auth_plugin_wvdsentra
Datei: lib/plugins/wvdsentra/auth.php (extends auth_plugin_authad)
| Methode | Beschreibung |
|---|---|
getUserData() | Holt authad-Info und bildet die rohen Gruppen über den GroupMapper auf DokuWiki-Gruppen ab |
checkPass() | Break-Glass-Logins gegen authplain, sonst AD-Bind der Elternklasse |
isCaseSensitive() | Gibt false zurück (AD-Benutzernamen sind case-insensitiv) |
simulateMapping() | Read-only Roh→Mapping-Diagnose für den Login-Simulator |
testConnection() | On-Demand-LDAP-Verbindungstest für die Admin-UI |
Klasse: GroupMapper
Datei: lib/plugins/wvdsentra/GroupMapper.php
| Methode | Beschreibung |
|---|---|
map($rawGroups) | Bildet rohe IdP-Gruppen auf DokuWiki-Gruppen ab (Whitelist, Default, Dedup) |
explain($rawGroups) | Diagnose (getroffen/verworfen/durchgereicht) für den Simulator |
Klasse: MappingStore
Datei: lib/plugins/wvdsentra/MappingStore.php
| Methode | Beschreibung |
|---|---|
load() | Lädt/validiert die Abbildung aus conf/wvdsentra.json (Defaults bei Fehlen/Korruption) |
save($data) | Atomarer Write mit .bak-Backup |
mapper() | Erzeugt einen einsatzbereiten GroupMapper aus dem gespeicherten Zustand |
<wk:audit stack=„doku“ title=„wvdsentra Plugin“>
<wk:include ref="code:qualitaet" critical="true">[x][x][x][x]</wk:include> <wk:include ref="stacks:dokuwiki-php">[x][x][x][x][x]</wk:include> <wk:include ref="sicherheit:kritis" critical="true">[x][x][x][x][x]</wk:include>
</wk:audit>
DISCUSSION