Zum Hauptinhalt springen

Cockpit-Konfiguration

Das Cockpit wird vollständig über Umgebungsvariablen konfiguriert, die einmal beim Start gelesen werden (eine .env-Datei wird für den lokalen Einsatz unterstützt). On-Premise werden diese Variablen aus OpenBao über den External Secrets Operator aufgelöst und als Umgebungsvariablen in den Pod injiziert — sie werden nie in das Image eingebrannt und nie in Git committet.

Niemals echte Secrets committen

Alle hier gezeigten Werte sind Platzhalter. Secrets (Datenbank-DSNs, Signier- und Verschlüsselungsschlüssel, Client-Secrets, Tokens) dürfen niemals fest kodiert oder in Git committet werden — speichern Sie sie in Ihrer Secret-Engine und injizieren Sie sie beim Deployment. Siehe Secrets-Bezug und Secret-Manager-Integration.

Secrets-Bezug​

On-Premise wird die umgebungsspezifische Konfiguration in OpenBao gehalten und beim Deployment materialisiert, sodass Secret-Werte nur in Ihrer Secret-Engine liegen.

  1. Der vollständige, umgebungsspezifische Variablensatz (mit echten Secret-Werten) wird in OpenBao gespeichert.
  2. Beim Deployment holt ihn der External Secrets Operator ab und materialisiert ein In-Memory-(tmpfs)-Kubernetes-Secret.
  3. Dieses Secret wird dem Cockpit-Pod als Umgebungsvariablen (envFrom) bereitgestellt — nicht als gemountete Datei.
  4. Konfiguration ändern: Wert in OpenBao aktualisieren und neu deployen — nichts wird im Image bearbeitet oder in Git gespeichert.

Umgebungsreferenz​

Produktion verweigert den Start bei schwachen Secrets

Mit RUST_ENV=production verweigert der Server den Start, wenn JWT_SECRET, ENCRYPTION_KEY, HMAC_KEY, WEBAUTHN_RP_ID oder WEBAUTHN_ALLOWED_ORIGINS fehlen/schwach sind oder PWNED_PASSWORDS_ENABLED=false gesetzt ist. Erzeugen Sie starke Zufallswerte und speichern Sie sie in OpenBao — niemals committen.

Server & TLS​

VariableStandardZweck
HOST127.0.0.1Bind-Adresse (im Container 0.0.0.0 setzen)
PORT3000HTTP-Port
TLS_PORT3443HTTPS-Port (0 deaktiviert; Dev-Zertifikate werden automatisch erzeugt)
TLS_CERT_PATH / TLS_KEY_PATH(nicht gesetzt)Pfade zu TLS-Zertifikat / Schlüssel (PEM)
KMIP_TLS_PORT5696KMIP-Listener (OASIS TTLV über TLS); 0 deaktiviert
PUBLIC_BASE_URLhttps://{host}:{tls_port}API-/maschinenseitiger Origin (DKE-Service-URLs, JWKS, ACME/EST)
FRONTEND_BASE_URL(abgeleitet)SPA-/browserseitiger Origin (OIDC-Redirect, E-Mail-Links)
CORS_ORIGINShttp://localhost:5180Erlaubte CORS-Origins (kommagetrennt)

Datenbank & Cache​

VariableStandardZweck
DATABASE_URLpostgres://…/dke_cockpitPostgreSQL-DSN (sslmode=require wird für Nicht-localhost automatisch ergänzt)
REDIS_URLmemorymemory (In-Process) oder redis://host:port — Redis ist bei mehr als einem Replikat erforderlich
Nur PostgreSQL

Das Cockpit verwendet PostgreSQL als einzigen Datenspeicher. Die Schema-Migrationen laufen automatisch beim Start — die Datenbankrolle benötigt beim ersten Start DDL-Rechte; ein separater Migrationsjob ist nicht erforderlich.

Secrets & Krypto (in Produktion erforderlich)​

VariableZweck
JWT_SECRETHS256-JWT-Signierschlüssel (≥ 64 Zeichen)
JWT_SECRET_KID / JWT_SECRETS_PREVIOUSAktuelle Key-ID und historische Schlüssel (Rotation)
ENCRYPTION_KEYAES-256-Schlüssel (32 Byte hex) für Anmeldedaten/Daten im Ruhezustand
HMAC_KEYHMAC-SHA256-Schlüssel (32 Byte hex) für die Integrität des Audit-Protokolls
RUST_ENVproduction aktiviert die strengen Fail-Closed-Prüfungen

Authentifizierung & Passkeys​

