Grundgeruest, Anmeldung, Hosts mit Host-Key-Pruefung und Bootstrap. README mit Installation und Ablauf fuer neue Hosts, CHANGELOG und DEVLOG nachgetragen. Offen im Meilenstein bleibt nur #030 (Gitea), das auf die Zugangsdaten wartet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
61 lines
2.7 KiB
Markdown
61 lines
2.7 KiB
Markdown
# SSHKeyVault (`sshkv`)
|
||
|
||
Selbst gehostete Weboberfläche zur zentralen Verwaltung von SSH-Schlüsseln: Schlüsselpaare
|
||
erzeugen und verwalten, Public Keys in `authorized_keys` verteilen, Private Keys gezielt auf
|
||
andere Hosts ausrollen, Ist- und Soll-Zustand abgleichen – alles revisionssicher protokolliert.
|
||
|
||
> **Stand 0.1.0 (Phase 1):** Grundgerüst, Anmeldung (OIDC + Notfall-Admin mit TOTP), Hosts und
|
||
> Hostgruppen, Host-Key-Prüfung (TOFU) und Bootstrap neuer Hosts. Schlüsselverwaltung und
|
||
> Ausrollen folgen in Phase 2 und 3 – siehe [`docs/PLAN.md`](docs/PLAN.md).
|
||
|
||
## Sicherheit vorab
|
||
|
||
SSHKeyVault hat **root-Zugriff auf alle verwalteten Hosts**. Deshalb:
|
||
|
||
- nur im internen Netz bzw. VPN betreiben, mit Reverse Proxy und TLS davor;
|
||
- den **Master-Key** (`SSHKV_MASTER_KEY_FILE`) getrennt von der Datenbank sichern – ohne ihn
|
||
ist ein Datenbank-Backup wertlos, und mit ihm zusammen gibt es alle Private Keys preis;
|
||
- Private Keys liegen nur verschlüsselt in der Datenbank (AES-256-GCM, Envelope Encryption);
|
||
entschlüsseln kann ausschließlich der Worker, der Webprozess hat den Master-Key nicht.
|
||
|
||
Mehr dazu in [`docs/PLAN.md`](docs/PLAN.md), Abschnitt 3.
|
||
|
||
## Installation (Docker Compose)
|
||
|
||
```bash
|
||
cp .env.example .env # Werte eintragen, siehe Kommentare
|
||
openssl rand -base64 48 # → SSHKV_APP_SECRET
|
||
mkdir -p geheim && head -c 32 /dev/urandom > geheim/master.key
|
||
sudo chown 1001:1001 geheim/master.key && sudo chmod 400 geheim/master.key
|
||
docker compose up -d
|
||
```
|
||
|
||
Die Oberfläche lauscht auf `127.0.0.1:3400` (`SSHKV_BIND`, `SSHKV_PORT`). Beim ersten Start legt
|
||
der Dienst `migrate` das Schema, den Notfall-Admin (`SSHKV_BREAKGLASS_*`) und die eingebauten
|
||
Vorlagen an; der Worker erzeugt den Deployment-Key der Instanz.
|
||
|
||
**Anmeldung:** über authentik (`SSHKV_OIDC_*`, Rollen über die Gruppen `sshkv-admins`,
|
||
`sshkv-operators`, `sshkv-readers`). Der Notfall-Admin richtet bei der ersten Anmeldung TOTP ein.
|
||
|
||
## Einen Host aufnehmen
|
||
|
||
1. **Hosts → + Host anlegen** (Name, Adresse, Port; Anmeldung als Dienstbenutzer `sshkv` mit sudo
|
||
– empfohlen – oder direkt als root).
|
||
2. **Host-Key abrufen**, den Fingerprint am Host vergleichen
|
||
(`ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub`) und vertrauen.
|
||
3. **Bootstrap:** einmalig per Passwort (wird nicht gespeichert) oder den angezeigten Befehl auf
|
||
dem Host einfügen und „Einrichtung prüfen“.
|
||
|
||
## Entwicklung
|
||
|
||
Node 24, pnpm 12, Docker. Konventionen und Befehle: [`CLAUDE.md`](CLAUDE.md).
|
||
|
||
```bash
|
||
pnpm install
|
||
pnpm db:up && pnpm db:migrate && pnpm db:seed
|
||
pnpm test:ziele:up # SSH-Testziele + Mock-OIDC
|
||
pnpm build && pnpm start # http://localhost:3400
|
||
pnpm worker # zweites Terminal
|
||
pnpm test && pnpm test:integration && pnpm test:e2e
|
||
```
|