Skip to content

Commit 87ade6d

Browse files
Add incident timeline audit events
1 parent da47b5e commit 87ade6d

7 files changed

Lines changed: 835 additions & 37 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ Das Backend stellt serverseitige Weboberflaechen und APIs fuer die migrierten Pr
9595
- `/cves/`
9696
- `/admin/users/`
9797

98-
Incidents werden als Rust-Fallakten unter `/incidents/` gefuehrt. Detailseiten unter `/incidents/{id}` erlauben die Bearbeitung von Typ, Runbook, Status, Severity, Meldezeitpunkten und Behoerdenreferenz; verknuepfte Evidence wird direkt in der Fallakte angezeigt und kann dort hochgeladen werden. Das NIS2-Meldepaket kann als Markdown, HTML oder PDF ueber `/incidents/{id}/nis2-export`, `/incidents/{id}/nis2-export.html`, `/incidents/{id}/nis2-export.pdf` sowie die entsprechenden `/api/v1/incidents/{id}/...` Endpunkte exportiert werden.
98+
Incidents werden als Rust-Fallakten unter `/incidents/` gefuehrt. Detailseiten unter `/incidents/{id}` erlauben die Bearbeitung von Typ, Runbook, Status, Severity, Meldezeitpunkten und Behoerdenreferenz; Statuswechsel, Anlage und incidentbezogene Evidence-Uploads werden als Timeline-/Audit-Events in der Fallakte dokumentiert. Verknuepfte Evidence wird direkt in der Fallakte angezeigt und kann dort hochgeladen werden. Das NIS2-Meldepaket kann als Markdown, HTML oder PDF ueber `/incidents/{id}/nis2-export`, `/incidents/{id}/nis2-export.html`, `/incidents/{id}/nis2-export.pdf` sowie die entsprechenden `/api/v1/incidents/{id}/...` Endpunkte exportiert werden.
9999

100100
## Zero-Trust Agent
101101

docs/ISCY_Handbuch.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,7 @@ Wenn ein Incident als NIS2-meldepflichtig markiert wird, berechnet ISCY die rele
561561

562562
Die Uebersicht zeigt offene Faelle, NIS2-relevante Faelle und ueberfaellige Meldeschritte. Gesendete Meldungen koennen ueber die API als Zeitstempel gepflegt werden.
563563

564-
Die Detailseite `/incidents/{id}` dient als operative Fallakte. Dort koennen berechtigte Rollen Typ, Runbook, Status, Severity, Behoerdenreferenz, Zeitlinie und Meldezeitpunkte pflegen. Evidence-Uploads koennen ueber `incident_id` direkt an einen Incident gekoppelt werden und erscheinen in der Fallakte; fuer berechtigte Rollen steht der Upload direkt auf der Incident-Detailseite bereit. Das Meldepaket unter `/incidents/{id}/nis2-export` buendelt Fallakte, Runbook, verknuepfte Evidence, betroffene Bezuege, 24h-/72h-/30-Tage-Fristen, Stakeholder-Zusammenfassung und Lessons Learned; zusaetzlich stehen HTML und PDF ueber `/incidents/{id}/nis2-export.html` und `/incidents/{id}/nis2-export.pdf` bereit.
564+
Die Detailseite `/incidents/{id}` dient als operative Fallakte. Dort koennen berechtigte Rollen Typ, Runbook, Status, Severity, Behoerdenreferenz, Zeitlinie und Meldezeitpunkte pflegen. ISCY dokumentiert die Anlage der Fallakte, Statuswechsel und incidentbezogene Evidence-Uploads als Timeline-/Audit-Events mit Actor, Zeitpunkt, Ereignisart und Detailtext. Evidence-Uploads koennen ueber `incident_id` direkt an einen Incident gekoppelt werden und erscheinen in der Fallakte; fuer berechtigte Rollen steht der Upload direkt auf der Incident-Detailseite bereit. Das Meldepaket unter `/incidents/{id}/nis2-export` buendelt Fallakte, Runbook, verknuepfte Evidence, betroffene Bezuege, 24h-/72h-/30-Tage-Fristen, Stakeholder-Zusammenfassung und Lessons Learned; zusaetzlich stehen HTML und PDF ueber `/incidents/{id}/nis2-export.html` und `/incidents/{id}/nis2-export.pdf` bereit.
565565

