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.
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.
- Der vollständige, umgebungsspezifische Variablensatz (mit echten Secret-Werten) wird in OpenBao gespeichert.
- Beim Deployment holt ihn der External Secrets Operator ab und materialisiert
ein In-Memory-(
tmpfs)-Kubernetes-Secret. - Dieses Secret wird dem Cockpit-Pod als Umgebungsvariablen (
envFrom) bereitgestellt — nicht als gemountete Datei. - Konfiguration ändern: Wert in OpenBao aktualisieren und neu deployen — nichts wird im Image bearbeitet oder in Git gespeichert.
Umgebungsreferenz
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
| Variable | Standard | Zweck |
|---|---|---|
HOST | 127.0.0.1 | Bind-Adresse (im Container 0.0.0.0 setzen) |
PORT | 3000 | HTTP-Port |
TLS_PORT | 3443 | HTTPS-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_PORT | 5696 | KMIP-Listener (OASIS TTLV über TLS); 0 deaktiviert |
PUBLIC_BASE_URL | https://{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_ORIGINS | http://localhost:5180 | Erlaubte CORS-Origins (kommagetrennt) |
Datenbank & Cache
| Variable | Standard | Zweck |
|---|---|---|
DATABASE_URL | postgres://…/dke_cockpit | PostgreSQL-DSN (sslmode=require wird für Nicht-localhost automatisch ergänzt) |
REDIS_URL | memory | memory (In-Process) oder redis://host:port — Redis ist bei mehr als einem Replikat erforderlich |
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)
| Variable | Zweck |
|---|---|
JWT_SECRET | HS256-JWT-Signierschlüssel (≥ 64 Zeichen) |
JWT_SECRET_KID / JWT_SECRETS_PREVIOUS | Aktuelle Key-ID und historische Schlüssel (Rotation) |
ENCRYPTION_KEY | AES-256-Schlüssel (32 Byte hex) für Anmeldedaten/Daten im Ruhezustand |
HMAC_KEY | HMAC-SHA256-Schlüssel (32 Byte hex) für die Integrität des Audit-Protokolls |
RUST_ENV | production aktiviert die strengen Fail-Closed-Prüfungen |
Authentifizierung & Passkeys
| Variable | Standard | Zweck |
|---|---|---|
WEBAUTHN_RP_ID | localhost | WebAuthn-Relying-Party-ID (Prod: erforderlich, nicht localhost) |
WEBAUTHN_RP_NAME | DKE Cockpit | Anzeigename im Passkey-Dialog |
WEBAUTHN_ALLOWED_ORIGINS | (Dev-Liste) | Erlaubte Origins (Prod: nur https://, kein localhost) |
PWNED_PASSWORDS_ENABLED | true | HIBP-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
| Variable | Zweck |
|---|---|
DKE_BASE_DOMAIN | DNS-Basis für DKE-Service-URLs — jeder Service ist https://{slug}.{DKE_BASE_DOMAIN} (Wildcard-DNS + TLS erforderlich) |
DKE_AUDIENCE_DOMAIN | JWT-Audience / Azure-AD-Identifier-URI-Apex (fällt auf DKE_BASE_DOMAIN zurück) |
DKE_DEFAULT_GRAPH_TENANT_ID / _CLIENT_ID / _CLIENT_SECRET | Fallback-Microsoft-Graph-App zum automatischen Provisionieren von Azure-AD-Registrierungen |
DKE_ALLOW_PERMISSIVE_MODE | Nur Dev/Test — muss in Produktion ungesetzt bleiben |
DKE_TENANT_DECRYPT_RPS_MAX | Entschlüsselungs-Ratenlimit pro Mandant (Standard 100) |
Observability
| Variable | Standard | Zweck |
|---|---|---|
RUST_LOG | dke_api=info | Log-Level-Filter |
METRICS_ENABLED | false | Prometheus-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
| Variable | Standard | Zweck |
|---|---|---|
DKE_TRUSTED_PROXY_CIDRS | (leer) | Nur diese Quell-CIDRs dürfen cf-connecting-ip / cf-ipcountry setzen |
DKE_FAIL_CLOSED_AUDIT | Prod=true | 503 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
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
| Symptom | Wahrscheinliche Ursache | Behebung |
|---|---|---|
| Pod beendet sich in Produktion sofort | Ein 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 Start | Der Datenbankrolle fehlen DDL-Rechte für die automatischen Migrationen | DDL-Rechte auf der Datenbank dke_cockpit für den ersten Start gewähren |
| Anmeldung funktioniert nur auf einem Replikat | REDIS_URL=memory bei mehreren Replikaten | REDIS_URL auf ein gemeinsames Redis zeigen lassen |
/metrics liefert nichts | Metriken ohne METRICS_BEARER_TOKEN aktiviert (fail-closed) | Bearer-Token setzen und neu deployen |
| CORS-Fehler im Browser | CORS_ORIGINS enthält den Frontend-Origin nicht | Den exakten https://-Origin ergänzen |
Weiter zu Absichern → Secrets Management für das OpenBao/ESO-Setup, oder zurück zur Installation.