現状と制限
ACME Conductor はまだ v0.x の早期段階のプロジェクトです.
このページは,何が実装済みで,実デプロイで何を確認し何をまだ確認して
いないか,主な制限と非目標,設計判断の記録,参加・問い合わせの方法を
できるだけ率直にまとめたものです.導入を検討する際は,このページと
脅威モデル
を合わせて確認してください.
実装済みの機能
Runner と Certificate Store
固定バージョンの lego CLI を同梱したワンショットの Runner と,開発・テスト用のファイルシステム Store.
Conductor(レジストリ,REST API,スケジューラ)
SQLite のレジストリ,REST API,スケジューラ,ローカルプロセスランチャー,ローカルホスト限定の開発用認証.
Azure Key Vault store(PEM / PKCS #12)
マネージド ID(開発では DefaultAzureCredential)で認証する Key Vault store アダプタ.バインディングごとにパスワードなし PKCS #12 での取り込みも選べます.
Azure Container Apps Job ランチャーと署名付きエンベロープ
Runner が自身のマネージド ID で動くスケジュール実行の Job として,Conductor が共有ボリュームに差し出すジョブを受け取ります.Conductor は実行を開始できません.分離された ID と最小権限のカスタムロール.署名付き・期限付きのジョブエンベロープと Runner 側のリプレイ台帳,署名付き Result.
認証(OIDC,localhost-dev)と GUI
名前付きプリンシパルと admin/viewer ロールによる OIDC ベアラートークン認証,PKCE サインインを備えた最小限の静的 GUI.Container Apps デプロイでは API と GUI が HTTPS ingress で応答します.
リリースパイプライン
両イメージをダイジェスト固定のベースから SBOM と provenance 付きで GHCR に公開するリリースワークフロー.
出典: docs/architecture.md「実装済みの機能」.
実デプロイで確認済み / 未確認
2026-09-25 に v0.6.0 のイメージで staging デプロイを行い,staging CA で
1 つの target の発行が端から端まで通ることを確認しました.CI はサブスクリプション
へのデプロイを行わないため,実インフラでの検証はこの 1 回の手作業のデプロイに
基づいています.
確認済み
- 毎分の実行開始と実行名の照会(
CONTAINER_APP_JOB)_EXECUTION_NAME - 共有上のディレクトリのリネームによるジョブの受け渡し(1 実行が取る場合)
- ロールのアクション名(Conductor は実行状態を読み,Runner は DNS TXT 書き込みと Key Vault 取り込みができる)
legoのazurednsプロバイダが Container Apps の ID エンドポイントでマネージド ID 認証できること- Azure Files(SMB,
nobrl)上での SQLite の動作と,既定のresultGraceSeconds(30 秒)内での Result 到達 - API と GUI が HTTPS ingress で応答すること
- 1 target 分の Runner 設定がシークレットのサイズ上限に収まること
未確認(想定に基づく)
- 2 つの実行が同じジョブを同時に取り合ったときの SMB 上のリネームの原子性
Microsoft.App/jobs/による実行の停止stop/execution/action - SMB 上の
flock(所有権ロック)の信頼性.リビジョン更新時に一時的に 2 レプリカが重なりうる - Result 伝播遅延の幅(SMB キャッシュにより
resultGraceSecondsの調整が必要な場合がある) - ピア暗号化(
peerTrafficConfiguration)が ingress からレプリカへのホップを実際に暗号化していること.encryption.enabled - 多数のバインディングを持つ大きな Runner 設定がプラットフォームのシークレット値上限を超えないこと
出典: deploy/azure/README.md「実デプロイで確認したことと,まだ確認していないこと」.新しい環境へのデプロイは,ステージング CA と 1 target から始め,最初から最後まで見守ることが推奨されています.
主な制限
Conductor 側
- 認証・認可 — プロバイダが発行した admin ロールのトークンは audience の範囲内で信頼され,失効確認やイントロスペクションは行いません.ロールは admin/viewer の 2 つだけで,target ごと・ポリシーごとの権限はありません.
localhost-devは開発ホスト 1 台向けで,人ではなくホストを認証します. - GUI は最小限 — API の上の一覧とフォームのみで,ダッシュボードも一括操作も独自の状態もありません.
- ローカルランチャーは 1 ホスト限定 — 同じホストに
acme-runnerが必要で,資格情報はpassthroughEnv経由で Conductor の環境に置かれます.Container Apps ランチャーにはこの制約はありません. - 強制終了は Runner を取り残し得る — 復旧は該当 run を「結果不明」として扱いますが,Runner はなお完了するかもしれず,次の期限到来 run と競合しえます.
- 単一プロセス・単一コネクション — レジストリはすべてのステートメントを直列化します.数百の target と 1 人の操作者には十分ですが,多忙なマルチテナント API には向きません.マルチレプリカは非目標です.
- ポリシー変更はバージョン管理も push もされない — 更新は各 target の次の run で適用され,run にポリシーのリビジョンはなく,各 JobSpec 内のスナップショットがあるだけです.
- ローカルランチャーでは署名は任意 —
jobSigningなしでは生の JobSpec を渡し,end-to-end で認証するものがありません.1 ホスト上でのみ許容されます. - メトリクスエンドポイントはまだない —
/healthz・/readyzはありますが,Prometheus の/metricsはありません.
Runner 側
- ファイルシステム Store は開発・テスト専用 — 独自のアクセス制御を持たず,本物のシークレットストアの代替にはなりません.
- Key Vault store は本物の vault に対しては未検証 — vault API のプロセス内の偽物に対して試験されており,実際の取り込み動作は文書化されていますが CI では検証されていません.
credential: defaultは開発上の利便性 —DefaultAzureCredentialチェーンが環境変数やPATH上の開発者ツールを使うことがあります.本番ではmanaged-identityを指定します.- Runner 自体には run レベルの並行制御がない — 手動や別のランチャーで開始された Runner については,同じ target への二重発行を防げません(Conductor 自身が起動する run は target ごとに最大 1 つに制限).
- リプレイ台帳は
stateDirごと — 状態ディレクトリが別々の Runner は互いの受理済み run を見ません.jobSigningのない Runner には期限やリプレイの検査がありません. - 署名は生成者を認証するのであって判断を認証しない — 署名鍵を持つ Conductor はどんな名前のジョブにも署名できます.それを限定するのは Runner の信頼された認可ポリシーです.
- DNS スコープの検証はできない — 渡された DNS 資格情報/ワークロード ID が実際に必要なチャレンジゾーンに限定されているかを Runner は検証できません.
- ログ秘匿はヒューリスティック — 値ベースの既知シークレット・既知 PEM マーカーのマスクであり,汎用のシークレット検出器ではありません.
Runner の renewBeforeDays/keyType というコストの
レバーは,Runner 側ではまだ制限されていません(脅威モデルの残存リスク).
JobSpec で名前について認可された生成者は,再発行を強制したり高価な鍵種別を
強制したりできますが,これはすでに認可されたスコープ内でのコスト・
レート制限のレバーであって権限昇格ではありません.
非目標
次の項目は,今後 ADR が別途定めるまで明示的に対象外です.理由の多くは 「MVP のスコープを絞る」「境界の外側(すでにある実装)に任せる」ことに あります.
- ACME プロトコルや DNS プロバイダ連携の再実装 —
legoがすでに行っています. - 独自の暗号
- 秘密鍵配布 API — Conductor の中核の安全設計原則(秘密鍵を持たない)と相容れません.
- Kubernetes オペレータや CRD
- 複数レプリカ/高可用な Conductor — SQLite の単一プロセス・単一コネクション設計に対応します.
- PostgreSQL — 当面は SQLite がストアです.
- AWS または GCP のプロバイダ — バインディングモデルはこれらを見越していますが,まだ何も実装されていません.
- Arc 管理下のホストへの証明書配布
- あらゆる種類の自動 purge — ADR 0008 を参照.
- 任意のスクリプトや発行後フック
- 利用者が指定するコンテナイメージ
- 動的なプラグインダウンロード
出典: docs/architecture.md「非目標」.
設計判断の記録
アーキテクチャ上重要な決定は,MADR 風の軽量な形式で ADR (Architecture Decision Record)として記録されています.
一覧の出典: docs/adr/README.md.背景と併せて docs/architecture.md と docs/threat-model.md も参照してください.
残存リスク(要約)
脅威モデルは,未解決のまま残るリスクを明示しています.おもなものだけを 挙げます(詳細は脅威モデル「残存リスクと未対策事項」を参照):
- ベアラートークンは期限切れまで有効で,失効確認は行いません(T14).
localhost-devはすべてのループバックのピアを信頼する開発モードです(T13).- GitHub Actions はダイジェストではなくタグで固定されており,リリースワークフローはまだ実行されていません(T8).
- Container Apps のピア間暗号化は文書化されていますが実デプロイでは観測されていません(T14).
- コードベース全体を対象とするログスクラブの専用テストスイートはまだありません.
参加・問い合わせ
コントリビューション
1 PR = 1 目的.PR を開く前に make verify(gofmt と句読点の検査,
go vet,go test,go test -race),make vulncheck,
make images を実行します.日本語の句読点は「,」「.」に統一し,
GUI にインラインスクリプトやサードパーティ資産を置かず,Conductor のコアに
クラウド SDK を入れないといった規則があります.詳しくは
CONTRIBUTING.md
を参照してください.
セキュリティ報告
脆弱性が疑われる場合は,公開の issue や議論チャンネルではなく,
リポジトリの GitHub プライベート脆弱性報告(Security タブ →
Report a vulnerability)を使います.専任のセキュリティチームや
正式な SLA は持たない早期段階のプロジェクトのため,対応はベストエフォートです.
v1 リリースが存在するまでは main ブランチのみが
セキュリティ修正の対象です.詳しくは
SECURITY.md
を参照してください.
ライセンス
Apache License 2.0 で公開されています.