Gesamtprojekt: Protokoll-Nachtrag 13 (Merge #121/#122/#123)
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (push) Canceled after 0s
Archive-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
Archive-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Mail-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
patrickandClaude Sonnet 5 committed 2026-09-22 11:41:55 +02:00
1 parent 5acb6e5e50
commit 44ba59ac49
1 file changed
+41
+41
View File
@@ -249,3 +249,44 @@ Merge in dieser Reihenfolge, beide `git merge --no-ff`, keine Konflikte (untersc
**QA und Entscheidungen:** Keine inhaltliche Entscheidung bei diesem Merge nötig (beide PRs additiv, unterschiedliche Bereiche). 0 Fix-Iterationen.
**Offen (unverändert):** Browserlauf für UX-10/`pdf-viewer` im Token-Modus weiterhin ohne Chrome auf 204. `npm audit`-Funde (vitest/vite/esbuild-Kette) in 6 Apps sind Bestand aus #117, kein neues Ticket in diesem Schritt.
## 13. Nachtrag: #121 (QA-15 Phase 2c: AUD-08/IAM-23/API-20), #122 (OPS-08/09/10 Härtungsbündel), #123 (API-21 Architekturtest) (Stand 2026-09-22)
Merge in dieser Reihenfolge, alle `git merge --no-ff`, textuell konfliktfrei bei #121 und #123; #122 löste automatisch zwei Merges (`cmd/account-api/main.go`, `cmd/auditlog-devserver/main.go`), ohne verbleibende Konfliktmarker.
- **#121 (AUD-08/F-09):** Audit-Export-Token wandert von der URL in den Header `X-Service-Token`, CORS auf konfigurierte Ursprünge begrenzt, `web/audit-log` lädt jetzt per Header-authentifiziertem Abruf mit Blob statt `window.open`.
- **#121 (IAM-23/F-10):** Eigener Sitzungs-Signaturschlüssel (Ed25519, `migrations/tenant/0010_session_signing_keys`), getrennt vom Modul-Schlüssel; `rbac-admin-api`/`notifyprefs-api` prüfen nur noch über JWKS.
- **#121 (API-20/F-14):** Zentrale `apierror`-Normalisierung in Core und Archive (14/15 bzw. 5/5 Dienste über `httpharden` verdrahtet); 5xx-Antworten bekommen generische Meldung plus Korrelations-ID.
- **#122 (F-22):** Webhook-SSRF-Schutz (`internal/webhook/targetpolicy.go`) und verschlüsseltes Signatur-Geheimnis (`migrations/0013_webhook_secret_encryption`).
- **#122 (F-25):** `moduletrust.RewrapAll` für Schlüssel-Neuverpackung bei Wechsel des Verschlüsselungsschlüssels.
- **#122 (F-24):** 8 Dienste von `0.0.0.0` auf `127.0.0.1` korrigiert.
- **#122 (OPS-09):** Core/Mail/Archive auf go1.25.0/toolchain go1.25.13, `pgx` v5.9.2, `x/crypto` v0.54.0, `x/text` v0.41.0.
- **#122 (OPS-08):** 18 von 40 reinen Netzwerkdiensten systemd-gehärtet (`scripts/check-systemd-hardening.sh`).
- **#123 (API-21):** AST-Architekturtest (`internal/archtest`, `archive/internal/archtest`) gegen Fehlertext-Lecks und rohes `ListenAndServe`; ein echter, vom Sweep in PR #120 übersehener Fund (`internal/statuspage/statuspage.go`) dabei behoben.
**Merge-Fix 1 (Produktivcode):** `internal/moduletrust/pgstore_session.go` (`pgSessionKeyTx`, aus #121) implementierte die von #122 (F-25) neu eingeführte `KeyTx`-Methode `UpdateCiphertext` nicht — kein Textkonflikt (unterschiedliche Dateien), aber ein Compile-Fehler, da beide PRs unabhängig voneinander dasselbe Interface aus verschiedenen Richtungen erweiterten. `UpdateCiphertext` für `pgSessionKeyTx` analog zu `pgKeyTx` ergänzt (Commit `95f60ed`).
**Merge-Fix 2 (Testskript):** `scripts/e2e-module-keys.sh` (aus #121 mit `NEXARCH_ACCOUNT_SESSION_KEYS_EPHEMERAL=true` versehen, Kommentar „hält den Testaufbau unverändert") schlug real fehl: das Skript startet den Kontodienst während des Laufs neu und verwendet danach eine vor dem Neustart erzeugte Sitzung weiter (`mint 8099` mit dem alten Cookie gegen den neuen Prozess) — mit ephemeren Sitzungsschlüsseln wird genau diese Sitzung beim Neustart ungültig (dokumentiertes Verhalten in `cmd/account-api/sessionkeys.go`, von PR #121 selbst nicht bis zu dieser Stelle im Skript durchdacht). Auf persistente Sitzungsschlüssel mit festem `NEXARCH_ACCOUNT_SESSION_KEY_ENCRYPTION_KEY` umgestellt (analog zu `e2e-core-dms.sh`/`gesamt-token-smoke.sh`, die das bereits richtig machten). Danach 8 von 8 bestanden.
**Prüfungen auf 204** (Wegwerf-Cluster 17/coredev, `archivdms` unberührt):
| Prüfung | Ergebnis |
|---|---|
| Core `build`, `vet`, `gofmt` | sauber (14 Bestandsdateien unformatiert, keine der drei PRs betroffen) |
| `e2e-core-dms.sh` | 10 von 10 |
| `e2e-module-keys.sh` | 8 von 8 (nach Merge-Fix 2) |
| `gesamt-token-smoke.sh` (Rollen, Neustart-Persistenz IAM-23, Modulschaltung RBAC-10, Policy-Ausfall/Wiederanlauf, UX-10 gegen echte Dienste) | 60 von 60, Ressourcen 457→509 MB, keine OOM, Rückbau identisch |
| `migrations-fresh-check.sh` | Core Registry 31, Core Mandant 20, DMS 32, Archive 15, Mail 12; 89 Tabellen ohne Kollision |
| `check-port-defaults.sh`, `check-route-prefixes.sh` | ok |
| `web/audit-log` (einziges von diesen 3 PRs geändertes Web-Verzeichnis) `tsc --noEmit`, `next build` | sauber |
| übrige 12 Web-Apps | unverändert gegenüber dem in Nachtrag 12 verifizierten Stand (14/14 sauber), nicht erneut gebaut |
**QA und Entscheidungen:** 2 Fix-Iterationen (Merge-Fix 1 Produktivcode, Merge-Fix 2 Testskript), beide sachlich zwingend, keine Alternative erwogen.
**Sicherheitsstatus (QA-15), aktualisiert:** F-01 bis F-05, F-07, F-08, F-09, F-10, F-11, F-12, F-13 (teilweise), F-14, F-16, F-21 (bewusst zurückgestellt, siehe #122-Protokoll), F-22, F-24, F-25 sind umgesetzt. Offen: F-06 bereits vorher umgesetzt (siehe Nachtrag 12, hier zur Klarheit erwähnt), F-15 (DB-Rollen-Trennung) und die restlichen 22 Backup-/Restore-CLIs (OPS-08 teilweise), F-17 (Next.js — teilweise mit #117 erledigt, `npm audit`-Funde offen), F-18/F-19/F-20 (aus #122/OPS-09 bzw. latente Mail-Befunde) — Einzelstatus siehe `docs/QA-15-PHASE2D-PRUEFPROTOKOLL.md`.
**Offen (unverändert oder neu):**
- Auf 131 laufen `nexarch-licadmin-devserver`/`nexarch-tenantadmin-devserver` produktiv; mit F-02/F-03 und jetzt zusätzlich den Lauschadressen-Korrekturen aus F-24 (`dms-app:8600` u.a. auf `127.0.0.1`) ändert sich das Startverhalten — vor einem Rollout auf 131 zu berücksichtigen, hier nicht ausgeführt.
- Sitzungsschlüssel-Verschlüsselung (IAM-23) braucht beim Rollout `NEXARCH_ACCOUNT_SESSION_KEY_ENCRYPTION_KEY` bzw. `NEXARCH_ACCOUNT_SESSION_KEYS_EPHEMERAL=true` — ohne beides startet `account-api` nicht mehr.
- Browserlauf (Tastatur, axe) im Token-Modus weiterhin ohne Chrome auf 204, 131 nicht freigegeben.
- 22 Backup-/Restore-CLIs ohne systemd-Härtung, F-15 (DB-Rollen-Trennung), Sandbox für `soffice`/`pdftoppm`/`tesseract` — reale Betriebsänderungen mit Freigabebedarf für 131.