Audit-Log
Das Audit-Log speichert sicherheitsrelevante Aktionen. Aktionscodes folgen dem Muster VERB_NOMEN. Passwörter und Secrets dürfen nicht in Audit-Details erscheinen.
Schreiben
IAuditWriter injizieren, dann nach SaveChanges. Audit-Codes werden immer als Konstante aus NodePilot.Core.Audit.AuditActions referenziert — nie als rohes String-Literal am Call-Site (der Guard-Test AuditActionsCatalogTests erzwingt das):
await _audit.LogAsync(AuditActions.WorkflowPublished, "Workflow", resourceId, detailsJson, ct);
Schreibfehler darf eine normale Mutation nie abbrechen. Ausnahme: Beliebiges DB-Admin-Write-SQL läuft fail-closed und wird ohne vorab persistiertes DBADMIN_SQL_WRITE_ATTEMPTED nicht ausgeführt.
Audit-Codes
Der autoritative Katalog lebt in NodePilot.Core.Audit.AuditActions — die Guard-Tests halten ihn vollständig und stale-frei. Codes folgen dem Muster VERB_NOMEN:
| Bereich | Codes |
|---|---|
| Workflow | WORKFLOW_CREATED|UPDATED|DELETED|DUPLICATED|ROLLED_BACK|CANCEL_ALL|STEP_TESTED|ENABLED|DISABLED|CONCURRENCY_LIMIT_CHANGED |
| Edit-Lock | WORKFLOW_LOCKED|UNLOCKED|PUBLISHED|FORCE_UNLOCKED |
| Machine | MACHINE_CREATED|UPDATED|DELETED|CONNECTION_TESTED|CONNECTION_TEST_FAILED |
| Credential | CREDENTIAL_CREATED|UPDATED|DELETED|DECRYPTED|DECRYPT_FAILED |
| Globals | GLOBAL_VARIABLE_CREATED|UPDATED|DELETED|MOVED |
| Global-Variable-Ordner | GLOBAL_VARIABLE_FOLDER_CREATED|UPDATED|MOVED|DELETED |
| Login | LOGIN_SUCCESS|FAILED|LOCKED, BREAK_GLASS_LOGIN_SUCCESS, LOGOUT, TOKEN_REFRESHED, USER_CREATED_BOOTSTRAP |
| User | USER_CREATED|ACTIVATED|DEACTIVATED|DELETED|ROLE_CHANGED|PASSWORD_RESET|BREAK_GLASS_CHANGED |
| AD SSO Preview | USER_{LDAP|WINDOWS}_JIT_CREATED|JIT_UPDATED|REFUSED_COLLISION|REFUSED_BOOTSTRAP|REFUSED_LAST_ADMIN, USER_DIRECTORY_ACCESS_REFUSED|SYNCED|DEPROVISIONED, USER_AUTHORIZATION_STALE |
| OIDC | USER_OIDC_JIT_CREATED (Erstanmeldung legt das Konto an), USER_DIRECTORY_SYNCED mit Quelle Oidc |
| SCIM | USER_SCIM_PROVISIONED|UPDATED|DEPROVISIONED, SCIM_GROUP_PROVISIONED|UPDATED|DEPROVISIONED|REACTIVATED |
| Execution / HA | EXECUTION_STARTED|CANCELLED|RETRIED|RESUMED|STEP_OVER|DEBUG_STOP|RECOVERED_FAILOVER, CLUSTER_LEADERSHIP_ACQUIRED, DATABASE_RECOVERED |
| Maintenance | MAINTENANCE_WINDOW_CREATED|UPDATED|DELETED|OVERRIDDEN, EXECUTION_BLOCKED_MAINTENANCE_WINDOW |
| Trigger | WEBHOOK_TRIGGERED, EXTERNAL_TRIGGER_FIRED, TRIGGER_FIRE_SUPPRESSED |
| Import/Export | WORKFLOW_EXPORTED|EXPORTED_BULK|IMPORTED|IMPORTED_SCORCH, CUSTOM_ACTIVITY_EXPORTED, AUDIT_LOG_EXPORTED, SUPPORT_EVENTS_EXPORTED, SUPPORT_LOG_DOWNLOADED, APP_LOG_DOWNLOADED |
| Folders | FOLDER_CREATED|UPDATED|MOVED|DELETED, WORKFLOW_MOVED, FOLDER_PERMISSION_GRANTED|UPDATED|REVOKED |
| AI | AI_SCRIPT_GENERATED|AI_WORKFLOW_GENERATED|AI_AGENT_TEAM_GENERATED|AI_WORKFLOW_EXPLAINED|AI_PROPOSAL_APPLIED|AI_KNOWLEDGE_ASKED, AGENT_MCP_SERVER_SAVED|DELETED, AGENT_SKILL_IMPORTED|UPDATED|DELETED |
| Alerting | ALERT_RULE_CREATED|UPDATED|DELETED|ENABLED|DISABLED|TEST_FIRED, SYSTEM_ALERT_POLICY_CREATED|UPDATED|DELETED|ENABLED|DISABLED|TEST_FIRED |
| Custom Activities | CUSTOM_ACTIVITY_CREATED|UPDATED|DELETED|ENABLED|DISABLED|IMPORTED|EXPORTED|ROLLED_BACK |
| DB Admin | DBADMIN_ROWS_VIEWED|ROW_UPDATED|ROW_DELETED|SQL_EXECUTED|SQL_WRITE_ATTEMPTED|SQL_WRITE |
| Secrets | SECRETS_REENCRYPTED |
| Backup | BACKUP_EXPORTED|RESTORED|RESTORE_DB_COMMITTED |
| Settings | SETTINGS_{AGENTS|AIKNOWLEDGE|AUTHENTICATION|DBADMIN|ENGINE|EXECUTIONDISPATCH|EXTERNALTRIGGER|FILESYSTEMOPERATION|LLM|LOGGING|OPENTELEMETRY|PERFORMANCE|REMOTE|RESTAPI|RETENTION|SECURITY|SMTP|SQLACTIVITY|STARTPROGRAM|STATS|THREADING|WAITFORCONDITION|WEBHOOK}_UPDATED (ein Code pro Settings-Sektion), SETTINGS_SMTP_TESTED, SETTINGS_LLM_TESTED, SETTINGS_AUTHENTICATION_TESTED, SETTINGS_SERVICE_RESTART_REQUESTED |
Pipeline
Jeder Audit-Write fließt durch IAuditStager (in NodePilot.Core/Audit/). HTTP-Controller nutzen IAuditWriter (NodePilot.Api/Audit/AuditWriter.cs), der den Stager mit HttpContextAccessor-Actor-Auflösung + ECS-Log-Forwarding + Support-Log-Whitelist-Check wrappt. Redaction und 4 KiB-Cap gelten überall einheitlich.
Archive-Integrität
AuditLogRetentionService.ArchiveAsync schreibt gzip-komprimierte audit-{date}-{ticks}-{rand}.ndjson.gz plus SHA-256-Sidecar. Ein periodischer Verify-Pass (default täglich) rechnet Hashes neu und warnt via Metric nodepilot.audit_archive.hash_drift bei Drift.
Zugriff
Admin-only, Cursor-Pagination, Export als CSV/NDJSON (GET /api/audit/export?format=csv|ndjson). Der Export selbst schreibt AUDIT_LOG_EXPORTED mit Filtern und tatsächlicher Zeilenanzahl.
Alarmieren
Die System-Alarm-Quelle Audit-Ereignis (Kategorie Sicherheit auf der Alarme-Seite) macht Audit-Einträge ohne SIEM zu Benachrichtigungen: eine Policy filtert auf den Code (action), das Ergebnis, den Benutzer, die IP-Adresse oder das Details-JSON und stellt per E-Mail oder Webhook zu. Presets decken fehlgeschlagene Logins, Sperrungen, Break-Glass-Anmeldungen und Rechteänderungen ab; der optionale Parameter actions begrenzt den Scan auf bestimmte Codes. Benutzername und IP stehen im Alarmtext und gehen an den konfigurierten Empfänger — siehe Alerting.
SIEM-Forwarding
Bei Logging:Format=ecs-json wird jeder erfolgreiche Audit-Row zusätzlich als strukturiertes ECS-Event über Serilog emittiert — siehe SIEM-Logging.