docs: § 7.6 um Passwort-Login (1FA) erweitern; Admin-Zugang ist jetzt 1FA

- Neuer Abschnitt 7.6.1 „Anmeldung mit Benutzername & Passwort (1FA, ohne 2FA)"
  (/login), Knopf auf der Zugangs-Seite, Konten aus dem Authelia-Datei-Backend.
- /admin-login als auf Admins beschränkte Variante (7.6.2).
- Recovery (ADMIN_API_KEY) -> 7.6.3, Härtung -> 7.6.4; Intro + TOC-Anchor angepasst.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-26 19:25:12 +02:00
commit 2ccfd7f6d6

View file

@ -44,7 +44,7 @@ funktioniert trotzdem, die Ausgabe ist dann unformatiert.
6. [Einstellungen und Konfiguration](#6-einstellungen-und-konfiguration)
**Administration**
7. [Nutzerverwaltung und Authentifizierung](#7-nutzerverwaltung-und-authentifizierung) · [7.5 Admin-Web-Panel](#75-admin-web-panel) · [7.6 Admin-Login & Recovery](#76-admin-zugang-ohne-persönlichen-link-selbstanmeldung--recovery)
7. [Nutzerverwaltung und Authentifizierung](#7-nutzerverwaltung-und-authentifizierung) · [7.5 Admin-Web-Panel](#75-admin-web-panel) · [7.6 Anmeldung & Admin-Zugang](#76-anmeldung--admin-zugang-link-passwort-recovery)
8. [Gedächtnis und Erinnerungen](#8-gedächtnis-und-erinnerungen)
9. [Resilienz, Fallbacks und Metriken](#9-resilienz-fallbacks-und-metriken)
10. [Notfall-Erkennung und Eskalation](#10-notfall-erkennung-und-eskalation)
@ -1872,34 +1872,49 @@ Protokolliert werden u. a. `config_set` / `config_reset` (Laufzeit-Einstellungen
> Sichtbar im Log-Tab nur im **Dienst-Betrieb** (Journal). Im Vordergrund-Betrieb
> (`make run`) erscheinen die Audit-Zeilen im Terminal.
### 7.6 Admin-Zugang ohne persönlichen Link (Selbstanmeldung & Recovery)
### 7.6 Anmeldung & Admin-Zugang (Link, Passwort, Recovery)
> 🔧 Admin
Die App-Oberfläche (`/`) ist **nur per persönlichem Zugangslink** (`?k=<token>` → Cookie
`va_token`) erreichbar — bewusst ohne SSO, damit Senioren keine Login-Maske sehen. Wer
seinen Link verliert, kommt zunächst nicht in die App. Als **Admin** bist Du dadurch
**nicht ausgesperrt**: Du hast einen Selbst-Login und zwei unabhängige Recovery-Wege.
Die App-Oberfläche (`/`) erkennt Dich an einem `va_token`-Cookie. Es gibt drei Wege hinein:
1. **Persönlicher Zugangslink** (`?k=<token>`) — der Standardweg für Senioren (keine
Login-Maske); ein gültiges Cookie loggt automatisch ein.
2. **Benutzername & Passwort (1FA, ohne 2FA)** — für Betreuer/Admins (§ 7.6.1).
3. **Recovery-Wege**, falls ein Admin ausgesperrt ist (§ 7.6.3 / 7.6.4).
#### 7.6.1 Selbstanmeldung mit dem Admin-Passwort (empfohlen)
Ohne gültiges Cookie zeigt `/` die Seite „Persönlicher Zugang nötig" mit einem Knopf
**„Mit Benutzername & Passwort anmelden"** (→ `/login`). Senioren nutzen weiter ihren Link;
`/` leitet bewusst **nicht** automatisch zur Login-Maske um (sonst säßen Senioren ohne
Authelia-Konto fest).
Rufe im Browser auf:
#### 7.6.1 Anmeldung mit Benutzername & Passwort (1FA, ohne 2FA)
Rufe auf (oder klicke den Knopf auf der Zugangs-Seite):
```
https://voice.jamulix.de/admin-login
https://voice.jamulix.de/login
```
Ablauf: Der Reverse-Proxy schickt Dich zu **Authelia** (`auth.jamulix.de`) → Du meldest
Dich mit Deinem **Admin-Passwort/2FA** an → das Gateway erkennt Dich als SSO-Admin
(`ADMIN_USERS`), setzt Dir ein frisches `va_token`-Cookie und leitet in die App (`/`).
**Kein Link nötig.** Bookmarke diese URL als „Admin-Login".
Ablauf: Der Reverse-Proxy schickt Dich zu **Authelia** (`auth.jamulix.de`) → Du gibst
**nur Benutzername + Passwort** ein (Zugriffsregel `voice.jamulix.de → one_factor`, also
**kein 2FA**) → das Gateway erkennt Dich am `Remote-User`, setzt ein frisches
`va_token`-Cookie und leitet in die App (`/`). Gilt für **Admins und normale
Authelia-Nutzer**; die Konten liegen im Authelia-Datei-Backend
(`/etc/authelia/users_database.yml`).
- Technisch dahinter steht der Endpunkt `GET /api/admin/login` (dieselbe Wirkung; die
hübsche URL `/admin-login` ist nur ein nginx-Alias darauf).
- **Jeder Aufruf rotiert Deinen Token** — alte persönliche Links *dieses Admin-Nutzers*
werden ungültig. Für eine Wiederherstellung korrekt und ein Sicherheitsplus.
- Endpunkt dahinter: `GET /api/login` (nginx-Location `/login`).
- **Jeder Login rotiert Dein Token** — ein zuvor gesetztes Cookie / ein alter Link
*dieses Nutzers* wird ungültig (ein Token pro Nutzer).
- Andere `*.jamulix.de`-Dienste bleiben bei **2FA**; nur `voice.jamulix.de` ist 1FA.
Sicherheits-Hinweis: 1FA für den Admin-Zugang ist schwächer als 2FA — bewusste Abwägung.
#### 7.6.2 Recovery per `ADMIN_API_KEY` (SSO-unabhängig)
#### 7.6.2 Admin-Selbstanmeldung (`/admin-login`)
`https://voice.jamulix.de/admin-login` ist die auf **Admins** (`ADMIN_USERS`) beschränkte
Variante von `/login` — gleicher Ablauf, aber Nicht-Admins bekommen 403. Praktisch als
Bookmark „Admin-Login". Endpunkt: `GET /api/admin/login` (nginx-Alias `/admin-login`).
#### 7.6.3 Recovery per `ADMIN_API_KEY` (SSO-unabhängig)
Funktioniert auch, wenn Authelia gerade nicht erreichbar ist — vom Server/localhost aus.
Den Key liest Du als root aus `/etc/voice-assistant/voice-assistant.env`.
@ -1923,7 +1938,7 @@ echo "https://voice.jamulix.de/?k=$TOKEN"
> geraten lassen (kein `?key=` in URLs verwenden, außer beim einmaligen Bootstrap über
> `GET /api/admin/request-headers?key=…`), und nach solchem Gebrauch rotieren.
#### 7.6.3 Härtung gegen Total-Aussperrung
#### 7.6.4 Härtung gegen Total-Aussperrung
Eine echte Vollsperre bräuchte: Link weg **und** Authelia-Konto weg **und**
`ADMIN_API_KEY` weg **und** kein SSH. Um auch das abzusichern: