シークレット
Composia は age 暗号化を使用して期待状態リポジトリ内の暗号化シークレットファイルを管理します。暗号化と復号はコントローラー上で行われます。エージェントは age 秘密鍵に一切アクセスしません。
設定
シークレットには age 鍵ペアが必要です。コントローラー設定で設定します:
controller:
secrets:
provider: age
identity_file: "/app/configs/age-identity.key"| キー | 型 | 必須 | 説明 |
|---|---|---|---|
provider | string | はい | age である必要があります。 |
identity_file | string | はい | age 秘密鍵ファイルへのパス。 |
recipient_file | string | いいえ | age 受信者(公開鍵)を含むファイルへのパス。省略した場合、受信者は秘密鍵から導出されます。 |
armor | bool | いいえ | 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 で暗号化)コントローラーは書き込み時に平文を暗号化し、読み取り時に復号します。リポジトリには暗号文のみが含まれます。シークレットがリポジトリ内、タスクログ内、またはエージェントへの転送中に平文で現れることはありません。
シークレットがエージェントに届く仕組み
デプロイまたは更新タスクのレンダリングステップ中に、コントローラーは:
- リポジトリ内のサービスディレクトリから暗号化ファイルを読み取ります。
- age 秘密鍵を使用して各ファイルを復号します。
- 復号されたコンテンツを
.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が設定されていない場合、GetSecretとUpdateSecretはFailedPreconditionを返します。 - ファイルが見つからない:
GetSecretはファイルが存在しない場合、エラーではなく空のコンテンツレスポンスを返します。これによりクライアントはファイル不在と復号失敗を区別できます。 - ベースリビジョン競合:
UpdateSecretはリポジトリ HEAD に対して CAS(compare-and-swap)を使用します。最後の読み取り以降にリポジトリが変更された場合、書き込みはリビジョン競合で失敗します。
最終更新日 • Renovate Bot