Files
ansible-webui/entwicklung/architektur.md
2025-11-13 11:52:09 +01:00

149 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Architektur — WebUI für AnsibleTUI
Kurzer Überblick
Dieses Dokument beschreibt die finale Architektur für das MVP WebUI gemäß dem gewählten Profil:
Minimal — extern gepflegte .htpasswd, direkte ansibleplaybookCLI, ZIP/TARUploads, SSHKeys nur abgelegt.
Authentifizierung
- Nur externe .htpasswd zur HTTPBasicAuthentifizierung.
- Die Applikation validiert Anfragen gegen die Webserverauth (keine DBSync, keine interne Benutzerverwaltung).
- Betrieb: Ops pflegt .htpasswd; die Applikation nimmt keine Änderungen an .htpasswd vor.
Executor
- Playbooks werden durch Aufruf der systemweiten ansibleplaybook CLI ausgeführt.
- Kein Einsatz von ansiblerunner oder eines persistenten HintergrundExecutors im MVP.
- Die Applikation erstellt bei Bedarf temporäre Arbeitsverzeichnisse, schreibt erforderliche Metadaten und ruft ansibleplaybook mit den passenden Parametern.
SSHKeyHandling
- SSHKeys werden als Dateien im Dateisystem abgelegt (Uploads oder durch Ops bereitgestellt).
- Die Applikation ändert keine Besitz oder Berechtigungsattribute; Berechtigungsmanagement liegt bei den Betriebsprozessen/Opsteam.
- Keys werden referenziert, aber nicht automatisch verteilt oder in externe Stores synchronisiert.
Netzwerk / Deployment
- Kein integrierter ReverseProxy oder TLS im MVP.
- Container/Service horcht direkt auf Port 8000 (HTTP).
- TLS, ReverseProxy oder Ingress werden von der ZielBetriebsumgebung bereitgestellt und in späteren Releases integriert.
Uploads / Artefakte
- Unterstützte Uploads: ZIP und TAR. Eingangsprüfung auf erlaubte Dateitypen und Größenlimits.
- Entpackung erfolgt in sicheren, temporären Verzeichnissen; keine automatische Ausführung von hochgeladenem Code außer kontrollierten AnsiblePlaybooks.
Persistenz / Datenbank
- Minimales MVP vermeidet eigene BenutzerDB. Falls Metadaten nötig sind, begrenzt auf leichtgewichtige lokale Speicherung (z. B. SQLite).
- Keine Speicherung sensitiver Geheimnisse in der ApplikationsDB; Secrets verbleiben unter OpsVerwaltung.
Sicherheitshinweise
- Ops ist verantwortlich für sichere Aufbewahrung und Rollout von .htpasswd und SSHKeys.
- Applikationslogs vermeiden sensitive Inhalte; PlaybookOutputs können ggf. redigiert werden.
Offene Fragen
- Keine offenen Fragen — alle Entscheidungen sind gemäß dem MinimalProfil finalisiert.
## Erweiterung: Automatisches HostOnboarding (FeatureSpec)
Zweck
- Erlaubt automatisches Onboarding neuer Zielhosts mit wählbaren Optionen:
1. ProHost SSHKey: serverseitig erzeugtes Schlüsselpaar (Ed25519, Fallback RSA4096).
2. Login per Username + temporärem Passwort (Sudofähiger Account) für initiale Berechtigungsaufgaben.
3. Passwort wird nur einmalig verwendet und danach unverzüglich verworfen.
Kontext / Referenzen
- Diese Erweiterung baut auf bestehender Architektur auf; siehe Hauptdokumentation und APIListe: [`webapp/entwicklung/api_endpoints.md`](webapp/entwicklung/api_endpoints.md:1), DBSchema: [`webapp/entwicklung/schema.sql`](webapp/entwicklung/schema.sql:1) und Roadmap: [`webapp/entwicklung/roadmap.md`](webapp/entwicklung/roadmap.md:1).
DesignPrinzipien (Policy: Strict OpsFirst)
- Schlüssel: Ed25519 wird erzeugt. Falls Client/Host Ed25519 nicht unterstützt, Fallback RSA4096.
- HostFingerprint: strikt — Fingerprint muss mit Ops' known_hosts übereinstimmen oder vorab durch Ops manuell freigegeben werden. Abweichende Fingerprints erzeugen eine OnboardingSperre (OpsReview).
- Privater Schlüssel: niemals persistent auf Datenträger; nur im RAM des OnboardingJobs verfügbar, nur für die Dauer des Jobs.
- Passwort: nur im RAM gehalten; nach erfolgreichem Onboarding sofort unwiederbringlich verworfen. Bei Fehlern sind maximal 3 unmittelbare Retries erlaubt, danach OpsIntervention.
- Audit: nur Metadaten (username, host, fingerprintSHA256, event=start|success|fail, timestamp, operator_id bei manueller Freigabe). Keine Passwörter oder PrivateKeyMaterial in Logs oder DB. AuditRetention: 365 Tage.
Komponenten (Erweiterung)
- Onboarding UI (neues Formular, siehe APIMapping).
- Onboarding API (neue Endpoints; Auth via HTTPBasic/REMOTE_USER).
- Onboarding Service / Job Runner (zuständig für Erzeugung Key, SSHVerbindung, sudoAufgaben, KeyCopy).
- Ops Approval Queue (falls HostFingerprint nicht bekannt).
- DB Erweiterungen (HostsTabelle, OnboardJobs, KeyReferenzen, ephemeral markers) — siehe vorgeschlagene SchemaÄnderungen in [`webapp/entwicklung/schema.sql`](webapp/entwicklung/schema.sql:1).
- AuditSubsystem: schreibt streng limitierte Events in audit_logs mit Tagging.
Prozessablauf (HighLevel)
- UI: Benutzer öffnet "Host Onboarding" Formular und gibt ein: hostname/ip, ssh_port (optional), username (für initiales PasswortLogin), temporäres Passwort (nur wenn Option 2 gewählt), gewünschter ZielBenutzername (z. B. ansible user) und evtl. Beschreibung.
- API: POST /onboard/requests erzeugt OnboardRequest, validiert Felder, erstellt OnboardJob und antwortet mit job_id.
- PreChecks: Onboarding Service prüft Erreichbarkeit (TCP), prüft HostFingerprint gegen Ops known_hosts.
- Falls Fingerprint unbekannt/abweichend: Job wird in OpsApprovalQueue gestellt; API gibt status=awaiting_approval zurück.
- Falls Fingerprint OK: Fortsetzung.
- Key Generation: Service erzeugt temporäres Schlüsselpaar (Ed25519 oder RSA4096); privater Schlüssel bleibt nur inmemory.
- SSH Login: Service stellt SSHSitzung mit provided username+password auf. Die LoginPhase verwendet sichere inmemory Credentials; Zeitüberschreitung/Fehler führen zu Retry (max 3).
- Privilegien: Service führt via sudo (password prompted, onetime use) die notwendigen Befehle aus (Erstellen Zieluser, setfacl/chown, Erstellen ~/.ssh, Deploy public key).
- KeyCopy: öffentlicher Schlüssel wird in das target user's authorized_keys geschrieben; Dateirechte gesetzt.
- Verifizieren: Service versucht Login per SSHKey (key auth) und optional überprüft sudoAusführung ohne Passwort (wenn operator gewünscht).
- Abschluss: Bei Erfolg markiert Job als completed, privater Schlüssel wird verworfen, OnboardResult in DB/Audit geschrieben. Bei Fehlern: bis 3 Retries, danach markiert als failed und Ops benachrichtigt.
- Cleanup: temporäre Verzeichnisse/Handles werden gelöscht, keine sensible Persistenz.
Mermaid: Ablaufdiagramm (vereinfachte Darstellung)
```
graph TB
UI[User nutzt OnboardingFormular]
API[POST /onboard/requests]
JOB[Onboarding Service: Job erstellt]
PRECHK[PreChecks: TCP + Fingerprint vs Ops known_hosts]
APPROVE[Ops Approval Queue]
KEYGEN[KeyErzeugung: Ed25519 / RSA4096]
SSHLOGIN[SSH Login mit User+Passwort (RAM)]
SUDO[SudoAufgaben: create user, setup ~/.ssh, copy pubkey]
VERIFY[Verify key auth]
SUCCESS[Onboarding success -> Audit + DB]
FAIL[Onboarding failed -> Audit + Ops Benachrichtigung]
UI --> API --> JOB --> PRECHK
PRECHK -- match --> KEYGEN --> SSHLOGIN --> SUDO --> VERIFY --> SUCCESS
PRECHK -- mismatch --> APPROVE --> JOB
VERIFY -- ok --> SUCCESS
VERIFY -- nok --> FAIL
```
Schnittstellen / Integration (Kurz)
- Neue API Endpoints (voll spezifiziert in [`webapp/entwicklung/api_endpoints.md`](webapp/entwicklung/api_endpoints.md:1)):
- POST /onboard/requests — erstellt OnboardingRequest, Payload enthält host, port, username, password (nur intransit), desired_user, options (generate_key: true/false), description.
- GET /onboard/requests/{id}/status — Jobstatus, ops approval indicator.
- POST /onboard/requests/{id}/approve — Ops endpoint zum Freigeben eines Fingerprints (Auth: REMOTE_USER muss Ops sein).
- GET /onboard/keys — listet public keys erzeugt (readonly metadata).
- GET /onboard/jobs — Liste der Onboarding Jobs (nur Metadaten).
- Sicherheit: Passwords ONLY accepted via HTTPS (Ops deployment requirement). App muss niemals persistieren Passwörter; API akzeptiert Passwort im Request Body, Job Runner liest ihn und löscht danach.
DBÄnderungen (high level; detail in schema.sql)
- Neue Tabelle hosts:
- id, hostname/ip, primary_key_id (FK), fingerprint_sha256, onboarded_at, onboarded_by, status (pending/awaiting_approval/onboarded/failed), created_at
- Neue Tabelle onboard_jobs:
- id, host_id, requested_by, desired_user, options_json, retries, status, started_at, finished_at, error_message
- ssh_keys erweitert / referenziert (public key metadata only; private key never stored)
- audit_logs Nutzung: nur Metadaten (wie oben)
Sicherheits und AuditAspekte (Details)
- PasswortHandling:
- Password im APIRequest wird unmittelbar dem Job übergeben und nur im RAM gehalten.
- Nach Jobabschluss oder nach Fehlern/Timeouts wird der Speicher unverzüglich ohne Swap/Logging freigegeben.
- Implementationshinweis: nutze sichere SpeicherAPIs (mmap mit mlock wenn möglich) oder HostMechanismen, um Swapping zu verhindern.
- Private Key Handling:
- Erzeugung im JobProzess oder in isolierter Secure Enclave; privater Key nie auf Disk.
- Wenn OpsReview/Transfer erforderlich, Key kann kurzfristig (maximal JobDauer) in verschlüsseltem ProzessSpeicher gehalten werden; standardmäßig verboten.
- Fingerprint Handling:
- Vergleich gegen Ops known_hosts (Ops liefert Pfad oder API für known_hostsHash).
- Bei Mismatch: keine automatische Akzeptanz; OpsApproval erforderlich.
- Auditing:
- Erfasste Felder: event_type, job_id, host, fingerprint_sha256, requested_by, operator_id (bei approval), short status message, timestamp.
- Keine Speicherung sensibler Inhalte (kein Passwort, kein privater Key).
- AuditRetention: 365 Tage; älterer Einträge werden anonymisiert oder gelöscht gemäß OpsPolicy.
- LogSanitization:
- Playbook/SSH Outputs werden auf sensitive Patterns geprüft/redigiert bevor sie persistiert oder angezeigt werden.
Betriebsverantwortung / OpsAufgaben
- Ops liefert trusted known_hosts repository oder APIEndpoint zur FingerprintPrüfung.
- Ops sorgt für TransportTLS und sichere DeploymentKonfiguration (no plaintext HTTP in Prod).
- Ops prüft und genehmigt HostFingerprints in ApprovalQueue.
- Ops führt periodische Reviews/KeyRotation durch (nicht automatisch durch App).
Nächste Schritte (Dokumentation)
- APISpecs aktualisieren: [`webapp/entwicklung/api_endpoints.md`](webapp/entwicklung/api_endpoints.md:1)
- SchemaÄnderungen in: [`webapp/entwicklung/schema.sql`](webapp/entwicklung/schema.sql:1)
- Roadmap: neue Phase "Onboarding" mit Aufwandsschätzung und Meilensteine: [`webapp/entwicklung/roadmap.md`](webapp/entwicklung/roadmap.md:1)
(Ende Erweiterung)