chore(release): v0.6.0

WebAuthn/YubiKey as an optional login 2nd factor (web-auth/webauthn-lib), gated
on domain+HTTPS. TOTP + backup codes stay the required 2FA. Register/use/remove
keys in Settings + at the challenge; 2FA reset (UI + CLI) clears keys. Real
YubiKey end-to-end is browser-verified on a domain host. See CHANGELOG.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat/v1-foundation v0.6.0
boban 2026-06-14 18:50:07 +02:00
parent 2b04a18023
commit 5ae0b7d135
3 changed files with 31 additions and 1 deletions

View File

@ -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

View File

@ -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',

View File

@ -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