ITSM/docs/ARCHITEKTUR.md

5.5 KiB
Executable File
Raw Blame History

ITSM — Technische Architektur

Stand: 2026-07-15 (Rust-Rewrite, Version 1.0). Verbindliche Entscheidungen: siehe docs/adr/.

1. Überblick

Mandantenfähige ITSM-Plattform (Tickets, Service-Katalog, Wissensdatenbank, CMDB) als einzelnes Rust-Binary mit PostgreSQL. AES ist ein buchbarer Service im Katalog (HTTP-Integration, kein Code-Import). Repo-Bearbeitung aus Tickets läuft über die Gitea-kompatible Forge-Contents-API.

Browser ──HTTP──► itsm (axum, Port 8090) ──► PostgreSQL 16
                      │
                      ├──► AES-Dashboard (Erreichbarkeits-Check, Katalog)
                      └──► Forge-API (Repo-Edit aus Change-Tickets)

2. Modulstruktur (src/)

Modul Verantwortung
main.rs App-Aufbau, Routing, Retention-Hintergrundtask
config.rs ENV-Konfiguration + Startvalidierung
web.rs AppState, Middleware (Session, CSRF, Client-IP, Security-Header), Fehlertyp, RBAC-Helfer, PageCtx
db.rs Datenzugriff (deadpool/tokio-postgres), alle Queries parametrisiert und tenant-gescoped
security.rs Passwort-Hashing/-Verifikation (Argon2id + Werkzeug pbkdf2/scrypt), Token, Policy, SSRF-Guard
itil.rs ITIL-Logik: Rollen, Statusmodell, Prioritätsmatrix, Change-Gate (reine Funktionen, unit-getestet)
auth.rs Login (Rate-Limit, Rehash-Migration), Logout, Ersteinrichtung
tickets.rs Listen/KPIs/Sparklines, Ticket-API, Statuswechsel, Change-Freigabe, Problem/CI-Links, Repo-Edit, Kanban
services.rs Service-Katalog, paralleler Erreichbarkeits-Check (30 s Cache)
kb.rs Wissensdatenbank inkl. Freigabe-Workflow
cmdb.rs Configuration Items + Beziehungen
admin.rs Mandanten-Einstellungen, Audit-Ansicht, Benutzerverwaltung
dashboard.rs CSI-Kennzahlen (SLA-Erfüllung, MTTR, Verteilungen)
forge.rs Forge-Contents-Client (get/update, Sha-Locking)

Frontend: Askama-Templates (templates/), ein statisches CSS + ein JS (static/), kein Framework, kein Inline-JS (CSP).

3. Request-Fluss

  1. ctx_middleware (web.rs): Session-Cookie → SHA-256 → DB-Lookup (sessions JOIN users/tenants) → AuthUser in Request-Extensions. Client-IP nur aus X-Forwarded-For, wenn ITSM_TRUSTED_PROXY_COUNT > 0.
  2. CSRF: jede zustandsändernde Methode braucht Token aus Session (Formular- Feld _csrf oder Header X-CSRF-Token); Ausnahmen: /login, /setup/new.
  3. Handler: RBAC-Check (need_auth/need_operative/need_admin/ need_change_approver) → Fachlogik → Audit-Log-Eintrag.
  4. Antwort: Security-Header (CSP, nosniff, X-Frame-Options DENY, Referrer- Policy, HSTS bei ITSM_HTTPS=1).

4. Datenmodell (PostgreSQL, schema.sql)

Alle fachlichen Tabellen tragen tenant_id; jede Query filtert darauf.

  • tenants — Mandanten inkl. SLA-Defaults + DSGVO-Retention-Fristen
  • users — global eindeutige E-Mail (Login löst Mandant auf), role (admin/change_manager/agent/user), auth_source ('local', 'ldap' reserviert)
  • tickets — inkl. ITIL-Feldern: impact/urgency (Priorität via Matrix), change_typ/approval_status/approved_by/-_at (Change Enablement), problem_id/known_error (Problem Mgmt), first_response_at/resolved_at/ closed_at (SLA-Zeitstempel)
  • ticket_timeline — Worklog (Status, Kommentare, Repo-Edits: dokumentationspflichtig)
  • ticket_ci_links — Ticket↔CI (SACM)
  • services, kb_articles (mit status Entwurf/Freigegeben), configuration_items + ci_relationships
  • audit_log — alle sicherheitsrelevanten Aktionen (ISO 27001 A.12.4 / DSGVO Art. 30)
  • login_attempts — Rate-Limit-Basis (7 Tage aufbewahrt)
  • sessions — serverseitige Sessions, nur SHA-256-Hash des Cookie-Tokens

Migrationen: idempotenter Block am Ende von schema.sql, wird bei jedem App-Start per include_str! ausgeführt (ADR-005).

5. RBAC-Matrix

Aktion admin change_manager agent user
Eigene Tickets (Incident/Service Request) anlegen/sehen
Alle Tickets sehen/bearbeiten, Status wechseln
Probleme/Änderungen/Releases/Kanban/CMDB
KB lesen alle alle alle nur Freigegeben
KB anlegen/bearbeiten
KB freigeben, Change-Freigabe (CAB)
Repo-Edit aus Ticket (nur umsetzbarer Change)
Services anlegen, Administration, Audit-Log

6. ITIL-Abbildung (v3-Prozesse / v4-Practices)

  • Statusmodell: Offen → In Bearbeitung → Warten → Gelöst → Geschlossen; Reopen Gelöst→Offen; Geschlossen final. Übergänge serverseitig erzwungen.
  • Priorität = Matrix(Impact × Urgency), 3×3 nach v3 SO 4.2.5.4.
  • Change Enablement: Standard (vorautorisiert) / Normal (CAB) / Emergency (sofort, nachträgliche ECAB-Freigabe). Umsetzung + Repo-Edit erst wenn itil::change_may_be_implemented.
  • Problem Management: Incident↔Problem-Verknüpfung, Known-Error-Flag.
  • SLA: Fristen aus Mandanten-Defaults, Zeitstempel bei Statuswechseln, Überfälligkeits- und Restzeit-Berechnung serverseitig.
  • Continual Improvement: /dashboard (SLA-Erfüllung 30 T, MTTR, Verteilungen).

7. Sicherheitsarchitektur

Siehe ADR-002/003/007/008 und README-Abschnitt "Sicherheit". Kurzfassung: serverseitige widerrufbare Sessions, CSRF überall, DB-gestütztes Login-Rate- Limit (E-Mail+IP), Argon2id mit transparenter Migration von Werkzeug-pbkdf2 UND -scrypt (ADR-003!), SSRF-Guard, CSP ohne Inline-JS, Audit-Log.