Zeiten und Entscheidungen der Sitzung festhalten, damit die Abnahme von 1.0.0 den vollständigen Stand sieht. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
119 lines
8.7 KiB
Markdown
119 lines
8.7 KiB
Markdown
# Changelog
|
||
|
||
Alle nennenswerten Änderungen an SSHKeyVault werden in dieser Datei dokumentiert.
|
||
|
||
Das Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.1.0/),
|
||
und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
|
||
|
||
## [Unveröffentlicht]
|
||
|
||
### Hinzugefügt
|
||
- Geführte Rotation des Deployment-Keys in fünf Schritten (erzeugen, verteilen, prüfen, umstellen, aufräumen) – kein Host steht dabei ohne funktionierenden Key da; nicht erreichbare Hosts lassen sich bewusst übergehen (#031)
|
||
- Laufende Schlüsselrotation abbrechen – der Nachfolger wird per Dry-Run wieder entfernt (#032)
|
||
- „Zum Dry-Run“ in der Zuweisungsmatrix springt direkt zur Dry-Run-Karte (#032)
|
||
|
||
### Geändert
|
||
- Protokoll-IDs werden lückenlos vergeben (#032)
|
||
|
||
### Behoben
|
||
- Massenwiderruf lehnte im Browser erzeugte Schlüssel ab (IDs mit Bindestrich) (#032)
|
||
- Hinweis nach verweigerter Bestätigung nannte beim Massenwiderruf den falschen Knopf (#032)
|
||
|
||
### Sicherheit
|
||
|
||
## [0.5.0] – 2026-10-12
|
||
|
||
Phase 5: Übersicht, Audit-Log, Benachrichtigungen, Handbuch und Betrieb.
|
||
|
||
### Hinzugefügt
|
||
- Übersicht mit echten Zahlen: Kennzahlen, Hosts mit Abweichung, bald ablaufende und abgelaufene Schlüssel, letzte Aktionen (#026)
|
||
- Audit-Log: Filter, aufklappbare Einträge mit Diff und Hashes, Prüfung der Hash-Kette, CSV-Export (gestreamt), optionale Syslog-Kopie nach RFC 5424 (#027)
|
||
- Benachrichtigungen per E-Mail (Microsoft 365 SMTP vorbelegt) und Webhook mit Signatur: tägliche Zusammenfassung zu Drift, Ablauf und nicht erreichbaren Hosts, geänderte Host-Keys sofort; Testversand, Versandprotokoll ohne Doppelmeldungen; Einstellungsseite (#028)
|
||
- Handbuch mit Bildern, Installation mit authentik und Reverse Proxy, Bedrohungsanalyse mit Notfallplan (#029)
|
||
- `deploy/sichern.sh` und `deploy/wiederherstellen.sh` – Wiederherstellung auf einem Wegwerf-Stapel geprobt (#029)
|
||
|
||
### Geändert
|
||
- Der Worker startet nicht, wenn der Master-Key nicht zur Datenbank passt (#029)
|
||
|
||
### Sicherheit
|
||
- Sicherung ohne Master-Key, nur mit Prüfwert; Wiederherstellung bricht vor jeder Änderung ab, wenn der Master-Key nicht passt, und läuft in einer Transaktion
|
||
- SMTP-Passwort und Webhook-Geheimnis verschlüsselt gespeichert und nie wieder angezeigt; Webhook nur über https, ohne Weiterleitungen
|
||
- Syslog-Kopie enthält nie Details oder Diffs
|
||
|
||
## [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.
|
||
|
||
### 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.
|
||
|
||
### Hinzugefügt
|
||
- Schlüssel erzeugen (ed25519, RSA-4096, optional mit Passphrase), Paar oder Public Key importieren, Public Key exportieren; Liste mit Filter, Detailseite mit Verwendungen (#012)
|
||
- Personen verwalten; Self-Service „Meine Schlüssel“: jeder Benutzer hinterlegt eigene Public Keys, wirksam erst nach Zuweisung (#013)
|
||
- Private Key anzeigen und herunterladen – nur Admin, nur nach erneuter Bestätigung, genau einmal abholbar; Private Key aus SSHKeyVault löschen (#014)
|
||
- authorized_keys-Parser und verwalteter Block: fremde Zeilen bleiben bytegenau, beschädigte Blöcke werden nie überschrieben, Deployment-Key ist vor dem Entfernen geschützt (#015)
|
||
- Public Keys Hosts oder Hostgruppen zuweisen, Dry-Run mit Diff, Ausrollen mit Backup und optimistischer Sperre; Ansicht je Schlüssel und je Host (#016)
|
||
- Private Key auf einen Quell-Host ausrollen, mit verwaltetem Block in `~/.ssh/config` und `known_hosts` (#017)
|
||
- Verbindungstest von Host A nach Host B (#020, Teil)
|
||
- Zielbenutzer anlegen und sudoers pflegen – Grundlage, Oberfläche folgt (#018, Teil)
|
||
- Vorlagen: Platzhalter und Prüfung – Grundlage, Oberfläche folgt (#019, Teil)
|
||
|
||
### Sicherheit
|
||
- Importierte Private Keys reisen nur verschlüsselt im Job; Vorgang, Protokoll und Browser sehen sie nie (Tests)
|
||
- Private-Key-Ziele nimmt der Dry-Run nur für Admins auf
|
||
- Dateien in fremden Home-Verzeichnissen werden als deren Benutzer gelesen und geschrieben (Symlink-Schutz)
|
||
|
||
## [0.1.0] – 2026-10-12
|
||
|
||
Phase 1: Grundgerüst, Anmeldung, Hosts und Bootstrap.
|
||
|
||
### Hinzugefügt
|
||
- Projektplan mit Architektur, Datenmodell, Sicherheitskonzept und Phasenplan (`docs/PLAN.md`), Issues für alle fünf Phasen
|
||
- Projektgerüst: Next.js 16, Prisma 7, PostgreSQL 17, pnpm, ESLint/Prettier/Vitest/Playwright, commitlint (#001)
|
||
- Design „Tresor“: Design-Tokens, selbst gehostete Schriften, Logo, Favicon und PWA-Icons, Seitenleiste, Grundkomponenten (#002)
|
||
- Datenmodell für alle Phasen mit Datenbankregeln (CHECK, partielle Indizes, Trigger) und Seed mit Notfall-Admin und eingebauten Vorlagen „Deployment-Zugang“, „Backup-Zugang“, „Admin-Zugang Person“ (#003)
|
||
- Anmeldung per OIDC (authentik) mit Rollen Admin/Operator/Leser aus Gruppen; Notfall-Admin mit Passwort und Pflicht-TOTP; erneute Bestätigung vor kritischen Aktionen (#004)
|
||
- Revisionssicheres Protokoll: append-only, Hash-Kette, Prüffunktion (#005)
|
||
- OpenSSH-Schlüssel (ed25519, RSA-4096) erzeugen, lesen und schreiben ohne `ssh-keygen`, kompatibel geprüft; Envelope Encryption mit Master-Key; Deployment-Key der Instanz (#006)
|
||
- Worker mit pg-boss und Vorgängen mit Fortschrittsanzeige; Dockerfile und Docker Compose für den Betrieb (#007)
|
||
- Hosts und Hostgruppen anlegen, bearbeiten, archivieren, filtern; Demo-Daten mit `SSHKV_SEED_DEMO=1` (#008)
|
||
- Host-Key-Prüfung nach TOFU: abrufen, Fingerprint bestätigen oder ablehnen, strikte Prüfung bei jeder Verbindung, Warnung bei Änderung (#009)
|
||
- Bootstrap neuer Hosts per Einmal-Passwort oder Befehl zum Kopieren, mit Dienstbenutzer `sshkv` und sudoers; sshd-Hinweise (#010)
|
||
- SSH-Testziele (Debian 13) und Mock-OIDC für Integrations- und E2E-Tests (#011)
|
||
|
||
### Sicherheit
|
||
- Private Keys nur verschlüsselt in der Datenbank; nur der Worker kann sie öffnen – strukturell getestet
|
||
- Ein `pg_dump` enthält keinen Klartext-Schlüssel (Test)
|
||
- Bootstrap-Passwort wird nirgends gespeichert (Test); Dateien im Home des Zielbenutzers werden als dieser Benutzer geschrieben (Symlink-Test gegen `/etc/shadow`)
|
||
- Content-Security-Policy mit Nonce, Sicherheits-Kopfzeilen, Rate-Limit für den Notfallzugang
|