diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cd2c37..302fca0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,24 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/). ### Sicherheit +## [0.4.0] – 2026-10-12 + +Phase 4: Abgleich, Import, Rotation, Widerruf und Zuweisungsmatrix. + +### Hinzugefügt +- Abgleich je Host und nächtlich per Zeitplan (`SSHKV_SYNC_CRON`): erkennt fehlende Schlüssel, von Hand geänderte Blöcke, unbekannte Schlüssel, falsche Rechte, beschädigte Blöcke und veränderte Private Keys; Befunde öffnen und schließen sich selbst. Hostseite mit Abweichungen und Ist-Zustand je Benutzer, „Jetzt abgleichen“ auch auf der Übersicht (#021) +- Unbekannte Schlüssel übernehmen: als bekannt aufnehmen oder per Dry-Run in den verwalteten Block holen (#022) +- Geführte Rotation: neuer Schlüssel an allen Stellen, Verbindungstests, erst dann wird der alte entfernt; jederzeit fortsetzbar, Rotationskette auf der Schlüsselseite (#023) +- Widerruf mit einem Klick und Massenwiderruf: Public Key, Private Key, config- und known_hosts-Einträge entfernen, optional Zielkonten; Zwischenzustand, solange ein Host nicht erreicht wird; abgelaufene Schlüssel mit Hinweis (#024) +- Zuweisungsmatrix Schlüssel × Host mit Filtern, Zell-Dialog zum Zuweisen und CSV-Export (#025) +- Skript zum Abgleich der Issues nach Gitea (`pnpm issues:sync`, #030 – Zugang steht noch aus) + +### Sicherheit +- Abgleich liest Dateien als der jeweilige Benutzer und ändert auf dem Host nichts +- Zeilen außerhalb des verwalteten Blocks entfernt sshkv nur bei ausdrücklich übernommenen Schlüsseln +- Ein Widerruf gilt erst als abgeschlossen, wenn der Schlüssel wirklich überall entfernt ist; eine Rotation entfernt den alten Schlüssel erst nach erfolgreichen Verbindungstests +- CSV-Export entschärft Werte, die eine Tabellenkalkulation als Formel lesen würde + ## [0.3.0] – 2026-10-12 Phase 3: Host-zu-Host – Private Keys, Zielkonten, Vorlagen und Assistent. diff --git a/DEVLOG.md b/DEVLOG.md index dc9b904..9018733 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -2,8 +2,8 @@ ## Zeitübersicht -**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). +**Gesamt (Wandzeit):** 3 h 40 min +**Summe der Issue-Zeiten:** 11 h 03 min – Sub-Agenten arbeiteten parallel an #002, #006, #008, #011, #012–#014, #019 (Oberfläche), #023–#025. | Issue | Zeit | |---|---| @@ -28,12 +28,19 @@ | #018 Zielbenutzer und sudoers | 0 h 30 min | | #019 Vorlagen | 0 h 20 min | | #020 Host-zu-Host-Assistent | 0 h 50 min | +| #021 Abgleich und Drift-Erkennung | 0 h 45 min | +| #022 Import bestehender Schlüssel | 0 h 20 min | +| #023 Geführte Rotation | 0 h 20 min | +| #024 Widerruf und Massenwiderruf | 0 h 25 min | +| #025 Zuweisungsmatrix | 0 h 30 min | +| #030 Gitea-Abgleich (vorbereitet) | 0 h 05 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** +| v0.4.0 | 0 h 45 min (Wandzeit) | **abgeschlossen** --- @@ -101,3 +108,21 @@ - **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. + +## 2026-10-12 · Sitzung 4 · 12:50–13:35 +**Issue:** #021–#025, #030 +**Version:** 0.4.0 + +### Erledigt +- Zweites, getrenntes Paar SSH-Testziele (`sshkv-test-b`, Ports 2231/2232, Mock-OIDC 8091) für den Rotation/Widerruf-Agenten, damit Integrationstests sich nicht gegenseitig zurücksetzen +- #021 Abgleich mit reiner Befundlogik, Worker-Ablauf, Zeitplan; #022 Übernahme mit neuem Feld `ausserhalbEntfernen` – Integrationstests und E2E +- #023/#024 Rotation und Widerruf (Sub-Agent) mit Zwischenzustand `widerrufEingeleitetAm`; #025 Zuweisungsmatrix (Sub-Agent) +- #030 Gitea-Skript bereitgelegt (Trockenlauf läuft) +- Stand: 470 Unit-/DB-Tests, 38 Integrationstests, 21 E2E-Abläufe grün + +### Entscheidungen +- **Abgleich ändert nichts auf dem Host:** Er meldet nur; Korrekturen laufen über Dry-Run und Ausrollen, damit ein Mensch sie sieht. +- **Bekannte Schlüssel außerhalb des Blocks sind kein Befund** – nur unbekannte. Sonst meldete jeder bewusst stehen gelassene Admin-Key dauerhaft Drift. +- **Widerruf mit Zwischenzustand:** Ein Schlüssel wird erst WIDERRUFEN, wenn er überall entfernt ist; ein nicht erreichbarer Host lässt ihn erkennbar „unvollständig“. +- **Rotation entfernt den alten Schlüssel erst nach erfolgreichen Verbindungstests**; doppelte Aliase in `~/.ssh/config`: die jüngste Zuweisung gewinnt. +- **Migrationszeitstempel in Ortszeit-Reihenfolge** auch bei parallel entstandenen Migrationen (`…130000` Agent, `…131000` Hauptsitzung). diff --git a/docs/anleitung/bilder/abgleich-desktop.png b/docs/anleitung/bilder/abgleich-desktop.png index 85869d4..f1cb60c 100644 Binary files a/docs/anleitung/bilder/abgleich-desktop.png and b/docs/anleitung/bilder/abgleich-desktop.png differ diff --git a/docs/anleitung/bilder/assistent-fertig-desktop.png b/docs/anleitung/bilder/assistent-fertig-desktop.png index 08bf408..4e04024 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 1b13490..50c15f7 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 d4244c1..a3ece68 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 e0c6b33..d747bb5 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 0aadc81..7977a78 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 ddcbd48..56ddb0f 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/anleitung/bilder/rotation-desktop.png b/docs/anleitung/bilder/rotation-desktop.png index 4b3c4bd..8141cca 100644 Binary files a/docs/anleitung/bilder/rotation-desktop.png and b/docs/anleitung/bilder/rotation-desktop.png differ diff --git a/docs/anleitung/bilder/widerruf-desktop.png b/docs/anleitung/bilder/widerruf-desktop.png index 5b83932..c3fde8a 100644 Binary files a/docs/anleitung/bilder/widerruf-desktop.png and b/docs/anleitung/bilder/widerruf-desktop.png differ diff --git a/docs/anleitung/bilder/widerruf-dry-run-desktop.png b/docs/anleitung/bilder/widerruf-dry-run-desktop.png index 0f13e66..ab0273a 100644 Binary files a/docs/anleitung/bilder/widerruf-dry-run-desktop.png and b/docs/anleitung/bilder/widerruf-dry-run-desktop.png differ diff --git a/package.json b/package.json index 8617b94..91cba34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sshkv", - "version": "0.3.0", + "version": "0.4.0", "private": true, "type": "module", "description": "SSHKeyVault – zentrale Verwaltung von SSH-Schluesseln mit Weboberflaeche",