diff --git a/betrieb/authentik-oidc.md b/betrieb/authentik-oidc.md new file mode 100644 index 0000000..8aa012b --- /dev/null +++ b/betrieb/authentik-oidc.md @@ -0,0 +1,105 @@ +--- +title: Authentik OIDC +description: Authentik als Identity Provider für Matrix +published: true +date: 2026-08-13T18:04:18.450Z +tags: +editor: markdown +dateCreated: 2026-08-13T18:04:18.450Z +--- + +**Status**: ✅ Deployed (Stage 1 + Stage 2 + Enrollment/Recovery/2FA) +**Domain**: `auth.axion1337.chat` + +## Überblick + +Authentik = OIDC Provider für MAS → Zentrales Login + Einladungs-basierte Registrierung. + +## Stage 1: Authentik Deployment + +**Dateien** (in `apps/authentik/`): +- `namespace.yaml`, `helm-repo.yaml`, `authentik-secret.yaml` (SOPS) +- `authentik.yaml` (HelmRelease v2026.x + embedded Postgres) +- `certificate.yaml`, `ingress.yaml` + +**Flux Kustomization**: `clusters/matrix/flux-system/authentik-sync.yaml` + +## Deployment-Schritte + +1. **DNS A-Record**: `auth.axion1337.chat → 49.13.132.245` +2. **Pods hochfahren**: `kubectl get pods -n authentik -w` +3. **Authentik UI**: `https://auth.axion1337.chat/if/flow/initial-setup/` → Admin-Passwort setzen +4. **OIDC Provider**: Admin UI → OIDC Provider erstellen +5. **Application**: Slug `matrix` (wichtig für Issuer URL!) +6. **Redirect URIs**: + - `https://account.axion1337.chat/upstream/callback/01KQDJTR1ZVTG8JQ220F5BNBFZ` + - Post-logout: `https://axion1337.chat` +7. **Client ID + Secret kopieren** + +## Stage 2: MAS Integration + +1. Decrypt: `sops --decrypt --in-place apps/production/custom-configs/mas-secret.yaml` +2. `upstream_oauth2_config` + `passwords-config` Blöcke hinzufügen +3. Encrypt: `sops --encrypt --in-place ...` +4. Commit & Push +5. **WICHTIG**: `passwords: enabled: false` erst nach OIDC-Test! + +## Einladungs-Links + +Authentik Admin → Flows & Stages → Invitations → Create + +## Enrollment/Recovery/2FA Fix (2026-07-27) + +Der `matrix-invitation`-Flow hatte nur 2 von 5 nötigen Stages (kein Write/Password/Login, +beide vorhandenen Stages auf derselben `order`). Nutzer wurden nie in Synapse angelegt. +Behoben und als **Authentik Blueprint** (`apps/authentik/authentik-blueprints.yaml`) +deklarativ ins Repo übernommen, statt Klick-Anleitung: + +- `matrix-invitation`: Invite → Prompt → Write → Password → Login → Redirect (axion1337.chat) +- `matrix-invitation-prompt`: 16 fehlerhafte `validation_policies` entfernt (crashten mit `AnonymousUser`/`NoneType`-Fehlern) +- `matrix-recovery`: war komplett leer (0 Stages) — jetzt vollständig, verlinkt als "Passwort vergessen?" auf der echten Login-Seite (`default-authentication-flow`) +- `Brand.default_application` auf die `matrix`-Application gesetzt, damit `/` für eingeloggte User nicht mehr in der `/if/user/`-Sackgasse landet (die für `type=external` Matrix-Accounts gesperrt ist) + +**2FA/Passkey — freiwillig für Mitglieder, Pflicht für Admins** (Stand 2026-08-06): + +- **Mitglieder**: freiwillig. Die Standard-Stage `default-authentication-mfa-validation` + steht weiterhin auf `not_configured_action=skip`, der Login blockiert also nie. +- **Gruppe `authentik Admins`**: Pflicht. Eine zweite Stage `admin-mfa-validation` + (Ordnung 31, `not_configured_action=configure`) führt Admins ohne zweiten Faktor beim + Login durch die Einrichtung. Umgesetzt im Blueprint `admin-mfa-enforcement.yaml`, + Details im [Leitfaden 02](https://git.lab/axion1337.chat/axion1337.chat-gitops/-/blob/main/docs/deployment-guides/02-authentik-identity-provider.md) + (gitops#57). + +Selbst-Einrichtung über Direktlinks, da `/if/user/` für externe User gesperrt ist: +- Passkey: `https://auth.axion1337.chat/if/flow/default-authenticator-webauthn-setup/` +- TOTP: `https://auth.axion1337.chat/if/flow/default-authenticator-totp-setup/` +- Auffindbar für Nutzer über `axion1337.chat/docs/setup/security.html` + +**Issue #13 geschlossen (2026-07-29)**: ein direkter Link auf `account.axion1337.chat/account/` +(MAS) per Custom-Template-Override wurde verworfen — live geprüfte OIDC-Discovery zeigt, dass +MAS keine 2FA/Passkey-Deep-Link-Action unterstützt. Jetzt als Client-seitige Änderung +nachgehalten: [ThreadNet-Web#4](https://git.lab/axion1337.chat/ThreadNet-Web/-/issues/4). + +## OIDC Provider/Application als Code erfasst (2026-07-28, Issue #36) + +Die OAuth2-Provider- + Application-Verknüpfung ("Matrix Authentication Service" / Slug +`matrix`) aus Stage 1+2 oben war ursprünglich reines Klick-Ergebnis in der UI und existierte +nirgends als Code — anders als die Flow-Fixes oben. Ginge die Authentik-DB verloren, wäre +diese Verknüpfung (inkl. Client-Secret) nicht rekonstruierbar gewesen, ohne MAS neu zu +synchronisieren. Jetzt ebenfalls als Blueprint (`matrix-oidc-provider.yaml` in +`apps/authentik/authentik-blueprints.yaml`) erfasst: Client-ID, Redirect-URI, `sub_mode: +hashed_user_id`, Property-Mappings (openid/email/profile), Auth-/Invalidation-Flow, Signing-Key, +sowie die Application selbst. + +Der Client-Secret steht **nicht** im Blueprint (die ConfigMap ist nicht SOPS-verschlüsselt), +sondern wird per `!Env AUTHENTIK_MAS_OIDC_CLIENT_SECRET` gelesen — die Env-Var kommt aus einem +neuen Key `mas-oidc-client-secret` in der bestehenden SOPS-verschlüsselten +`authentik-credentials` Secret (`apps/authentik/authentik-secret.yaml`), verdrahtet über +`global.env` im `authentik.yaml` HelmRelease. Der eingetragene Wert ist der tatsächliche, +live genutzte Secret (keine Rotation) — verifiziert per direktem DB-Vergleich nach dem +Blueprint-Rollout: Client-ID, Secret-Länge, Redirect-URI, Property-Mappings und +Application-Verknüpfung 1:1 identisch zum Vorzustand, kein Duplikat erzeugt, MAS lief +durchgehend ohne Neustart/Fehler weiter. + +--- +**Weitere Details**: Siehe Kapitel 2 in diesem Projekt.