VariableStandardZweck
WEBAUTHN_RP_IDlocalhostWebAuthn-Relying-Party-ID (Prod: erforderlich, nicht localhost)
WEBAUTHN_RP_NAMEDKE CockpitAnzeigename im Passkey-Dialog
WEBAUTHN_ALLOWED_ORIGINS(Dev-Liste)Erlaubte Origins (Prod: nur https://, kein localhost)
PWNED_PASSWORDS_ENABLEDtrueHIBP-Prüfung auf kompromittierte Passwörter (Prod: false führt zum Startabbruch)
DKE_ADMIN_PASSWORD(nicht gesetzt)Initiales Admin-Passwort beim ersten Start; wenn nicht gesetzt, wird ein starkes Zufallspasswort erzeugt und einmalig im Start-Log ausgegeben (muss bei der ersten Anmeldung geändert werden)

Externe Identity Provider (Entra ID, Okta, Keycloak, generisches OIDC) werden pro Mandant in der Cockpit-Konsole konfiguriert, nicht über Umgebungsvariablen — siehe Identität & SSO.

DKE 365​

VariableZweck
DKE_BASE_DOMAINDNS-Basis für DKE-Service-URLs — jeder Service ist https://{slug}.{DKE_BASE_DOMAIN} (Wildcard-DNS + TLS erforderlich)
DKE_AUDIENCE_DOMAINJWT-Audience / Azure-AD-Identifier-URI-Apex (fällt auf DKE_BASE_DOMAIN zurück)
DKE_DEFAULT_GRAPH_TENANT_ID / _CLIENT_ID / _CLIENT_SECRETFallback-Microsoft-Graph-App zum automatischen Provisionieren von Azure-AD-Registrierungen
DKE_ALLOW_PERMISSIVE_MODENur Dev/Test — muss in Produktion ungesetzt bleiben
DKE_TENANT_DECRYPT_RPS_MAXEntschlüsselungs-Ratenlimit pro Mandant (Standard 100)

Observability​

VariableStandardZweck
RUST_LOGdke_api=infoLog-Level-Filter
METRICS_ENABLEDfalsePrometheus-Metriken unter GET /metrics bereitstellen
METRICS_BEARER_TOKEN(nicht gesetzt)Bearer-Token zum Schutz von /metrics — erforderlich; in Produktion werden Metriken ohne Token deaktiviert (fail-closed)

Härtung​

VariableStandardZweck
DKE_TRUSTED_PROXY_CIDRS(leer)Nur diese Quell-CIDRs dürfen cf-connecting-ip / cf-ipcountry setzen
DKE_FAIL_CLOSED_AUDITProd=true503 zurückgeben, wenn ein Sicherheits-Audit-Write fehlschlägt
DKE_AUDIT_WORM_PATH(nicht gesetzt)Optionaler Write-Once-(WORM-)Audit-Sink-Pfad

Agent-Binärdateien aus einem lokalen Verzeichnis​

VariableStandardZweck
DKE_SCANNER_AGENT_DIR(nicht gesetzt)Seit 2.0.7. Lokales Verzeichnis, aufgebaut wie ein Release-Bucket (<dir>/<segment>/<filename>). Ist kein Bucket konfiguriert, liefert das Cockpit daraus den Scanner-Agent, den HSM-Agent, die DLL des SQL-Server-EKM-Providers und die PKCS#11-Bibliothek aus. Ein konfigurierter Bucket hat weiterhin Vorrang. Eine fehlende Datei antwortet mit 404 und dem zu befüllenden Pfad, relativ zum Verzeichnis

Im Modus mit lokalem Verzeichnis enthält das Bereitstellungsskript für SQL Server EKM keine Download-URL: Laden Sie die DLL im Browser aus dem Cockpit herunter.

On-prem-Netzwerkziele​

Standardmäßig lehnt das Cockpit jedes Connector-Ziel (Secret Store, Identity Provider, Webhook, Ticketing, Zertifikatsaussteller, SMTP-Relay) ab, das auf eine private Adresse auflöst, damit ein Mandant über einen Connector nicht das Plattformnetzwerk ausspähen kann. On-prem befinden sich diese Systeme normalerweise im privaten Netzwerk des Kunden. Der Betreiber gibt sie über eine Allow-List frei, die einmalig beim Start gelesen wird. Nicht gesetzt bleibt das strenge Verhalten erhalten.

VariableStandardZweck
DKE_PRIVATE_TARGET_ALLOWLIST(nicht gesetzt)Seit 2.0.7. Kommagetrennte Liste, die von jedem Connector angewendet wird: exakter Hostname, Domain-Suffix (*.corp.example, mindestens zwei Labels), IP-Literal, IPv4-/IPv6-CIDR. Beispiel: vault.corp.local,*.corp.example,10.20.0.0/16
DKE_SMTP_ALLOW_PRIVATE(nicht gesetzt)Seit 2.0.5. Dasselbe Prinzip nur für SMTP-Relays: Hostnamen, IP-Literale, IPv4-CIDRs
DKE_SMTP_CA_FILE(nicht gesetzt)CA-Bundle (PEM-Datei), dem für SMTP-Relays zusätzlich zu den öffentlichen Roots vertraut wird. Seit 2.0.9 kann die CA eines Relays auch in den SMTP-Einstellungsformularen eingefügt werden, ohne Neustart
  • Loopback-, Link-Local-, Cloud-Metadaten-, Multicast- und Broadcast-Adressen sind nie erlaubt, auch wenn sie gelistet sind. /0-Einträge werden ignoriert.
  • Akzeptierte Einträge werden beim Start protokolliert (private-target allow-list ACTIVE); abgelehnte Einträge werden als Fehler protokolliert.
  • Ein nicht namentlich gelisteter Host wird nur akzeptiert, wenn jede private Adresse, auf die er auflöst, von einem IP- oder CIDR-Eintrag abgedeckt ist.
  • Ein Domain-Suffix-Eintrag erlaubt jedem Administrator, einen Connector auf einen beliebigen Host dieser Zone zu richten. Bevorzugen Sie bei einer mandantenfähigen Bereitstellung exakte Hostnamen.

Beispielumgebung (produktionsnah)​

# Environment
RUST_ENV=production
RUST_LOG=dke_api=info

# Database & cache
DATABASE_URL=postgres://user:pass@db-host:5432/dke_cockpit
REDIS_URL=redis://redis-host:6379

# Secrets (all required in production)
JWT_SECRET=<random string, >= 64 chars>
ENCRYPTION_KEY=<64 hex chars = 32 bytes>
HMAC_KEY=<64 hex chars = 32 bytes>

# Server / TLS
HOST=0.0.0.0
PORT=3000
TLS_PORT=3443
TLS_CERT_PATH=/etc/dke/tls/fullchain.pem
TLS_KEY_PATH=/etc/dke/tls/privkey.pem
CORS_ORIGINS=https://cockpit.example.com
PUBLIC_BASE_URL=https://cockpit-api.example.com
FRONTEND_BASE_URL=https://cockpit.example.com

# Passwords / passkeys
PWNED_PASSWORDS_ENABLED=true
WEBAUTHN_RP_ID=cockpit.example.com
WEBAUTHN_RP_NAME=DuoKey Cockpit
WEBAUTHN_ALLOWED_ORIGINS=https://cockpit.example.com

# DKE 365
DKE_BASE_DOMAIN=dke.example.com
DKE_AUDIENCE_DOMAIN=example.com

# Observability
METRICS_ENABLED=true
METRICS_BEARER_TOKEN=<random token>

# Hardening
DKE_TRUSTED_PROXY_CIDRS=10.0.0.0/8,172.16.0.0/12
DKE_FAIL_CLOSED_AUDIT=true
HSM-/Vault-Anmeldedaten sind keine Umgebungsvariablen

Vault-/HSM-Backends (Securosys, Cloud-KMS, Software-Vault, MPC …) werden pro Mandant in der Datenbank gespeichert, mit unter ENCRYPTION_KEY verschlüsselten Anmeldedaten, und über die Cockpit-Oberfläche konfiguriert — nicht über Umgebungsvariablen.


Fehlerbehebung​

SymptomWahrscheinliche UrsacheBehebung
Pod beendet sich in Produktion sofortEin erforderliches Secret fehlt oder ist schwach (JWT_SECRET, ENCRYPTION_KEY, HMAC_KEY, WEBAUTHN_*)Start-Log prüfen; starke Werte erzeugen und über OpenBao neu injizieren
Datenbankfehler beim ersten StartDer Datenbankrolle fehlen DDL-Rechte für die automatischen MigrationenDDL-Rechte auf der Datenbank dke_cockpit für den ersten Start gewähren
Anmeldung funktioniert nur auf einem ReplikatREDIS_URL=memory bei mehreren ReplikatenREDIS_URL auf ein gemeinsames Redis zeigen lassen
/metrics liefert nichtsMetriken ohne METRICS_BEARER_TOKEN aktiviert (fail-closed)Bearer-Token setzen und neu deployen
CORS-Fehler im BrowserCORS_ORIGINS enthält den Frontend-Origin nichtDen exakten https://-Origin ergänzen

Weiter zu Absichern → Secrets Management für das OpenBao/ESO-Setup, oder zurück zur Installation.