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

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.