Sicherheitsmodell
NodePilot aktiviert Sicherheitsprüfungen standardmäßig. appsettings.Development.json lockert ausgewählte Prüfungen ausschließlich für die lokale Entwicklung.
Auth & Session
- Serverseitige Sessions: standardmäßig acht Stunden absolute Lebensdauer, einzeln widerrufbar. JWTs tragen Session-ID, Security-Stamp und
jti; Gruppen bleiben aus JWT und Cookie heraus. - Lokale BCrypt-Passwörter: Produktionsdefault
BreakGlassOnly; nur explizit markierte Notfallkonten dürfen sich lokal anmelden. - Passwortlänge pro Pfad: Lokale Konten enden bei 72 UTF-8 Byte (BCrypt schneidet darüber hinaus stillschweigend ab). Directory-Passwörter regelt das Directory: NodePilot kürzt sie nie und weist einen Login-Payload erst jenseits von 256 Byte ab — dem AD-Maximum. Eine lange AD-Passphrase erreicht damit immer den Bind.
- Externe Pfade: LDAP ausschließlich über validiertes LDAPS, Windows Negotiate ausschließlich Kerberos sowie release-gated OIDC Authorization Code + PKCE. Windows lädt bei jedem Login einen autoritativen LDAPS-Snapshot und vertraut keinen PAC-Gruppen.
- Kanonische Identität:
(Authority, Subject); LDAP und Windows teilen sich den AD-objectSid, OIDC verwendet(iss, sub). Gleichnamige bestehende Benutzer werden nicht automatisch zusammengeführt. - Serverseitige Autorisierung: Gruppen-Memberships kommen aus Directory-Snapshots. AD-Sync läuft standardmäßig alle fünf Minuten mit 16 parallelen LDAPS-Lookups (konfigurierbar 1–32); Snapshots über 15 Minuten werden für Sessions, Jobs und Trigger abgewiesen.
- OIDC-Freshness: Token-Gruppen brauchen ein höchstens 15 Minuten altes
iat. SCIM-Overage-Memberships brauchen authority-scopedLastSeenAt-Werte im selben Fenster; Login oder User-PUT verlängern sie nicht. - Offboarding: Deaktivierung oder Tombstone widerruft Sessions. Eine lokal durch einen Admin gesetzte Deaktivierung ist sticky; AD und SCIM
active=truekönnen sie nicht überschreiben. - HA+OIDC: Correlation, Nonce und Tickets benötigen einen gemeinsamen persistenten Data-Protection-Keyring, ein gemeinsames Zertifikat mit Private Key und
DataProtection:SharedKeyRing=true. - Health:
/healthz/readyprüft bewusst nur die DB. Der Directory-Zustand liegt separat unter/healthz/directory, damit ein DC-Ausfall den Break-Glass-Pfad nicht aus dem Load Balancer entfernt. - SignalR-Auth: httpOnly
np_auth-Cookie beim WebSocket-Upgrade (nur/hubs/); kein?access_token=-Querystring.
Status und Betriebsvorgaben: AD SSO Preview. OIDC/SCIM haben ein separates Release-Gate; SAML ist out of scope.
Authorization
Rollen Admin / Operator / Viewer. Siehe Authentifizierung & Rollen. Folder-RBAC (Stage A) addiert pro-Folder-Rollen — siehe Folder-RBAC.
Output-Redaction
OutputRedactor maskiert Secrets. Immer aktiv. Custom-Patterns via Logging:Redaction:Patterns; ein Pattern, das kein gültiger regulärer Ausdruck ist, verhindert den Start des Dienstes, statt übersprungen zu werden.
Localhost-Bypass
Ohne Credentials läuft runScript in-process — unter der Dienstidentität der API (gMSA, bzw. NT AUTHORITY\SYSTEM bei LocalSystem). Produkt-Feature, kein Guard einziehen. Welches Konto welchen Pfad trägt: Remote-Execution.
Security-Headers (Non-Dev)
HSTS, CSP, X-Frame-Options=DENY, nosniff, Referrer-Policy.
External Trigger
Gated via X-Api-Key; Schlüssel werden als SHA-256-Hash mit GUID-basierter Workflow-Allowlist konfiguriert. Der Zielworkflow muss zusätzlich einen aktiven manualTrigger enthalten. Der Legacy-Key ist ohne explizite AllowedWorkflowIds-Liste wirkungslos. Die höchste deklarierte Keys-Map ersetzt niedrigere Provider vollständig ({} widerruft alle Keys), Scope-Listen ebenso ([] = deny-all). Idempotency-Replays sind pro authentifiziertem Key-Principal isoliert und persistieren keinen rohen Headerwert.
Rate-Limiting
Per-IP, Sliding-Window — siehe Authentifizierung.
REST-API-Proxy
RestApi:Proxy:Enabled (default false). Per-Step-Override via proxyMode (default/direct/custom).
LLM-Proxy
Llm:Proxy:Mode (default Off) — getrennt vom REST-API-Proxy, weil AI-Verkehr und
Workflow-Verkehr in Unternehmensnetzen unterschiedlich behandelt werden. System übernimmt den
Proxy des Dienstkontos, Custom eine eigene Adresse mit Ausnahmeliste. Läuft der Verkehr über
einen Proxy, löst dieser die Zieladresse auf — die Prüfung unmittelbar vor dem Verbindungsaufbau
greift dann nur noch für den Proxy selbst, die Base-URL wird weiterhin beim Speichern und beim
Start geprüft. Details: AI-Funktionen.
Hardening-Flags
Die vollständige Liste der Guard-Flags mit Defaults: Hardening-Flags.
Audit-Log
IAuditWriter injizieren, await _audit.LogAsync(AuditActions.WorkflowPublished, "Workflow", resourceId, detailsJson, ct) nach SaveChanges — Codes immer als Konstante aus NodePilot.Core.Audit.AuditActions, nie als rohes String-Literal (Guard-Test AuditActionsCatalogTests erzwingt das). Schreibfehler darf die Mutation nie abbrechen. Passwörter/Secrets nie in Details. Admin-only, Cursor-Pagination, Export CSV/NDJSON. Details: Audit-Log.
Secrets
Credentials und secret-flagged Globals werden at-rest verschlüsselt via ISecretProtector (DPAPI default, AES-GCM cluster-portable). Details: Secret-Provider.