Cockpit 構成
Cockpit は、起動時に一度だけ読み込まれる環境変数のみで構成されます
(ローカル用途では .env ファイルもサポートされます)。オンプレミスでは、これらの
変数は External Secrets Operator を通じて OpenBao から解決され、環境変数として
Pod に注入されます — イメージに焼き込まれることも、Git にコミットされることもありません。
ここに示す値はすべてプレースホルダーです。シークレット(データベース DSN、署名・ 暗号化キー、クライアントシークレット、トークン)は決してハードコードしたり Git に コミットしたりしないでください — シークレットエンジンに保存し、デプロイ時に注入します。 シークレットの取得 と シークレットマネージャー統合 を参照してください。
シークレットの取得
オンプレミスでは、環境固有の構成は OpenBao に保持され、デプロイ時に マテリアライズされるため、シークレット値はシークレットエンジンの中にのみ存在します。
- 環境固有の変数一式(実際のシークレット値を含む)を OpenBao に保存します。
- デプロイ時に External Secrets Operator がそれを取得し、インメモリ(
tmpfs)の Kubernetes Secret をマテリアライズします。 - その Secret は、マウントされたファイルとしてではなく、環境変数(
envFrom)として Cockpit Pod に公開されます。 - 構成を変更するには、OpenBao の値を更新して再デプロイします — イメージ内の編集や Git への保存は一切ありません。
環境変数リファレンス
RUST_ENV=production の場合、JWT_SECRET、ENCRYPTION_KEY、HMAC_KEY、
WEBAUTHN_RP_ID、WEBAUTHN_ALLOWED_ORIGINS が欠落・脆弱な場合、または
PWNED_PASSWORDS_ENABLED=false の場合、サーバーは起動を拒否します。強力な
ランダム値を生成して OpenBao に保存してください — 決してコミットしないでください。
サーバーと TLS
| 変数 | 既定値 | 目的 |
|---|---|---|
HOST | 127.0.0.1 | バインドアドレス(コンテナでは 0.0.0.0 を設定) |
PORT | 3000 | HTTP ポート |
TLS_PORT | 3443 | HTTPS ポート(0 で無効化。開発用証明書は自動生成) |
TLS_CERT_PATH / TLS_KEY_PATH | (未設定) | TLS 証明書 / キーの PEM パス |
KMIP_TLS_PORT | 5696 | KMIP(OASIS TTLV over TLS)リスナー。0 で無効化 |
PUBLIC_BASE_URL | https://{host}:{tls_port} | API/マシン向けオリジン(DKE サービス URL、JWKS、ACME/EST) |
FRONTEND_BASE_URL | (導出) | SPA/ブラウザ向けオリジン(OIDC リダイレクト、メールリンク) |
CORS_ORIGINS | http://localhost:5180 | 許可する CORS オリジン(カンマ区切り) |
データベースとキャッシュ
| 変数 | 既定値 | 目的 |
|---|---|---|
DATABASE_URL | postgres://…/dke_cockpit | PostgreSQL DSN(localhost 以外には sslmode=require が自動付与) |
REDIS_URL | memory | memory(インプロセス)または redis://host:port — 複数レプリカでは Redis が必須 |
Cockpit のデータストアは PostgreSQL のみです。スキーマのマイグレーションは 起動時に自動実行されます — 初回起動時にはデータベースロールに DDL 権限が必要です。 個別のマイグレーションジョブは不要です。
シークレットと暗号(本番環境で必須)
| 変数 | 目的 |
|---|---|
JWT_SECRET | HS256 JWT 署名キー(64 文字以上) |
JWT_SECRET_KID / JWT_SECRETS_PREVIOUS | 現在のキー ID と過去のキー(ローテーション用) |
ENCRYPTION_KEY | 保存データ/資格情報用の AES-256 キー(32 バイト hex) |
HMAC_KEY | 監査ログ完全性用の HMAC-SHA256 キー(32 バイト hex) |
RUST_ENV | production で厳格なフェイルクローズド検査を有効化 |
認証とパスキー
| 変数 | 既定値 | 目的 |
|---|---|---|
WEBAUTHN_RP_ID | localhost | WebAuthn Relying Party ID(本番: 必須、localhost 不可) |
WEBAUTHN_RP_NAME | DKE Cockpit | パスキーのプロンプトに表示される名前 |
WEBAUTHN_ALLOWED_ORIGINS | (開発用リスト) | 許可オリジン(本番: すべて https://、localhost 不可) |
PWNED_PASSWORDS_ENABLED | true | HIBP 漏えいパスワード検査(本番: false は起動失敗) |
DKE_ADMIN_PASSWORD | (未設定) | 初回起動時の管理者パスワード。未設定の場合、強力なランダムパスワードが生成され、起動ログに一度だけ出力されます(初回ログイン時に変更が必要) |
外部 IdP(Entra ID、Okta、Keycloak、汎用 OIDC)は環境変数ではなく、 テナントごとに Cockpit コンソールで構成します — アイデンティティと SSO を参照してください。
DKE 365
| 変数 | 目的 |
|---|---|
DKE_BASE_DOMAIN | DKE サービス URL の DNS ベース — 各サービスは https://{slug}.{DKE_BASE_DOMAIN}(ワイルドカード DNS + TLS が必要) |
DKE_AUDIENCE_DOMAIN | JWT オーディエンス / Azure AD identifier-URI の頂点(未設定時は DKE_BASE_DOMAIN にフォールバック) |
DKE_DEFAULT_GRAPH_TENANT_ID / _CLIENT_ID / _CLIENT_SECRET | Azure AD 登録を自動プロビジョニングするフォールバックの Microsoft Graph アプリ |
DKE_ALLOW_PERMISSIVE_MODE | 開発/テスト専用 — 本番では必ず未設定 |
DKE_TENANT_DECRYPT_RPS_MAX | テナントごとの復号レート上限(既定 100) |
オブザーバビリティ
| 変数 | 既定値 | 目的 |
|---|---|---|
RUST_LOG | dke_api=info | ログレベルフィルター |
METRICS_ENABLED | false | GET /metrics で Prometheus メトリクスを公開 |
METRICS_BEARER_TOKEN | (未設定) | /metrics を保護するベアラートークン — 必須。本番でトークンなしにメトリクスを有効化すると無効化されます(フェイルクローズド) |
ハードニング
| 変数 | 既定値 | 目的 |
|---|---|---|
DKE_TRUSTED_PROXY_CIDRS | (空) | これらの送信元 CIDR のみ cf-connecting-ip / cf-ipcountry を設定可能 |
DKE_FAIL_CLOSED_AUDIT | 本番=true | セキュリティ監査の書き込みに失敗した場合に 503 を返す |
DKE_AUDIT_WORM_PATH | (未設定) | 任意の Write-Once(WORM)監査シンクのパス |
環境の例(本番相当)
# 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 バックエンド(Securosys、クラウド KMS、ソフトウェアボールト、MPC など)は、
ENCRYPTION_KEY で暗号化された資格情報とともにテナントごとにデータベースへ保存され、
Cockpit の UI から構成します — 環境変数では構成しません。
トラブルシューティング
| 症状 | 考えられる原因 | 対処 |
|---|---|---|
| 本番で Pod が即座に終了する | 必須シークレットが欠落または脆弱(JWT_SECRET、ENCRYPTION_KEY、HMAC_KEY、WEBAUTHN_*) | 起動ログを確認し、強力な値を生成して OpenBao から再注入 |
| 初回起動時にデータベースエラー | 自動マイグレーションに必要な DDL 権限がデータベースロールにない | 初回起動用に dke_cockpit データベースへの DDL 権限を付与 |
| 1 つのレプリカでしかログインできない | 複数レプリカで REDIS_URL=memory | REDIS_URL を共有 Redis に向ける |
/metrics が何も返さない | METRICS_BEARER_TOKEN なしでメトリクスを有効化(フェイルクローズド) | ベアラートークンを設定して再デプロイ |
| ブラウザで CORS エラー | CORS_ORIGINS にフロントエンドのオリジンがない | 正確な https:// オリジンを追加 |
続いて セキュリティ → シークレット管理(OpenBao/ESO の セットアップ)へ進むか、インストール に戻ってください。