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-scoped LastSeenAt-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=true kö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/ready prü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.

Alle Kapitel