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:

BereichCodes
WorkflowWORKFLOW_CREATED|UPDATED|DELETED|DUPLICATED|ROLLED_BACK|CANCEL_ALL|STEP_TESTED|ENABLED|DISABLED|CONCURRENCY_LIMIT_CHANGED
Edit-LockWORKFLOW_LOCKED|UNLOCKED|PUBLISHED|FORCE_UNLOCKED
MachineMACHINE_CREATED|UPDATED|DELETED|CONNECTION_TESTED|CONNECTION_TEST_FAILED
CredentialCREDENTIAL_CREATED|UPDATED|DELETED|DECRYPTED|DECRYPT_FAILED
GlobalsGLOBAL_VARIABLE_CREATED|UPDATED|DELETED|MOVED
Global-Variable-OrdnerGLOBAL_VARIABLE_FOLDER_CREATED|UPDATED|MOVED|DELETED
LoginLOGIN_SUCCESS|FAILED|LOCKED, BREAK_GLASS_LOGIN_SUCCESS, LOGOUT, TOKEN_REFRESHED, USER_CREATED_BOOTSTRAP
UserUSER_CREATED|ACTIVATED|DEACTIVATED|DELETED|ROLE_CHANGED|PASSWORD_RESET|BREAK_GLASS_CHANGED
AD SSO PreviewUSER_{LDAP|WINDOWS}_JIT_CREATED|JIT_UPDATED|REFUSED_COLLISION|REFUSED_BOOTSTRAP|REFUSED_LAST_ADMIN, USER_DIRECTORY_ACCESS_REFUSED|SYNCED|DEPROVISIONED, USER_AUTHORIZATION_STALE
OIDCUSER_OIDC_JIT_CREATED (Erstanmeldung legt das Konto an), USER_DIRECTORY_SYNCED mit Quelle Oidc
SCIMUSER_SCIM_PROVISIONED|UPDATED|DEPROVISIONED, SCIM_GROUP_PROVISIONED|UPDATED|DEPROVISIONED|REACTIVATED
Execution / HAEXECUTION_STARTED|CANCELLED|RETRIED|RESUMED|STEP_OVER|DEBUG_STOP|RECOVERED_FAILOVER, CLUSTER_LEADERSHIP_ACQUIRED, DATABASE_RECOVERED
MaintenanceMAINTENANCE_WINDOW_CREATED|UPDATED|DELETED|OVERRIDDEN, EXECUTION_BLOCKED_MAINTENANCE_WINDOW
TriggerWEBHOOK_TRIGGERED, EXTERNAL_TRIGGER_FIRED, TRIGGER_FIRE_SUPPRESSED
Import/ExportWORKFLOW_EXPORTED|EXPORTED_BULK|IMPORTED|IMPORTED_SCORCH, CUSTOM_ACTIVITY_EXPORTED, AUDIT_LOG_EXPORTED, SUPPORT_EVENTS_EXPORTED, SUPPORT_LOG_DOWNLOADED, APP_LOG_DOWNLOADED
FoldersFOLDER_CREATED|UPDATED|MOVED|DELETED, WORKFLOW_MOVED, FOLDER_PERMISSION_GRANTED|UPDATED|REVOKED
AIAI_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
AlertingALERT_RULE_CREATED|UPDATED|DELETED|ENABLED|DISABLED|TEST_FIRED, SYSTEM_ALERT_POLICY_CREATED|UPDATED|DELETED|ENABLED|DISABLED|TEST_FIRED
Custom ActivitiesCUSTOM_ACTIVITY_CREATED|UPDATED|DELETED|ENABLED|DISABLED|IMPORTED|EXPORTED|ROLLED_BACK
DB AdminDBADMIN_ROWS_VIEWED|ROW_UPDATED|ROW_DELETED|SQL_EXECUTED|SQL_WRITE_ATTEMPTED|SQL_WRITE
SecretsSECRETS_REENCRYPTED
BackupBACKUP_EXPORTED|RESTORED|RESTORE_DB_COMMITTED
SettingsSETTINGS_{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.

Alle Kapitel