566566
### 6.6 SOC-Playbook fuer Phishing- und aehnliche Incident-Faelle
567567

docs/RUST_CUTOVER_STATUS.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ ISCY startet produktiv und lokal ueber den Rust-Axum-Service in `rust/iscy-backe
2424
- Assessments
2525
- Organizations
2626
- Risks
27-
- Incidents inklusive NIS2-Meldefristen, Fallakten, Detailbearbeitung, Runbooks und Markdown-/HTML-/PDF-Meldepaket
28-
- Evidence inklusive Upload, Incident-Verknuepfung und direktem Fallakten-Upload
27+
- Incidents inklusive NIS2-Meldefristen, Fallakten, Detailbearbeitung, Runbooks, Timeline-/Audit-Events und Markdown-/HTML-/PDF-Meldepaket
28+
- Evidence inklusive Upload, Incident-Verknuepfung, direktem Fallakten-Upload und automatischem Timeline-Ereignis
2929
- Reports
3030
- Roadmap
3131
- Assets

rust/iscy-backend/src/db_admin.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ const MIGRATIONS: &[Migration] = &[
8282
sqlite_sql: SQLITE_INCIDENT_RUNBOOK_EVIDENCE_EXPORT_SCHEMA,
8383
postgres_sql: POSTGRES_INCIDENT_RUNBOOK_EVIDENCE_EXPORT_SCHEMA,
8484
},
85+
Migration {
86+
version: "0011_rust_incident_timeline",
87+
sqlite_sql: SQLITE_INCIDENT_TIMELINE_SCHEMA,
88+
postgres_sql: POSTGRES_INCIDENT_TIMELINE_SCHEMA,
89+
},
8590
];
8691

8792
const SQLITE_CATALOG_REQUIREMENTS_SEED: &str =
@@ -432,6 +437,42 @@ SET runbook_template = '1. Scope erfassen; 2. Eindaemmung durchfuehren; 3. Kommu
432437
WHERE runbook_template = '';
433438
"#;
434439

440+
const SQLITE_INCIDENT_TIMELINE_SCHEMA: &str = r#"
441+
CREATE TABLE IF NOT EXISTS incidents_incidentevent (
442+
id INTEGER PRIMARY KEY AUTOINCREMENT,
443+
tenant_id INTEGER NOT NULL,
444+
incident_id INTEGER NOT NULL,
445+
actor_id INTEGER NULL,
446+
event_type varchar(32) NOT NULL,
447+
summary varchar(255) NOT NULL,
448+
detail TEXT NOT NULL DEFAULT '',
449+
from_status varchar(32) NULL,
450+
to_status varchar(32) NULL,
451+
evidence_item_id INTEGER NULL,
452+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
453+
);
454+
CREATE INDEX IF NOT EXISTS idx_incident_events_incident ON incidents_incidentevent(tenant_id, incident_id, created_at);
455+
CREATE INDEX IF NOT EXISTS idx_incident_events_actor ON incidents_incidentevent(tenant_id, actor_id);
456+
"#;
457+
458+
const POSTGRES_INCIDENT_TIMELINE_SCHEMA: &str = r#"
459+
CREATE TABLE IF NOT EXISTS incidents_incidentevent (
460+
id BIGSERIAL PRIMARY KEY,
461+
tenant_id BIGINT NOT NULL,
462+
incident_id BIGINT NOT NULL,
463+
actor_id BIGINT NULL,
464+
event_type varchar(32) NOT NULL,
465+
summary varchar(255) NOT NULL,
466+
detail TEXT NOT NULL DEFAULT '',
467+
from_status varchar(32) NULL,
468+
to_status varchar(32) NULL,
469+
evidence_item_id BIGINT NULL,
470+
created_at TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP)::text
471+
);
472+
CREATE INDEX IF NOT EXISTS idx_incident_events_incident ON incidents_incidentevent(tenant_id, incident_id, created_at);
473+
CREATE INDEX IF NOT EXISTS idx_incident_events_actor ON incidents_incidentevent(tenant_id, actor_id);
474+
"#;
475+
435476
const SQLITE_AUTH_RBAC_SCHEMA: &str = r#"
436477
CREATE TABLE IF NOT EXISTS accounts_role (
437478
id INTEGER PRIMARY KEY AUTOINCREMENT,

0 commit comments

Comments
 (0)