DAT CMS

DAT CMS は証明書を作成し、データベースに保存し、発行・検証サービスに適切な証明書を配信します。プロトコルの動作は DAT CMS 仕様で説明します。

ランタイム設定の作成

DAT 証明書管理サービス

dns

サーバー

Portデフォルト: 8088
Hostnameデフォルト: Auto
terminal

実行コマンド

bash
API を確認
bash
database

データベース

API キャッシュデフォルト: 60
verified_user

DAT 証明書

署名アルゴリズム
暗号化アルゴリズム
証明書の発行遅延help
DAT 発行期間help
DAT TTL (寿命)help
DAT 証明書生成スケジュール (Cron)help
lock

アクセス制御

Master トークン
DAT 証明書の生成とサーバーバージョンの取得
Full Cert トークン
Full (Pair Key, Hash Key) 証明書を取得
Verify Cert トークン
Verify (Verify Key Only) 証明書を取得

Docker で実行

コンテナーは non-root ユーザーで実行します。SQLite を使う場合は書き込み可能なデータディレクトリをマウントします。トークンとデータベースパスワードはコマンド履歴ではなく Secret 注入機構で渡します。

docker run --rm --name dat-cms -p 8088:8088 \
  --user 10001:10001 \
  -v "$PWD/dat-cms-data:/data" \
  -e PORT=8088 \
  -e DB_URI='sqlite:/data/data.db' \
  -e TOKEN_MASTER='replace-with-a-secret' \
  -e TOKEN_CERT_FULL='replace-with-a-secret' \
  -e TOKEN_CERT_VERIFY='replace-with-a-secret' \
  sarolab/dat-cms

データベース

DB_URI で SQLite、PostgreSQL、MySQL 接続を設定します。MariaDB は MySQL プロトコルで接続します。CMS は証明書クエリ結果をスナップショットとしてキャッシュし、ストレージ更新が一時的に失敗しても最後の成功スナップショットを提供し続けます。

DB_CACHE_SECS はスナップショットの更新間隔、DB_QUERY_TIMEOUT_SECS は更新クエリの制限時間を設定します。成功スナップショットがなくストレージを読み取れない場合、サービスは DAT_STORE_UNAVAILABLE を返します。

アクセスロール

環境変数権限使用者
TOKEN_MASTER証明書を登録し、保護されたバージョンを取得運用
TOKEN_CERT_FULL完全な証明書を取得DAT 発行サービス
TOKEN_CERT_VERIFY検証専用証明書を取得検証・復号サービス

各変数は、カンマ区切りの英数字トークンを受け付けます。ロールのトークンリストが空の場合、そのロールのエンドポイントは公開され、警告がログに記録されます。

証明書の生成

master ロールは、署名アルゴリズム、暗号化アルゴリズム、伝播遅延、発行期間、TTL を指定して証明書を登録します。伝播遅延中に、発行可能になる前の新しい証明書をサービスが同期します。

クライアント統合

  1. 発行サービスには full トークンと完全証明書エンドポイントを使用します。
  2. 検証サービスには verify トークンと検証専用オプションを使用します。
  3. 初回同期の結果を確認し、起動を失敗させる必要がある場合は即時同期 API を呼び出します。
  4. 自動同期が有効な場合は、アプリケーション終了時にマネージャーを閉じます。

各言語の builder と終了動作については ライブラリガイドを参照してください。

運用チェック

  • /health/version/api は認証なしで状態を報告します。
  • /version は、そのロールが設定されている場合に master トークンを必要とします。
  • 標準出力と標準エラーからログを収集します。
  • 終了シグナルを転送し、データベースとスケジューラーが閉じる時間を確保します。

Kubernetes

コンテナーポートと probe をサービスポートに合わせ、non-root ユーザーが書き込めるようデータディレクトリをマウントします。トークンとデータベース接続情報は Secrets で注入します。

securityContext:
  runAsNonRoot: true
  runAsUser: 10001
  runAsGroup: 10001
containers:
  - name: dat-cms
    image: sarolab/dat-cms
    ports: [{ containerPort: 8088 }]
    readinessProbe: { httpGet: { path: /health, port: 8088 } }
    livenessProbe: { httpGet: { path: /health, port: 8088 } }