5.5 KiB
Executable File
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
ctx_middleware(web.rs): Session-Cookie → SHA-256 → DB-Lookup (sessionsJOINusers/tenants) →AuthUserin Request-Extensions. Client-IP nur aus X-Forwarded-For, wennITSM_TRUSTED_PROXY_COUNT > 0.- CSRF: jede zustandsändernde Methode braucht Token aus Session (Formular-
Feld
_csrfoder HeaderX-CSRF-Token); Ausnahmen:/login,/setup/new. - Handler: RBAC-Check (
need_auth/need_operative/need_admin/need_change_approver) → Fachlogik → Audit-Log-Eintrag. - 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-Fristenusers— 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(mitstatusEntwurf/Freigegeben),configuration_items+ci_relationshipsaudit_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.