From 45846699621b4d1ad1ab62034413849ec7ef239a Mon Sep 17 00:00:00 2001 From: Florian Wilde Date: Mon, 12 Oct 2026 10:00:43 +0200 Subject: [PATCH] feat(hosts): Host-Key und Bootstrap in der Oberflaeche (#009, #010) Auf der Hostseite: Host-Key abrufen, Fingerprint vergleichen und vertrauen oder ablehnen. Weicht ein Key vom vertrauten ab, erscheint eine deutliche Warnung, und Annehmen geht nur mit Haekchen und frischer Bestaetigung. Danach Bootstrap per Einmal-Passwort oder per Befehl und Verbindungspruefung, jeweils mit Fortschrittsanzeige. Der sshd-Befund empfiehlt prohibit-password, wenn root sich per Passwort anmelden darf - nur als Hinweis, geaendert wird nichts. E2E im gebauten Stand mit Worker gegen ein echtes sshd. Co-Authored-By: Claude Opus 5.5 --- .../bilder/host-eingerichtet-desktop.png | Bin 0 -> 125066 bytes docs/issues/009-host-key-pruefung.md | 20 ++-- docs/issues/010-bootstrap.md | 24 +++-- .../(app)/hosts/[id]/BootstrapAktionen.tsx | 79 ++++++++++++--- .../(app)/hosts/[id]/BootstrapPasswort.tsx | 48 +++++++++ src/app/(app)/hosts/[id]/HostKeyAktionen.tsx | 22 +++-- .../(app)/hosts/[id]/HostKeyEntscheidung.tsx | 92 ++++++++++++++++++ src/app/(app)/hosts/[id]/page.tsx | 35 ++++++- src/components/ui/MonoBlock.tsx | 45 +++++++++ src/lib/sshd-hinweise.ts | 39 ++++++++ tests/e2e/host-einrichten.spec.ts | 72 ++++++++++++++ tests/sshd-hinweise.test.ts | 19 ++++ 12 files changed, 450 insertions(+), 45 deletions(-) create mode 100644 docs/anleitung/bilder/host-eingerichtet-desktop.png create mode 100644 src/app/(app)/hosts/[id]/BootstrapPasswort.tsx create mode 100644 src/app/(app)/hosts/[id]/HostKeyEntscheidung.tsx create mode 100644 src/components/ui/MonoBlock.tsx create mode 100644 src/lib/sshd-hinweise.ts create mode 100644 tests/e2e/host-einrichten.spec.ts create mode 100644 tests/sshd-hinweise.test.ts diff --git a/docs/anleitung/bilder/host-eingerichtet-desktop.png b/docs/anleitung/bilder/host-eingerichtet-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..bf6d99a35eeb35bdfae8cc890aefadf658bb8224 GIT binary patch literal 125066 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Ν|To3)$vUV)Lai+EAEm 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 literal 0 HcmV?d00001 diff --git a/docs/issues/009-host-key-pruefung.md b/docs/issues/009-host-key-pruefung.md index db19b93..2feb87b 100644 --- a/docs/issues/009-host-key-pruefung.md +++ b/docs/issues/009-host-key-pruefung.md @@ -1,23 +1,27 @@ # #009 Host-Key-Prüfung (TOFU) und Erreichbarkeit -**Status:** offen +**Status:** erledigt **Meilenstein:** v0.1.0 **Labels:** sicherheit -**Geschätzt:** 3 h **Tatsächlich:** – +**Geschätzt:** 3 h **Tatsächlich:** 0 h 25 min ## Ziel Beim ersten Kontakt wird der Host-Key angezeigt und bestätigt; danach strikte Prüfung, Änderung = Warnung. ## Aufgaben -- [ ] Vorgang „Host-Key abrufen“ (ohne Anmeldung) -- [ ] Bestätigen/Ablehnen mit Protokolleintrag -- [ ] `hostVerifier` in ssh2 gegen gespeicherten Key -- [ ] Geänderter Host-Key: Status GEAENDERT, keine Verbindung, deutliche Warnung -- [ ] Erreichbarkeitsprüfung +- [x] Vorgang „Host-Key abrufen“ (ohne Anmeldung) +- [x] Bestätigen/Ablehnen mit Protokolleintrag +- [x] `hostVerifier` in ssh2 gegen gespeicherten Key +- [x] Geänderter Host-Key: Status GEAENDERT, keine Verbindung, deutliche Warnung +- [x] Erreichbarkeitsprüfung ## Akzeptanzkriterien -- [ ] Integrationstest: geänderter Host-Key wird abgelehnt +- [x] Integrationstest: geänderter Host-Key wird abgelehnt ## Abhängigkeiten #006, #007 ## Notizen / Entscheidungen +- **Nur vertraute Algorithmen anbieten:** `serverHostKey` enthält nur die Verfahren der vertrauten Keys (für `ssh-rsa` die `rsa-sha2-*`). Sonst könnte ein Server einen Key eines anderen Typs zeigen, den nie jemand gesehen hat. +- **Abrufen bricht im `hostVerifier` ab** – vor jedem Austausch von Zugangsdaten. +- **Geänderter Key:** wird als AUSSTEHEND festgehalten, öffnet eine Abweichung `HOSTKEY_GEAENDERT` und setzt den Host auf Drift. Ersetzen nur mit ausdrücklichem Häkchen in der Oberfläche **und** frischer Bestätigung (Re-Auth). +- Integrationstest gegen echtes sshd inkl. Host-Key-Tausch; E2E im Browser (abrufen → vertrauen). diff --git a/docs/issues/010-bootstrap.md b/docs/issues/010-bootstrap.md index 8542aa1..38f6932 100644 --- a/docs/issues/010-bootstrap.md +++ b/docs/issues/010-bootstrap.md @@ -1,24 +1,30 @@ # #010 Bootstrap neuer Hosts -**Status:** offen +**Status:** erledigt **Meilenstein:** v0.1.0 **Labels:** backend, ui -**Geschätzt:** 4 h **Tatsächlich:** – +**Geschätzt:** 4 h **Tatsächlich:** 0 h 35 min ## Ziel Deployment-Key auf neuen Host bringen: einmalige Passwortanmeldung (nie gespeichert) oder Copy-Paste-Befehl. Dienstbenutzer `sshkv` + sudoers. ## Aufgaben -- [ ] Einmal-Passwort nur im Arbeitsspeicher des Workers, verschlüsselt im Job, danach gelöscht -- [ ] Bootstrap-Skript: Benutzer `sshkv`, `/etc/sudoers.d/sshkv` (geprüft mit `visudo -c`), Deployment-Key in verwaltetem Block -- [ ] Alternative: Befehl zum Kopieren -- [ ] Prüfung nach Bootstrap: Anmeldung per Schlüssel, sudo ohne Passwort -- [ ] sshd-Check: `PermitRootLogin`, `PasswordAuthentication` (nur Anzeige) +- [x] Einmal-Passwort nur im Arbeitsspeicher des Workers, verschlüsselt im Job, danach gelöscht +- [x] Bootstrap-Skript: Benutzer `sshkv`, `/etc/sudoers.d/sshkv` (geprüft mit `visudo -c`), Deployment-Key in verwaltetem Block +- [x] Alternative: Befehl zum Kopieren +- [x] Prüfung nach Bootstrap: Anmeldung per Schlüssel, sudo ohne Passwort +- [x] sshd-Check: `PermitRootLogin`, `PasswordAuthentication` (nur Anzeige) ## Akzeptanzkriterien -- [ ] Integrationstest gegen Test-Container: Bootstrap per Passwort und per Befehl -- [ ] Passwort taucht nirgends in DB, Logs oder Protokoll auf +- [x] Integrationstest gegen Test-Container: Bootstrap per Passwort und per Befehl +- [x] Passwort taucht nirgends in DB, Logs oder Protokoll auf ## Abhängigkeiten #009 ## Notizen / Entscheidungen +- **Ein Skript für beide Wege** (Passwort im Worker, Befehl zum Kopieren) – keine zwei Wahrheiten über Änderungen am Host. +- **Passwort:** reist verschlüsselt (`SSHKV_APP_SECRET`) nur im Job, Job wird nach dem Lauf gelöscht; Test: Passwort steht in keiner Tabelle. JS-Strings lassen sich nicht überschreiben – das Passwort lebt bis zur Speicherbereinigung im Worker-Speicher. +- **Nicht-root mit sudo-Passwort** wird unterstützt (`sudo -S`). +- **Symlink-Schutz:** Dateien im Home des Zielbenutzers liest und schreibt das Skript als dieser Benutzer (`runuser`). Test mit Symlink auf `/etc/shadow`: Abbruch, `/etc/shadow` unverändert. +- **CRLF:** Das Bootstrap-Skript entfernt `\r` aus authorized_keys. Die bytegenaue Erhaltung fremder Zeilen leistet erst der TS-Merge aus #015. +- **sshd-Hinweise** (nur Anzeige): `PermitRootLogin yes` → Empfehlung `prohibit-password`; abweichendes `AuthorizedKeysFile` → Warnung. diff --git a/src/app/(app)/hosts/[id]/BootstrapAktionen.tsx b/src/app/(app)/hosts/[id]/BootstrapAktionen.tsx index 245f258..60b2ca3 100644 --- a/src/app/(app)/hosts/[id]/BootstrapAktionen.tsx +++ b/src/app/(app)/hosts/[id]/BootstrapAktionen.tsx @@ -1,19 +1,68 @@ -export type BootstrapAktionenProps = { - readonly hostId: string; - /** Recht `hostsVerwalten` – serverseitig per `darf()` ermittelt. */ - readonly darfVerwalten: boolean; - /** `bootstrapAm` ist gesetzt: sshkv arbeitet bereits schluesselbasiert. */ - readonly eingerichtet: boolean; - /** Mindestens ein vertrauter Host-Key – Voraussetzung fuer jede Verbindung. */ - readonly hostKeyVertraut: boolean; -}; +import { VorgangsKnopf } from "@/components/vorgang/VorgangsKnopf"; +import { MonoBlock } from "@/components/ui/MonoBlock"; +import { bootstrapPruefenAktion } from "@/server/actions/bootstrap"; +import { erreichbarkeitPruefenAktion } from "@/server/actions/hostkeys"; +import { BootstrapPasswort } from "./BootstrapPasswort"; /** - * Platzhalter fuer „Zugang einrichten“ (Bootstrap, #010). Die Detailseite rendert diese - * Komponente unter der Info-Leiste; #010 ersetzt nur diese Datei. + * Bootstrap und Verbindungspruefung im Info-Bereich des Hosts (#010). Zwei Wege zum ersten + * Zugang: einmaliges Passwort (wird nie gespeichert) oder Befehl zum Kopieren. */ -export function BootstrapAktionen(props: BootstrapAktionenProps) { - // Die Props stehen schon fest, damit die Detailseite bis #009/#010 unveraendert bleibt. - void props; - return null; +export function BootstrapAktionen({ + hostId, + darfVerwalten, + eingerichtet, + hostKeyVertraut, + befehl, +}: { + hostId: string; + darfVerwalten: boolean; + eingerichtet: boolean; + hostKeyVertraut: boolean; + /** Bootstrap-Befehl mit dem Public Key des Deployment-Keys. */ + befehl?: string; +}) { + if (!darfVerwalten) return null; + if (!hostKeyVertraut) { + return ( +

+ Bevor sshkv sich anmeldet, muss der Host-Key bestätigt sein – siehe unten. +

+ ); + } + if (eingerichtet) { + return ( +
+ + +
+ ); + } + return ( +
+
+

Einmalig per Passwort

+

+ sshkv meldet sich ein einziges Mal mit Passwort an, legt den Zugang an und arbeitet danach nur noch + mit seinem Deployment-Key. Das Passwort wird{" "} + nicht gespeichert. +

+ +
+
+

Oder per Befehl

+

+ Auf dem Host als Benutzer mit sudo einfügen, danach prüfen lassen. +

+ {befehl && } + +
+
+ ); } diff --git a/src/app/(app)/hosts/[id]/BootstrapPasswort.tsx b/src/app/(app)/hosts/[id]/BootstrapPasswort.tsx new file mode 100644 index 0000000..a26a3ec --- /dev/null +++ b/src/app/(app)/hosts/[id]/BootstrapPasswort.tsx @@ -0,0 +1,48 @@ +"use client"; + +import { KeyRound } from "lucide-react"; +import { useState } from "react"; +import { Feld } from "@/components/ui/Feld"; +import { VorgangsKnopf } from "@/components/vorgang/VorgangsKnopf"; +import { bootstrapPerPasswortAktion } from "@/server/actions/bootstrap"; + +/** Formular fuer den Bootstrap per Einmal-Passwort (#010). */ +export function BootstrapPasswort({ hostId }: { hostId: string }) { + const [benutzer, setBenutzer] = useState("root"); + const [passwort, setPasswort] = useState(""); + + return ( +
+
+ setBenutzer(e.target.value)} + autoComplete="off" + mono + hinweis="root oder ein Benutzer mit sudo" + /> + setPasswort(e.target.value)} + autoComplete="off" + /> +
+ } + beschriftung="Zugang einrichten" + aktion={async () => { + const antwort = await bootstrapPerPasswortAktion({ hostId, benutzer, passwort }); + // Das Passwort bleibt keinen Augenblick laenger als noetig im Formular stehen. + setPasswort(""); + return antwort; + }} + /> +
+ ); +} diff --git a/src/app/(app)/hosts/[id]/HostKeyAktionen.tsx b/src/app/(app)/hosts/[id]/HostKeyAktionen.tsx index 0086179..f8fdb7d 100644 --- a/src/app/(app)/hosts/[id]/HostKeyAktionen.tsx +++ b/src/app/(app)/hosts/[id]/HostKeyAktionen.tsx @@ -1,4 +1,7 @@ +import { Download } from "lucide-react"; +import { VorgangsKnopf } from "@/components/vorgang/VorgangsKnopf"; import type { HostKeyZusammenfassung } from "@/lib/hosts"; +import { hostKeyAbrufenAktion } from "@/server/actions/hostkeys"; export type HostKeyAktionenProps = { readonly hostId: string; @@ -8,12 +11,15 @@ export type HostKeyAktionenProps = { readonly status: HostKeyZusammenfassung; }; -/** - * Platzhalter fuer „Host-Key abrufen“ / „Bestätigen“ / „Ablehnen“ (#009). Die Detailseite - * rendert diese Komponente im Kopf der Karte „Host-Key“; #009 ersetzt nur diese Datei. - */ -export function HostKeyAktionen(props: HostKeyAktionenProps) { - // Die Props stehen schon fest, damit die Detailseite bis #009/#010 unveraendert bleibt. - void props; - return null; +/** „Host-Key abrufen“ im Kopf der Karte (#009). Entschieden wird je Zeile (HostKeyEntscheidung). */ +export function HostKeyAktionen({ hostId, darfEntscheiden, status }: HostKeyAktionenProps) { + if (!darfEntscheiden) return null; + return ( + } + /> + ); } diff --git a/src/app/(app)/hosts/[id]/HostKeyEntscheidung.tsx b/src/app/(app)/hosts/[id]/HostKeyEntscheidung.tsx new file mode 100644 index 0000000..72f5f9b --- /dev/null +++ b/src/app/(app)/hosts/[id]/HostKeyEntscheidung.tsx @@ -0,0 +1,92 @@ +"use client"; + +import { ShieldAlert } from "lucide-react"; +import { useRouter } from "next/navigation"; +import { useState, useTransition } from "react"; +import { Button } from "@/components/ui/Button"; +import { hostKeyEntscheidenAktion } from "@/server/actions/hostkeys"; + +/** + * Entscheidung ueber einen ausstehenden Host-Key (#009, TOFU). Weicht er von einem + * vertrauten Key ab, verlangt die Oberflaeche eine ausdrueckliche Bestaetigung – und der + * Server zusaetzlich eine frische Anmeldung. + */ +export function HostKeyEntscheidung({ + hostId, + hostSchluesselId, + ersetztVertrauten, +}: { + hostId: string; + hostSchluesselId: string; + ersetztVertrauten: boolean; +}) { + const router = useRouter(); + const [geprueft, setGeprueft] = useState(false); + const [fehler, setFehler] = useState(); + const [laeuft, starten] = useTransition(); + + const entscheiden = (vertrauen: boolean) => + starten(async () => { + setFehler(undefined); + const antwort = await hostKeyEntscheidenAktion({ + hostId, + hostSchluesselId, + vertrauen, + ersetzen: vertrauen && ersetztVertrauten, + }); + if (antwort.bestaetigen) window.location.href = antwort.bestaetigen; + else if (antwort.fehler) setFehler(antwort.fehler); + else router.refresh(); + }); + + return ( +
+ {ersetztVertrauten ? ( +
+ +
+

Dieser Key weicht vom vertrauten Host-Key ab.

+

+ Nur annehmen, wenn sicher ist, dass der Host neu installiert oder sein Host-Key bewusst + getauscht wurde. Sonst kann jemand die Verbindung abfangen. +

+ +
+
+ ) : ( +

+ Vergleichen Sie den Fingerprint am Host, z. B. mit{" "} + + ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub + + . +

+ )} +
+ + +
+ {fehler && ( +

+ {fehler} +

+ )} +
+ ); +} diff --git a/src/app/(app)/hosts/[id]/page.tsx b/src/app/(app)/hosts/[id]/page.tsx index 368720a..90fa9f8 100644 --- a/src/app/(app)/hosts/[id]/page.tsx +++ b/src/app/(app)/hosts/[id]/page.tsx @@ -17,7 +17,10 @@ import { darf } from "@/server/auth/rechte"; import { sitzungErforderlich } from "@/server/auth/sitzungspflicht"; import { hostDetail, type HostDetail } from "@/server/queries/hosts"; import { BootstrapAktionen } from "./BootstrapAktionen"; +import { sshdHinweise } from "@/lib/sshd-hinweise"; import { HostKeyAktionen } from "./HostKeyAktionen"; +import { HostKeyEntscheidung } from "./HostKeyEntscheidung"; +import { bootstrapBefehlFuer } from "@/server/queries/bootstrap"; export const metadata: Metadata = { title: "Host" }; @@ -52,6 +55,7 @@ function SshdBefund({ befund }: { befund: unknown }) { if (!befund || typeof befund !== "object" || Array.isArray(befund)) return null; const eintraege = Object.entries(befund as Record); if (eintraege.length === 0) return null; + const hinweise = sshdHinweise(befund as Record); return (

sshd-Befund

@@ -63,6 +67,20 @@ function SshdBefund({ befund }: { befund: unknown }) {
))} + {hinweise.length > 0 && ( +
    + {hinweise.map((h) => ( +
  • + {h.stufe === "info" ? "ℹ" : "▲"} {h.text} +
  • + ))} +
+ )} ); } @@ -76,6 +94,7 @@ export default async function HostSeite({ params }: { params: Promise<{ id: stri const archiviert = host.archiviertAm !== null; const verwalten = darf(benutzer.rolle, "hostsVerwalten") && !archiviert; + const darfEntscheiden = darf(benutzer.rolle, "hostKeyEntscheiden") && !archiviert; const jetzt = new Date(); return ( @@ -142,6 +161,7 @@ export default async function HostSeite({ params }: { params: Promise<{ id: stri darfVerwalten={verwalten} eingerichtet={host.bootstrapAm !== null} hostKeyVertraut={host.hostKey.vertraut > 0} + befehl={verwalten && !host.bootstrapAm ? await bootstrapBefehlFuer(host.id) : undefined} /> @@ -149,11 +169,7 @@ export default async function HostSeite({ params }: { params: Promise<{ id: stri titel="Host-Key" untertitel="Fingerprints, gegen die sshkv jede Verbindung prüft" aktionen={ - + } > {host.hostSchluessel.length === 0 ? ( @@ -184,6 +200,15 @@ export default async function HostSeite({ params }: { params: Promise<{ id: stri + {k.status === "AUSSTEHEND" && darfEntscheiden && ( + v.status === "VERTRAUT" && v.algorithmus === k.algorithmus, + )} + /> + )} ))} diff --git a/src/components/ui/MonoBlock.tsx b/src/components/ui/MonoBlock.tsx new file mode 100644 index 0000000..a4e71cc --- /dev/null +++ b/src/components/ui/MonoBlock.tsx @@ -0,0 +1,45 @@ +"use client"; + +import { Check, Copy } from "lucide-react"; +import { useState } from "react"; + +/** Mehrzeiliger technischer Text (Befehle, Skripte) mit Kopier-Button (#010). */ +export function MonoBlock({ + wert, + beschriftung, + hoehe, +}: { + wert: string; + beschriftung: string; + hoehe?: string; +}) { + const [kopiert, setKopiert] = useState(false); + return ( +
+ +
+        {wert}
+      
+
+ ); +} diff --git a/src/lib/sshd-hinweise.ts b/src/lib/sshd-hinweise.ts new file mode 100644 index 0000000..c942bcf --- /dev/null +++ b/src/lib/sshd-hinweise.ts @@ -0,0 +1,39 @@ +/** + * Hinweise zum sshd-Befund eines Hosts (#010). Nur Anzeige: sshkv aendert sshd_config + * nie ohne ausdrueckliche Bestaetigung (Vorgabe „Bootstrap“). + */ +export type SshdHinweis = { readonly stufe: "warnung" | "gefahr" | "info"; readonly text: string }; + +export function sshdHinweise(befund: Record | null | undefined): SshdHinweis[] { + if (!befund) return []; + const wert = (name: string) => + typeof befund[name] === "string" ? (befund[name] as string).toLowerCase() : ""; + const hinweise: SshdHinweis[] = []; + + if (wert("permitRootLogin") === "yes") { + hinweise.push({ + stufe: "warnung", + text: "root darf sich per Passwort anmelden. Empfohlen: PermitRootLogin prohibit-password.", + }); + } + if (wert("passwordAuthentication") === "yes") { + hinweise.push({ stufe: "info", text: "Passwort-Anmeldung ist für alle Benutzer aktiv." }); + } + if (wert("pubkeyAuthentication") === "no") { + hinweise.push({ + stufe: "gefahr", + text: "Anmeldung per Schlüssel ist abgeschaltet – sshkv kann so nicht arbeiten.", + }); + } + const dateien = wert("authorizedKeysFile"); + if ( + dateien && + !dateien.split(/\s+/).some((d) => d === ".ssh/authorized_keys" || d === "%h/.ssh/authorized_keys") + ) { + hinweise.push({ + stufe: "gefahr", + text: `sshd liest Schlüssel aus „${befund["authorizedKeysFile"] as string}“, sshkv schreibt nach ~/.ssh/authorized_keys.`, + }); + } + return hinweise; +} diff --git a/tests/e2e/host-einrichten.spec.ts b/tests/e2e/host-einrichten.spec.ts new file mode 100644 index 0000000..5a28ac9 --- /dev/null +++ b/tests/e2e/host-einrichten.spec.ts @@ -0,0 +1,72 @@ +import { execFileSync } from "node:child_process"; +import { expect, test } from "@playwright/test"; +import "dotenv/config"; + +/** + * Einen neuen Host in Betrieb nehmen (#008–#010), im gebauten Stand mit laufendem Worker + * gegen das Testziel B aus docker-compose.test.yml: + * Host anlegen → Host-Key abrufen → vertrauen → Bootstrap per Passwort → Verbindung pruefen. + * Laeuft gegen die Entwicklungsdatenbank; der Host heisst zz-e2e-… und wird am Ende archiviert. + */ +const ZIEL_PORT = (process.env["SSHKV_TEST_ZIEL_B"] ?? "127.0.0.1:2222").split(":")[1] ?? "2222"; +const ROOT_PASSWORT = process.env["SSHKV_TEST_ROOT_PASSWORT"] || "sshkv-test"; + +test.setTimeout(120_000); + +test.beforeAll(() => { + // Testziel ohne Dienstbenutzer, damit der Bootstrap wirklich etwas zu tun hat. + execFileSync("docker", [ + "compose", + "-f", + "docker-compose.test.yml", + "exec", + "-T", + "ziel-b", + "sh", + "-c", + "userdel -r sshkv 2>/dev/null; rm -f /etc/sudoers.d/sshkv; true", + ]); +}); + +test("neuen Host einrichten", async ({ page }) => { + const name = `zz-e2e-${Date.now().toString(36)}`; + + await page.goto("/anmelden"); + await page.getByRole("link", { name: /Mit Mock-OIDC anmelden/ }).click(); + await page.locator('button[data-rolle="admin"]').click(); + await page.getByRole("button", { name: "Anmelden", exact: true }).click(); + await expect(page.getByRole("heading", { name: "Übersicht" })).toBeVisible(); + + await page.goto("/hosts/neu"); + await page.getByLabel("Name").fill(name); + await page.getByLabel("Adresse").fill("127.0.0.1"); + await page.getByLabel("Port").fill(ZIEL_PORT); + await page.getByRole("button", { name: "Host anlegen" }).click(); + await expect(page.getByRole("heading", { name })).toBeVisible(); + + await page.getByRole("button", { name: "Host-Key abrufen" }).click(); + await expect(page.getByRole("button", { name: "Fingerprint stimmt – vertrauen" })).toBeVisible({ + timeout: 30_000, + }); + await page.getByRole("button", { name: "Fingerprint stimmt – vertrauen" }).click(); + await expect(page.getByText("Einmalig per Passwort")).toBeVisible({ timeout: 15_000 }); + await expect(page.getByLabel("Bootstrap-Befehl", { exact: true })).toContainText("SSHKV_BOOTSTRAP"); + + await page.getByLabel("Passwort", { exact: true }).fill(ROOT_PASSWORT); + await page.getByRole("button", { name: "Zugang einrichten" }).click(); + await expect(page.getByRole("button", { name: "Verbindung prüfen" })).toBeVisible({ timeout: 60_000 }); + await expect(page.getByText("noch nicht eingerichtet")).toHaveCount(0); + + await expect(page.getByText(/Empfohlen: PermitRootLogin prohibit-password/)).toBeVisible(); + const pruefen = page.getByRole("button", { name: "Verbindung prüfen" }); + await pruefen.click(); + // Gezielt im Block dieses Knopfs – der Host-Key-Knopf zeigt sein eigenes „Erledigt.“. + await expect(pruefen.locator("..").getByText("Erledigt.")).toBeVisible({ timeout: 30_000 }); + + await page.screenshot({ path: "docs/anleitung/bilder/host-eingerichtet-desktop.png", fullPage: true }); + + // Aufraeumen: archivieren, damit die Liste nicht waechst. + await page.getByRole("button", { name: "Host archivieren" }).click(); + await page.getByRole("dialog").getByRole("button", { name: "Archivieren", exact: true }).click(); + await expect(page).toHaveURL(/\/hosts$/); +}); diff --git a/tests/sshd-hinweise.test.ts b/tests/sshd-hinweise.test.ts new file mode 100644 index 0000000..a780be9 --- /dev/null +++ b/tests/sshd-hinweise.test.ts @@ -0,0 +1,19 @@ +import { describe, expect, it } from "vitest"; +import { sshdHinweise } from "@/lib/sshd-hinweise"; + +describe("sshd-Hinweise (#010)", () => { + it("empfiehlt prohibit-password, wenn root per Passwort darf", () => { + expect(sshdHinweise({ permitRootLogin: "yes" })[0]).toMatchObject({ stufe: "warnung" }); + expect(sshdHinweise({ permitRootLogin: "without-password" })).toEqual([]); + }); + + it("warnt, wenn sshd authorized_keys gar nicht liest", () => { + expect(sshdHinweise({ authorizedKeysFile: ".ssh/authorized_keys .ssh/authorized_keys2" })).toEqual([]); + expect(sshdHinweise({ authorizedKeysFile: "/etc/ssh/keys/%u" })[0]).toMatchObject({ stufe: "gefahr" }); + }); + + it("kommt mit fehlenden Angaben zurecht", () => { + expect(sshdHinweise(null)).toEqual([]); + expect(sshdHinweise({})).toEqual([]); + }); +});