コンテンツにスキップ
シークレット

シークレット

Composia は age 暗号化を使用して期待状態リポジトリ内の暗号化シークレットファイルを管理します。暗号化と復号はコントローラー上で行われます。エージェントは age 秘密鍵に一切アクセスしません。

設定

シークレットには age 鍵ペアが必要です。コントローラー設定で設定します:

controller:
  secrets:
    provider: age
    identity_file: "/app/configs/age-identity.key"
キー必須説明
providerstringはいage である必要があります。
identity_filestringはいage 秘密鍵ファイルへのパス。
recipient_filestringいいえage 受信者(公開鍵)を含むファイルへのパス。省略した場合、受信者は秘密鍵から導出されます。
armorboolいいえASCII アーマー出力を使用します。デフォルトは true

鍵ペアの生成:

age-keygen -o age-identity.key

オプション: 公開鍵を受信者として抽出:

age-keygen -y age-identity.key > age-recipients.txt

シークレットの保存方法

リポジトリ内のシークレットファイルは慣例として .enc 拡張子を持ちます。age 暗号化された暗号文として保存されます:

my-app/
├── docker-compose.yaml
├── composia-meta.yaml
└── .secret.env.enc        (age で暗号化)

コントローラーは書き込み時に平文を暗号化し、読み取り時に復号します。リポジトリには暗号文のみが含まれます。シークレットがリポジトリ内、タスクログ内、またはエージェントへの転送中に平文で現れることはありません。

シークレットがエージェントに届く仕組み

デプロイまたは更新タスクのレンダリングステップ中に、コントローラーは:

  1. リポジトリ内のサービスディレクトリから暗号化ファイルを読み取ります。
  2. age 秘密鍵を使用して各ファイルを復号します。
  3. 復号されたコンテンツを .composia-secret.env としてサービスバンドルに注入します。

バンドルはエージェントレポート接続を通じてエージェントにストリーミングされます。エージェントはバンドルをディスクに書き込み、docker compose up を続行します。復号されたシークレット環境は、エージェントが秘密鍵を見ることなく Compose サービスから利用可能になります。

CLI の使用

暗号化シークレットファイルの書き込み:

composia secret update my-app .secret.env.enc --file ./local-plain.env

シークレットファイルの読み取りと復号:

composia secret get my-app .secret.env.enc

シークレットのインプレース編集(エディタが開きます):

composia secret edit my-app .secret.env.enc

すべてのシークレット書き込み操作には、同時変更との競合を防ぐためのベースリビジョンチェックが含まれます。

ファイルパスのルール

シークレットファイルのパスは:

  • サービスディレクトリからの相対パス(絶対パスではない)である必要があります。
  • ../ のようなパス横断シーケンスを含んではいけません。
  • サービスディレクトリ内のファイルを指す必要があります。

コントローラーはサービスを見つけ、サービスディレクトリからの相対パスとしてファイルパスを解決し、リポジトリファイルに対して操作を行います。

エラー条件

  • シークレット未設定: controller.secrets が設定されていない場合、GetSecretUpdateSecretFailedPrecondition を返します。
  • ファイルが見つからない: GetSecret はファイルが存在しない場合、エラーではなく空のコンテンツレスポンスを返します。これによりクライアントはファイル不在と復号失敗を区別できます。
  • ベースリビジョン競合: UpdateSecret はリポジトリ HEAD に対して CAS(compare-and-swap)を使用します。最後の読み取り以降にリポジトリが変更された場合、書き込みはリビジョン競合で失敗します。
最終更新日 • Renovate Bot