diff --git a/resources/views/livewire/help/content/de/security.blade.php b/resources/views/livewire/help/content/de/security.blade.php new file mode 100644 index 0000000..47c4121 --- /dev/null +++ b/resources/views/livewire/help/content/de/security.blade.php @@ -0,0 +1,33 @@ +@php + $h = 'font-display text-base font-semibold text-ink'; + $p = 'text-sm leading-relaxed text-ink-2'; + $li = 'text-sm leading-relaxed text-ink-2'; + $code = 'rounded bg-inset px-1.5 py-0.5 font-mono text-[12px] text-accent-text'; +@endphp + +
+

Zwei-Faktor-Authentifizierung

+

2FA ist optional, aber empfohlen. Du kannst unter Einstellungen → Sicherheit einrichten:

+ +
+ +
+

Wichtig: Zugangswege & welcher Faktor wo funktioniert

+

Ein Security-Key (YubiKey) funktioniert nur über die HTTPS-Domain — WebAuthn braucht einen sicheren Kontext und die Domain als Kennung (rpId). Über die Domain wird die Security-Key-Anmeldung angeboten und funktioniert.

+

Über den Bare-IP-/HTTP-Recovery-Weg (http://<Server-IP>) lässt sich nicht per Security-Key anmelden. Dort musst du einen Backup-Code verwenden.

+

TOTP funktioniert überall — auch über Bare-IP/HTTP. Wer TOTP nutzt, braucht für den Bare-IP-Weg keinen Backup-Code.

+ +
+ +
+

Passwort-Manager-Erweiterungen (Bitwarden, Kaspersky …)

+

Browser-Erweiterungen können die Security-Key-Registrierung abfangen und stattdessen „Passkey speichern" anbieten. Clusev fordert korrekt einen Hardware-Schlüssel an (cross-platform, nicht-auffindbar, mit dem Hinweis security-key), aber eine Webseite kann Erweiterungen nicht abschalten.

+

Lösung: in der Erweiterung die Passkey-Übernahme für diese Seite deaktivieren (z. B. Bitwarden → „Nach Passkeys fragen" aus), oder den Schlüssel in einem Browser/Fenster ohne diese Erweiterung registrieren (z. B. ein privates Fenster). Der Login mit dem Schlüssel funktioniert danach auch mit aktiver Erweiterung.

+
diff --git a/resources/views/livewire/help/content/en/security.blade.php b/resources/views/livewire/help/content/en/security.blade.php new file mode 100644 index 0000000..fba0eab --- /dev/null +++ b/resources/views/livewire/help/content/en/security.blade.php @@ -0,0 +1,33 @@ +@php + $h = 'font-display text-base font-semibold text-ink'; + $p = 'text-sm leading-relaxed text-ink-2'; + $li = 'text-sm leading-relaxed text-ink-2'; + $code = 'rounded bg-inset px-1.5 py-0.5 font-mono text-[12px] text-accent-text'; +@endphp + +
+

Two-factor authentication

+

2FA is optional but recommended. Under Settings → Security you can set up:

+ +
+ +
+

Important: access paths & which factor works where

+

A security key (YubiKey) only works over the HTTPS domain — WebAuthn needs a secure context and the domain as its identifier (rpId). Over the domain, security-key sign-in is offered and works.

+

Over the bare-IP / HTTP recovery path (http://<server-ip>) you cannot sign in with a security key. There you must use a backup code (Backup-Code).

+

TOTP works everywhere — including bare-IP/HTTP. If you use TOTP you do not need a backup code for the bare-IP path.

+ +
+ +
+

Password-manager extensions (Bitwarden, Kaspersky …)

+

Browser extensions can intercept security-key registration and offer to "save a passkey" instead. Clusev correctly requests a hardware key (cross-platform, non-resident, with the security-key hint), but a website cannot disable extensions.

+

Fix: turn off the extension's passkey handling for this site (e.g. Bitwarden → "Ask to save and use passkeys" off), or register the key in a browser/window without that extension (e.g. a private window). Signing in with the key works afterwards even with the extension active.

+
diff --git a/tests/Feature/HelpPageTest.php b/tests/Feature/HelpPageTest.php index d2edd92..9c06098 100644 --- a/tests/Feature/HelpPageTest.php +++ b/tests/Feature/HelpPageTest.php @@ -46,4 +46,13 @@ class HelpPageTest extends TestCase ->assertSee('TRUSTED_PROXY_CIDR') ->assertDontSee('Zoraxy'); // generic — no product names } + + public function test_security_topic_explains_the_2fa_access_paths(): void + { + $this->actAsAdmin(); + Livewire::test(Index::class) + ->set('topic', 'security') + ->assertSee('Backup-Code') + ->assertSee('TOTP'); + } }