diff --git a/CHANGELOG.md b/CHANGELOG.md index 41dfbdb..a99271f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,29 @@ getaggte Releases (Kanal `stable`, optional `beta`) — niemals Entwicklungs-Bui _Keine offenen Änderungen — der nächste Stand wird hier gesammelt und als `vX.Y.Z` getaggt._ +## [0.6.0] - 2026-06-14 + +### Hinzugefügt +- **WebAuthn / Security-Keys (YubiKey) als optionaler 2. Login-Faktor.** Per + `web-auth/webauthn-lib`. TOTP + Backup-Codes bleiben der erforderliche 2FA und die einzige + Wiederherstellung; ein Security-Key ist eine zusätzliche Login-Option. + - **Gated auf Domain + HTTPS:** Die rpId ist die aktive Domain — auf Bare-IP/HTTP ist die + Funktion ausgeblendet (mit Hinweis), da eine IP keine gültige rpId ist. + - **Einstellungen → Sicherheit:** Security-Keys hinzufügen (benannt), auflisten, entfernen + (mit Bestätigung). Beim Login-2FA-Schritt „Mit Security-Key anmelden" neben TOTP/Backup-Code. + - 2FA deaktivieren (UI **und** `clusev:reset-admin --disable-2fa`) entfernt jetzt auch + Security-Keys + Backup-Codes, damit ein Reset den zweiten Faktor vollständig zurücksetzt. + +### Sicherheit +- rpId strikt = aktive Domain (nie eine IP). Challenges serverseitig + einmalig. +- Signatur-Zähler-Prüfung mit Rollback-/Klon-Erkennung; Zähler 0 nur toleriert, wenn der + gespeicherte Zähler ebenfalls 0 ist (Plattform-Authenticator/Passkeys). +- Registrierung erfordert eine aktive 2FA-Anmeldung; Label wird vor der Browser-Ceremony + validiert (keine verwaisten Credentials). Alle Aktionen im Audit-Log. + +> Hinweis: Der echte End-to-End-Test (YubiKey registrieren + anmelden) ist nur unter einer Domain +> mit HTTPS möglich; die Ceremony-Logik ist auf Options-/Speicher-/Gating-Ebene getestet. + ## [0.5.0] - 2026-06-14 ### Hinzugefügt diff --git a/config/clusev.php b/config/clusev.php index f98b945..f209fe9 100644 --- a/config/clusev.php +++ b/config/clusev.php @@ -3,7 +3,7 @@ return [ // First tagged release is v0.1.0 (semantic, not -dev). The live build hash // is resolved from .git at runtime (see App\Livewire\Versions\Index). - 'version' => '0.5.0', + 'version' => '0.6.0', // Default user channel. Only 'stable' and 'beta' are ever offered to users. 'channel' => 'stable', diff --git a/docs/session-handoff.md b/docs/session-handoff.md index 1c9a63d..e77e5ce 100644 --- a/docs/session-handoff.md +++ b/docs/session-handoff.md @@ -25,6 +25,13 @@ original foundational decisions doc (do not overwrite it). - `v0.4.4` — stop iOS zoom-on-focus: one unlayered `@media (pointer: coarse)` rule in `app.css` forces 16px on `input`/`textarea`/`select` on touch devices (phone + tablet any size), desktop sizing unchanged. + - `v0.6.0` — **WebAuthn / YubiKey** as an optional login 2nd factor (`web-auth/webauthn-lib`), + gated on domain+HTTPS (rpId = active domain; hidden on bare-IP). TOTP + backup codes stay the + required 2FA. Register/list/remove keys in Settings → Security; use a key at the login + challenge. **DEFERRED MANUAL CHECK:** real YubiKey register + login is browser-verifiable only + on a domain+HTTPS host (the IP rpId is invalid here) — the ceremony code is unit-tested at the + option/storage/gating level + Codex-clean, but the end-to-end crypto is unverified until tested + on a domain. - `v0.5.0` — **account recovery** (spec/plan in `docs/superpowers/`): 2FA backup codes (encrypted, shown once + downloadable + regenerable, usable at the login challenge), forgot-password via 2FA/backup code (email-link path gated on a configured mailer), and a