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

11 KiB
Raw Permalink Blame History

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

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.
  • 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):
    • 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)

(Ende Erweiterung)