diff --git a/ops/restore-tests/authelia-plan.md b/ops/restore-tests/authelia-plan.md index 671616a..8dfec0c 100644 --- a/ops/restore-tests/authelia-plan.md +++ b/ops/restore-tests/authelia-plan.md @@ -7,7 +7,7 @@ Nachweisen, dass die Authelia-Konfiguration aus dem produktiven Borg-Archiv in e Bewusst **nicht** Teil dieses Tests: - Restore mit produktiven Authelia-Secrets. Der Test nutzt ausschliesslich Wegwerf-Werte fuer `AUTHELIA_SESSION_SECRET`, `AUTHELIA_STORAGE_ENCRYPTION_KEY` und `AUTHELIA_STORAGE_POSTGRES_PASSWORD`. SMTP- und Legacy-JWT-Env-Werte werden bewusst nicht gesetzt, damit Authelia keinen `notifier.smtp`-Block oder deprecated `jwt_secret` aus Env erzeugt. -- SMTP-Realanruf an GMX. Notifier wird in der Test-Konfiguration auf Filesystem umgebogen. +- SMTP-Realanruf an GMX. Die minimale Test-Konfiguration setzt nur den Filesystem-Notifier. - Forward-Auth gegen Traefik. Test laeuft nur auf `127.0.0.1:19091`, keine Traefik-Route. - WebAuthn-/Duo-/OIDC-Identity-Provider-Endpunkte. Smoke prueft `/api/health`. @@ -24,7 +24,7 @@ Bewusst **nicht** Teil dieses Tests: - Restore-Lab: `/mnt/user/backups/restore-lab/authelia` - Testdatenpfade: - `/mnt/user/backups/restore-lab/authelia/config` (restaurierte Originalkonfiguration + `configuration.yml.original`) - - `/mnt/user/backups/restore-lab/authelia/test-config` (Runtime-Mount mit sanitizter `configuration.yml`) + - `/mnt/user/backups/restore-lab/authelia/test-config` (Runtime-Mount mit minimaler Test-`configuration.yml`) - `/mnt/user/backups/restore-lab/authelia/postgres` (Test-Postgres-Datadir) - `/mnt/user/backups/restore-lab/authelia/dumps/latest/postgresql17-authelia.dump` (falls extrahiert) - `/mnt/user/backups/restore-lab/authelia/test-config/notifier/notifications.txt` (Filesystem-Notifier-Ausgabe) @@ -38,8 +38,8 @@ Bewusst **nicht** Teil dieses Tests: - produktive Pfade `/mnt/user/appdata/authelia/*` werden **nicht** beschrieben - produktive Secret-Dateien `/mnt/user/appdata/secrets/authelia_*.txt` werden **nicht** gemountet -- produktive shared PostgreSQL 18 wird **nicht** angesprochen (`test-config/configuration.yml` zwingt `storage` auf Test-Postgres) -- echter SMTP-Versand wird **nicht** ausgeloest (`test-config/configuration.yml` zwingt `notifier` auf Filesystem) +- produktive shared PostgreSQL 18 wird **nicht** angesprochen (`test-config/configuration.yml` definiert nur Test-Postgres) +- echter SMTP-Versand wird **nicht** ausgeloest (`test-config/configuration.yml` definiert nur Filesystem-Notifier) - produktive Domain `auth.kaleschke.info` wird **nicht** uebernommen - Testcontainer publishen nur auf `127.0.0.1`, keine LAN-/Tailscale-Bindung - Borg-Passphrase wird aus `/mnt/user/appdata/secrets/borg_repo_passphrase.txt` gelesen und nirgendwo geloggt @@ -49,7 +49,7 @@ Bewusst **nicht** Teil dieses Tests: 1. Restore-Lab-Pfade leer anlegen 2. `local/appdata/authelia/config` aus dem aktuellsten Borg-Archiv extrahieren 3. optional `local/borg-dumps/latest/postgresql17-authelia.dump` extrahieren; wenn nicht im Archiv vorhanden, weiter ohne DB-Restore -4. `test-config/configuration.yml` aus der restaurierten `configuration.yml` erzeugen: produktive `storage`/`notifier`/`session`/JWT-Bloecke entfernen und Test-Werte anhaengen +4. minimale `test-config/configuration.yml` erzeugen; restaurierte Begleitdateien wie `users_database.yml` bleiben im Runtime-Mount, produktive externe Abhaengigkeiten werden nicht uebernommen 5. Test-Postgres mit `ops/restore-tests/authelia-compose.test.yml` hochfahren 6. optional Dump per `pg_restore -Fc --clean --if-exists --no-owner --no-privileges` einspielen (mit transientem Retry wie im Immich-/Paperless-Test) 7. `authelia config validate` gegen `test-config/configuration.yml` laufen lassen @@ -76,7 +76,7 @@ Optional spaeter: | Risiko | Beschreibung | Mitigation | |---|---|---| -| Sanitizing-Konflikt mit Originalkonfiguration | `configuration.yml` definiert neue produktive Sections, die ersetzt werden muessen | bei `config validate`-Fehler `configuration.yml.original` zum Vergleich pruefen; Strip-Liste oder Test-Block im Skript erweitern | +| Testkonfig-Schema-Drift | Authelia erwartet nach Upgrade andere Keys in der Minimal-Konfig | bei `config validate`-Fehler Test-Block im Skript anpassen | | SMTP-Startup-Check blockiert Start | Wenn Authelia trotz `disable_startup_check` SMTP probiert | Container-Logs lesen, ggf. Notifier-Block weiter haerten | | Postgres-Schema-Drift nach Major-Update | Authelia migriert Schema beim Start; Dump aus 17er-Cluster kann unter 18er andere Indexe brauchen | Smoke ist DB-Schema-tolerant; bei Validierung Logs auf `migration` pruefen | | identity_validation Schema-Drift | Aelteres/neueres Authelia-Schema erwartet andere Keys | Validate-Config Output lesen, ggf. Test-Block anpassen | diff --git a/ops/restore-tests/authelia-restore-test.sh b/ops/restore-tests/authelia-restore-test.sh index 4124443..0ae6acf 100644 --- a/ops/restore-tests/authelia-restore-test.sh +++ b/ops/restore-tests/authelia-restore-test.sh @@ -5,11 +5,11 @@ set -euo pipefail # # Nicht-destruktiver Restore-Smoke-Test fuer Authelia. # - extrahiert die Authelia-Config aus dem produktiven Borg-Archiv -# - patcht in einer Restore-Lab-Kopie der configuration.yml die -# externen Abhaengigkeiten (storage = lokales Test-Postgres, -# notifier = Filesystem-Notifier, identity_validation auf Test-Werte) +# - erzeugt eine minimale Test-Konfiguration, die restaurierte Begleitdateien +# wie users_database.yml nutzt, aber produktive externe Abhaengigkeiten +# durch Test-Backends ersetzt # - importiert optional den shared-Postgres-Dump fuer Authelia -# - validiert die gepatchte Konfiguration mit `authelia config validate` +# - validiert die Test-Konfiguration mit `authelia config validate` # - startet einen isolierten Authelia-Container ohne Traefik # - prueft den HTTP-Health-Endpunkt # - bereinigt anschliessend @@ -112,10 +112,10 @@ if borg_extract "/restore/authelia-extract" "local/borg-dumps/latest/postgresql1 fi fi -# Stufe 3: configuration.yml im Restore-Lab gezielt fuer den Test sanitizen. -# Wir entfernen produktive Top-Level-Bloecke, die im Test andere Backends -# brauchen, und haengen danach Test-Definitionen an. So verlassen wir uns -# nicht darauf, dass ein Overlay alte Map-Keys wie notifier.smtp loescht. +# Stufe 3: Minimale Test-Konfiguration erzeugen. +# Die restaurierte Originalkonfig bleibt als Diagnosematerial erhalten. Der +# Smoke nutzt bewusst eine neu geschriebene Test-Config, damit keine produktiven +# Blocks (SMTP, echtes Postgres, Session/JWT-Altkeys) hineinmergen koennen. ORIGINAL_CONFIG_FILE="$RESTORED_CONFIG_DIR/configuration.yml" TEST_CONFIG_FILE="$TEST_CONFIG_DIR/configuration.yml" if [ ! -f "$ORIGINAL_CONFIG_FILE" ]; then @@ -124,33 +124,52 @@ if [ ! -f "$ORIGINAL_CONFIG_FILE" ]; then fi # Kopiere alle Begleitdateien (z. B. users_database.yml) in einen separaten -# Runtime-Mount. Die produktive configuration.yml selbst wird dort durch die -# sanitizte Testkonfiguration ersetzt, damit Authelia keine Default-Config mit -# produktivem notifier.smtp nachladen kann. +# Runtime-Mount. configuration.yml wird danach vollstaendig neu geschrieben. cp -a "$RESTORED_CONFIG_DIR/." "$TEST_CONFIG_DIR/" cp "$ORIGINAL_CONFIG_FILE" "$RESTORED_CONFIG_DIR/configuration.yml.original" -# Entferne produktive Blocks, die der Restore-Smoke bewusst ersetzt. -awk ' - /^[A-Za-z_][A-Za-z0-9_]*:/ { - key = $0 - sub(/:.*/, "", key) - skip = (key == "storage" || key == "notifier" || key == "session" || key == "identity_validation" || key == "jwt_secret") - } - !skip { print } -' "$ORIGINAL_CONFIG_FILE" > "$TEST_CONFIG_FILE" +cat > "$TEST_CONFIG_FILE" <<'YAML' +--- +# Minimal-Konfiguration nur fuer den Restore-Smoke. -cat >> "$TEST_CONFIG_FILE" <<'YAML' +theme: dark -# Restore-Smoke-Test-Backends. Produktive externe Abhaengigkeiten sind oben -# entfernt und werden hier mit isolierten Test-Werten ersetzt. +server: + address: tcp://0.0.0.0:9091 + +log: + level: info + +authentication_backend: + file: + path: /config/users_database.yml + password: + algorithm: argon2id + iterations: 3 + key_length: 32 + salt_length: 16 + memory: 65536 + parallelism: 4 + +access_control: + default_policy: bypass + +regulation: + max_retries: 3 + find_time: 2m + ban_time: 5m + +totp: + issuer: kaleschke.info + period: 30 + skew: 1 storage: postgres: address: tcp://restoretest-authelia-postgres:5432 database: authelia username: authelia - # Passwort kommt ueber AUTHELIA_STORAGE_POSTGRES_PASSWORD ENV + # Passwort kommt ueber AUTHELIA_STORAGE_POSTGRES_PASSWORD ENV. notifier: disable_startup_check: true @@ -207,7 +226,7 @@ if [ "$dump_available" -eq 1 ]; then dump_status="restored" fi -# Stufe 6: config validate im Container-Kontext, gegen sanitizte Test-Config +# Stufe 6: config validate im Container-Kontext, gegen minimale Test-Config validate_status="ok" if ! docker run --rm \ -e AUTHELIA_SESSION_SECRET=restoretest-authelia-session-secret-placeholder-32 \ diff --git a/ops/restore-tests/authelia-runbook.md b/ops/restore-tests/authelia-runbook.md index ddbec12..bfe8e68 100644 --- a/ops/restore-tests/authelia-runbook.md +++ b/ops/restore-tests/authelia-runbook.md @@ -56,10 +56,10 @@ Minimal erwartet im Report: | Symptom | Ursache | Massnahme | |---|---|---| -| `config validate` failt mit `notifier` Block | Produktive Notifier-Map wurde nicht sauber aus der Testkonfig entfernt | Originalkonfig pruefen unter `restore-lab/authelia/config/configuration.yml.original`; Strip-Liste oder Test-Block im Skript anpassen | +| `config validate` failt mit `notifier` Block | Testkonfig enthaelt mehr als einen Notifier | `test-config/configuration.yml` pruefen; Minimal-Test-Block im Skript anpassen | | `config validate` failt mit `session.domain` | aelteres/neueres Schema | Test-`session:`-Block an reales Authelia-Schema anpassen | | HTTP-Timeout 120 s | Authelia haengt in Postgres-Schema-Migration | `docker logs --tail 200 restoretest-authelia` lesen, ggf. Wartezeit erhoehen | -| SMTP-Connect im Log | Produktiver Notifier-Block wurde nicht sauber entfernt | `test-config/configuration.yml` auf `smtp:` pruefen und Strip-Liste haerten | +| SMTP-Connect im Log | Testkonfig oder Env erzeugt unerwartet SMTP | `test-config/configuration.yml` und `AUTHELIA_*SMTP*` Env pruefen | | `pg_restore` failt mit Schema-Drift | Dump aus 17er-Cluster, 18er Image braucht andere Initialisierung | Schritt als optional dokumentiert; Smoke ohne Dump akzeptieren und Issue nachverfolgen | ## Cleanup