diff --git a/CHANGELOG.md b/CHANGELOG.md index 6173977..2cd2c37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,21 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/). ### Sicherheit +## [0.3.0] – 2026-10-12 + +Phase 3: Host-zu-Host – Private Keys, Zielkonten, Vorlagen und Assistent. + +### Hinzugefügt +- Host-zu-Host-Assistent: Vorlage wählen, Host A und B, Zielbenutzer, Einschränkungen und `~/.ssh/config`-Alias, Fingerprint von B bestätigen, Dry-Run, ausrollen, Verbindung testen – in einem Durchgang (#020) +- Zielbenutzer (z. B. `deploy`) auf dem Ziel anlegen, mit sudoers-Datei für bestimmte Befehle oder vollen Zugriff; Vorschau vor dem Anlegen, Prüfung mit `visudo -c` (#018) +- Vorlagen verwalten: eingebaute „Deployment-Zugang“, „Backup-Zugang“, „Admin-Zugang Person“, eigene anlegen und archivieren, Live-Vorschau der Platzhalter und des sudoers-Inhalts (#019) +- Übersicht verlinkt den Assistenten + +### Sicherheit +- Neue Benutzer mit sudo nur durch Admins mit frischer Bestätigung +- sshkv überschreibt keine fremde sudoers-Datei und fasst Systemkonten nicht an; ein Widerruf löscht nur Benutzer, die sshkv selbst angelegt hat +- Platzhalter-Werte können keine zusätzlichen authorized_keys-Optionen einschleusen + ## [0.2.0] – 2026-10-12 Phase 2: Schlüssel, Personen und Ausrollen von Public Keys – dazu vorgezogen aus Phase 3 das Ausrollen von Private Keys. diff --git a/DEVLOG.md b/DEVLOG.md index 9d57c92..dc9b904 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -2,8 +2,8 @@ ## Zeitübersicht -**Gesamt (Wandzeit):** 2 h 25 min -**Summe der Issue-Zeiten:** 7 h 08 min – Sub-Agenten arbeiteten parallel an #002, #006, #008, #011 und #012–#014. +**Gesamt (Wandzeit):** 2 h 55 min +**Summe der Issue-Zeiten:** 8 h 23 min – Sub-Agenten arbeiteten parallel an #002, #006, #008, #011, #012–#014 und #019 (Oberfläche). | Issue | Zeit | |---|---| @@ -25,14 +25,15 @@ | #015 authorized_keys-Parser | 0 h 15 min | | #016 Public Key ausrollen | 0 h 40 min | | #017 Private Key ausrollen | 0 h 45 min | -| #018 Zielbenutzer und sudoers (Teil) | 0 h 10 min | -| #019 Vorlagen (Teil) | 0 h 10 min | -| #020 Verbindungstest (Teil) | 0 h 05 min | +| #018 Zielbenutzer und sudoers | 0 h 30 min | +| #019 Vorlagen | 0 h 20 min | +| #020 Host-zu-Host-Assistent | 0 h 50 min | | Meilenstein | Zeit | |---|---| | v0.1.0 | 1 h 25 min (Wandzeit) | **abgeschlossen** | v0.2.0 | 1 h 00 min (Wandzeit) | **abgeschlossen** +| v0.3.0 | 0 h 30 min (Wandzeit) | **abgeschlossen** --- @@ -84,3 +85,19 @@ - **Private-Key-Ziele im Dry-Run nur für Admins:** Sonst hätte ein Operator einen vorbereiteten Private Key ausrollen lassen können (Freigabe Frage 3). - **Keine Sicherungskopie alter Private Keys** auf dem Host; config-Block am Dateianfang, weil ssh den ersten Treffer nimmt. - **Ein Hook `useVorgang` für alle:** zwei parallel entstandene Fassungen zusammengeführt, beide Schnittstellen bleiben. + +## 2026-10-12 · Sitzung 3 · 11:06–11:36 +**Issue:** #018–#020 +**Version:** 0.3.0 + +### Erledigt +- #019 Vorlagen-Oberfläche (Liste, Formular, Live-Vorschau) von einem Sub-Agenten, gemergt +- #018 Zielkonten als Vorgänge mit Migration, Herkunft gemerkt; Integrationstest anlegen → entfernen +- #020 Host-zu-Host-Assistent mit Vorlagen, wiederaufnehmbarer Ausführung und Verbindungstest; E2E mit „Deployment-Zugang“ +- Stand: 423 Unit-/DB-Tests, 31 Integrationstests, 16 E2E-Abläufe grün + +### Entscheidungen +- **Migration auf Ortszeit-Reihenfolge umbenannt** (`20261012110000`): Prisma vergibt UTC-Zeitstempel, die Migrationen des Agenten trugen Ortszeit – sonst stünde die neue vor älteren. +- **Bestätigung im neuen Tab:** Der Assistent hält seine Eingaben im Speicher; eine Umleitung nach `/bestaetigen` hätte sie gelöscht. +- **Ausführung des Assistenten als Kette im Klick** statt als Hook-Zustandsmaschine – einfacher, und erledigte Schritte lassen sich beim Fortsetzen überspringen. +- **Prozesse stoppen nur über ein Skript, das Programm und Arbeitsverzeichnis prüft:** Zweimal hatte ein zu breites Suchmuster die eigene Shell getroffen. diff --git a/docs/anleitung/bilder/assistent-fertig-desktop.png b/docs/anleitung/bilder/assistent-fertig-desktop.png index 8b12fdf..08bf408 100644 Binary files a/docs/anleitung/bilder/assistent-fertig-desktop.png and b/docs/anleitung/bilder/assistent-fertig-desktop.png differ diff --git a/docs/anleitung/bilder/assistent-ziel-desktop.png b/docs/anleitung/bilder/assistent-ziel-desktop.png index 2690a7b..1b13490 100644 Binary files a/docs/anleitung/bilder/assistent-ziel-desktop.png and b/docs/anleitung/bilder/assistent-ziel-desktop.png differ diff --git a/docs/anleitung/bilder/dry-run-desktop.png b/docs/anleitung/bilder/dry-run-desktop.png index 5291b55..d4244c1 100644 Binary files a/docs/anleitung/bilder/dry-run-desktop.png and b/docs/anleitung/bilder/dry-run-desktop.png differ diff --git a/docs/anleitung/bilder/host-eingerichtet-desktop.png b/docs/anleitung/bilder/host-eingerichtet-desktop.png index 1a92e68..e0c6b33 100644 Binary files a/docs/anleitung/bilder/host-eingerichtet-desktop.png and b/docs/anleitung/bilder/host-eingerichtet-desktop.png differ diff --git a/docs/anleitung/bilder/kern-ausgerollt-desktop.png b/docs/anleitung/bilder/kern-ausgerollt-desktop.png index e822a28..0aadc81 100644 Binary files a/docs/anleitung/bilder/kern-ausgerollt-desktop.png and b/docs/anleitung/bilder/kern-ausgerollt-desktop.png differ diff --git a/docs/anleitung/bilder/kern-dry-run-desktop.png b/docs/anleitung/bilder/kern-dry-run-desktop.png index 0020802..ddcbd48 100644 Binary files a/docs/anleitung/bilder/kern-dry-run-desktop.png and b/docs/anleitung/bilder/kern-dry-run-desktop.png differ diff --git a/docs/issues/018-benutzer-sudoers.md b/docs/issues/018-benutzer-sudoers.md index b8bada8..99573ad 100644 --- a/docs/issues/018-benutzer-sudoers.md +++ b/docs/issues/018-benutzer-sudoers.md @@ -1,20 +1,25 @@ # #018 Zielbenutzer anlegen und sudoers -**Status:** offen +**Status:** erledigt **Meilenstein:** v0.3.0 **Labels:** backend, sicherheit -**Geschätzt:** 3 h **Tatsächlich:** – +**Geschätzt:** 3 h **Tatsächlich:** 0 h 30 min ## Ziel Benutzer (z. B. `deploy`) anlegen, optional sudoers mit Vorschau und `visudo -c`. ## Aufgaben -- [ ] Auswahl keine/bestimmte Befehle/voll -- [ ] Entfernen beim Widerruf +- [x] Auswahl keine/bestimmte Befehle/voll +- [x] Entfernen beim Widerruf ## Akzeptanzkriterien -- [ ] Integrationstest +- [x] Integrationstest ## Abhängigkeiten #016 ## Notizen / Entscheidungen +- **sudoers** entsteht als `/etc/sudoers.d/.sshkv.XXXX` (Punkt im Namen: sudo ignoriert die Datei), wird mit `visudo -cf` geprüft und erst dann nach `/etc/sudoers.d/sshkv-` verschoben. Kopfzeile kennzeichnet sshkv-Dateien; eine fremde Datei gleichen Namens wird nie überschrieben. +- **Befehle:** absoluter Pfad, keine Zeichen mit Sonderbedeutung in sudoers (`, : = \`, Wildcards) – die Liste soll wirken, wie sie aussieht. +- **Geschützte Konten** (root, sshkv, Systemkonten) verwaltet sshkv nie als Zielkonto. +- **Herkunft gemerkt:** `vonSshkvAngelegt` – nur dann löscht ein Entfernen den Benutzer samt Home, sonst nur die sudoers-Datei. +- Vorgänge `ZIELKONTO_ANLEGEN`/`ZIELKONTO_ENTFERNEN` (Migration `20261012110000`), Recht `zielkontenVerwalten` = Admin mit frischer Bestätigung. Oberfläche im Assistenten (#020) mit sudoers-Vorschau. diff --git a/docs/issues/020-host-zu-host-assistent.md b/docs/issues/020-host-zu-host-assistent.md index c7e7362..9b890a7 100644 --- a/docs/issues/020-host-zu-host-assistent.md +++ b/docs/issues/020-host-zu-host-assistent.md @@ -1,21 +1,27 @@ # #020 Host-zu-Host-Assistent und Verbindungstest -**Status:** offen +**Status:** erledigt **Meilenstein:** v0.3.0 **Labels:** ui, backend -**Geschätzt:** 4 h **Tatsächlich:** – +**Geschätzt:** 4 h **Tatsächlich:** 0 h 50 min ## Ziel Geführter Ablauf: Schlüssel erzeugen, Private auf A, Public auf B, Host-Key von B in known_hosts von A, Verbindungstest. ## Aufgaben -- [ ] Schrittanzeige -- [ ] Zusammenfassung + Dry-Run -- [ ] `ssh -o BatchMode=yes … true` auf A +- [x] Schrittanzeige +- [x] Zusammenfassung + Dry-Run +- [x] `ssh -o BatchMode=yes … true` auf A ## Akzeptanzkriterien -- [ ] Kern-Anwendungsfall Ende-zu-Ende gegen zwei Test-Container +- [x] Kern-Anwendungsfall Ende-zu-Ende gegen zwei Test-Container ## Abhängigkeiten #019 ## Notizen / Entscheidungen +- **Fünf Schritte:** Vorlage & Zweck, Quelle, Ziel (Zielbenutzer, optional anlegen mit sudo, Einschränkungen, Alias, HostName/Port aus Sicht von A, Fingerprint von B bestätigen), Zusammenfassung, Ausrollen (Dry-Run, anwenden, Verbindungstest). +- **Vorlage** füllt Zielbenutzer, Anlegen/sudo, Ablaufdatum, `from=`-Muster und Alias vor; Platzhalter werden mit A und B aufgelöst. Ist die Adresse von A keine IP, fragt der Assistent nach. +- **Wiederaufnehmbar:** Erledigte Schritte (Schlüssel, Zielkonto, Zuweisungen) werden beim „Fortsetzen“ übersprungen. Braucht das Zielkonto eine frische Bestätigung, geschieht sie in einem neuen Tab – die Eingaben bleiben stehen. +- **root als Ziel:** deutlicher Hinweis, dass ein Agent wie Claude Code dann uneingeschränkten Zugriff hätte. +- **Verbindungstest:** `ssh -o BatchMode=yes -o StrictHostKeyChecking=yes true` auf A als Zielbenutzer. +- E2E: Vorlage „Deployment-Zugang“ → `deploy` auf B angelegt → A meldet sich als deploy bei B an. diff --git a/package.json b/package.json index 3996aac..8617b94 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sshkv", - "version": "0.2.0", + "version": "0.3.0", "private": true, "type": "module", "description": "SSHKeyVault – zentrale Verwaltung von SSH-Schluesseln mit Weboberflaeche",