Files
sshkeyvault/CHANGELOG.md
T
florian.wildeandClaude Opus 5.5 c06c051637 feat(rotation): nach Abbruch erneut rotieren (#033)
Bisher war vorgaengerId eindeutig: nach einer abgebrochenen Rotation
passte kein zweiter Nachfolger in die Kette, und der Schlüssel ließ sich
nur über Neuanlage, Zuweisen und Widerruf ersetzen.

Jetzt ist die Relation 1:n. Ein partieller Index erlaubt je Vorgänger
nur einen Nachfolger, der weder widerrufen ist noch gerade widerrufen
wird. Maßgeblich ist der jüngste. Erst wenn der Abbruch abgeschlossen
ist, beginnt die Rotation wieder bei Schritt 1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:09:42 +02:00

8.7 KiB
Raw Blame History

Changelog

Alle nennenswerten Änderungen an SSHKeyVault werden in dieser Datei dokumentiert.

Das Format basiert auf Keep a Changelog, und dieses Projekt folgt Semantic Versioning.

[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)
  • Nach einer abgebrochenen Rotation lässt sich derselbe Schlüssel erneut rotieren (#033)

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