feat(server): Proxmox-Server verwalten mit Fingerprint-Pinning

Server lassen sich anlegen, prüfen, bearbeiten und löschen. Proxmox
liefert ab Werk ein selbst signiertes Zertifikat; der Admin sieht es
vor dem Speichern und bestätigt den SHA-256-Fingerprint.

Der Pin wird in einem eigenen undici-Connector geprüft, sodass eine
fremde Gegenstelle das Token nie zu sehen bekommt. Weder Prüfung noch
Pin ist im Schema, im Client und per CHECK ausgeschlossen.

Fehler von Proxmox werden zu Ursache und Hinweis; bei 403 nennt der
Hinweis das fehlende Recht samt Pfad. Getestet gegen einen HTTPS-Mock
und im gebauten Stand auf Desktop und 390 px.

Closes #002

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 09:35:10 +02:00
co-authored by Claude Opus 5.5
parent 871bb3a77c
commit 48e2a5cb8f
43 changed files with 2847 additions and 39 deletions
+17 -11
View File
@@ -1,26 +1,32 @@
# #002 Server-Verwaltung und Verschlüsselung
**Status:** offen
**Status:** erledigt
**Meilenstein:** v0.1.0
**Labels:** feature, sicherheit
**Geschätzt:** 6 h **Tatsächlich:** –
**Geschätzt:** 6 h **Tatsächlich:** 0 h 11 min
## Ziel
Proxmox-Server anlegen, bearbeiten, löschen; Geheimnisse verschlüsselt.
## Aufgaben
- [ ] AES-256-GCM-Helfer mit Versionspräfix, Tests (falscher Schlüssel, manipulierte Daten)
- [ ] Modell `Server`, Services, REST `/api/v1/server`, Formular mit Token-ID/Secret
- [ ] TLS: Fingerprint holen (`POST /server/pruefen`), anzeigen, bestätigen, pinnen
- [ ] Proxmox-Client mit undici-Agent und Fingerprint-Vergleich, UPID-Warten
- [ ] SSH optional: Schlüsselpaar erzeugen, Einzeiler anzeigen, Host-Key pinnen
- [ ] Protokolleintrag je Änderung
- [x] AES-256-GCM-Helfer mit Versionspräfix, Tests (falscher Schlüssel, manipulierte Daten) – mit #001
- [x] Modell `Server`, Services, REST `/api/v1/server`, Formular mit Token-ID/Secret
- [x] TLS: Fingerprint holen (`POST /server/pruefen`), anzeigen, bestätigen, pinnen
- [x] Proxmox-Client mit undici-Agent und Fingerprint-Vergleich, UPID-Warten
- [x] SSH optional: Schlüsselpaar erzeugen, Einzeiler anzeigen (Host-Key-Pin folgt mit dem SSH-Test in #003)
- [x] Protokolleintrag je Änderung (geänderte Felder, nie Werte von Geheimnissen)
- [x] Server-Umschalter in der Seitenleiste, Serverliste auf der Übersicht
## Akzeptanzkriterien
- [ ] Secret erscheint nie in API-Antworten oder Logs
- [ ] Falscher Fingerprint → klare Fehlermeldung, keine Verbindung
- [x] Secret erscheint nie in API-Antworten, Protokoll oder Logs (Test)
- [x] Falscher Fingerprint → klare Fehlermeldung, Verbindung getrennt **bevor** das Token gesendet wird (Test)
- [x] Playwright: Anlegen gegen Proxmox-Mock mit selbst signiertem Zertifikat, Desktop und 390 px
## Abhängigkeiten
#001
## Notizen / Entscheidungen
–
- **TLS-Sitzungs-Cache aus:** eine wiederaufgenommene TLS-Sitzung schickt kein Zertifikat, der Pin wäre nicht prüfbar.
- **„Weder TLS-Prüfung noch Pin“ ist unmöglich** – im Schema, im Client und als CHECK in der Datenbank.
- **Adresse ohne Schema/Port** wird zu `https://host:8006` ergänzt.
- **ssh2 ohne native Beschleuniger** (`allowBuilds: false`): reines JavaScript reicht, kein Compiler im Image.
- Proxmox schreibt Fehlermeldungen in die HTTP-Statuszeile; `Permission check failed (/pfad, Recht)` wird zu einem Hinweis mit Recht und Pfad.
+1 -1
View File
@@ -5,7 +5,7 @@ Details und Architektur: [../architektur.md](../architektur.md). Zeiten werden a
| Nr. | Titel | Status | Meilenstein | Geschätzt | Tatsächlich |
|---|---|---|---|---|---|
| [#001](001-projekt-setup.md) | Projekt-Setup | erledigt | v0.1.0 | 4 h | 0 h 50 min |
| [#002](002-verschluesselung-server.md) | Server-Verwaltung und Verschlüsselung | offen | v0.1.0 | 6 h | – |
| [#002](002-verschluesselung-server.md) | Server-Verwaltung und Verschlüsselung | erledigt | v0.1.0 | 6 h | 0 h 11 min |
| [#003](003-verbindungstest.md) | Verbindungstest und Fähigkeitserkennung | offen | v0.1.0 | 6 h | – |
| [#004](004-katalog.md) | Katalog: Distributionen und Profile als Daten | offen | v0.2.0 | 5 h | – |
| [#005](005-adapter-profile.md) | Adapter debian und Profil-Engine | offen | v0.2.0 | 6 h | – |