シークレットを暗号化してリポジトリに入れる
目標
シークレットをリポジトリの中に置きつつ、平文では置かず、実行時にだけ復号して使う流れを身につけます。
なぜ重要なのか
シークレット管理の基準は、「暗号化されているか」ではなく、「露出経路がいくつあるか、取り消しと交換に何分かかるか」です。シークレットがコードと同じリポジトリにあれば、数を数えられ、レビューを経るので、この2つの問いに答えられるようになります。逆に、.envファイルやチャットやWikiに散らばっていると、取り消し自体が不可能になります。ラボで特に気をつけることは2つあります。パスワードファイルはリポジトリの外、または.gitignoreの中に置き、権限を600にすること、そしてシークレットを扱うタスクにno_logを付けることです。せっかく暗号化しても、実行ログに平文で出力されてしまえば、何の意味もありません。
ステップ
/root/ans/vault/.vault_passを8バイト以上で作成し、権限を600にしてください。/root/ans/vault/.gitignoreに.vault_passを入れてください。/opt/lab/fixtures/ansible/vault-secrets.plain.ymlを/root/ans/vault/vars/secrets.ymlへコピーして、暗号化してください。1行目がVaultヘッダーで、平文のパスワードが見えてはいけません。/root/ans/vault/vars/inline.ymlを作成し、registry_tokenキーの値だけを暗号化して入れてください。値はghp_で始まる任意の文字列で構いません。ファイル自体は平文である必要があります。/root/ans/vault/site.ymlで暗号化された変数を読み込み、/root/ans/vault/artifacts/app.envを作成してください。内容にDB_PASSWORD=labhub-Pr0d-2026があり、権限は600です。- シークレットを扱うタスクに
no_logを付け、実行ログを/root/ans/vault/out/run.txtに保存してください。ログにパスワードが残ってはいけません。 /root/ans/vault/.vault_pass_newを作成し、secrets.ymlをrekeyしてください。新しいパスワードでは開け、古いパスワードでは開けない必要があります。/root/ans/vault/.vault_pass_prodを作成し、/root/ans/vault/vars/prod.ymlをprodラベルのvault-idで暗号化してください。ヘッダーが$ANSIBLE_VAULT;1.2;AES256;prodである必要があります。/root/ans/vault/out/audit.jsonを作成してください。encrypted_files(暗号化されたファイルのパスを3つ以上)、plaintext_leaks(0件)、verdict("clean")の3つのキーを入れます。
参考
- ラボのPodはラボごとに新しく起動します。
/root/ans/inventory/hosts.iniがない場合は、最初のラボで作ったものと同じインベントリ(web1・web2・db1、ansible_host=127.0.0.1、ansible_port=2222、ansible_user=root、[prod:children]にweb・db)を先に作り直してください。構造は/opt/lab/fixtures/ansible/inventory.sample.iniを参考にできます。 - 実行するときは、
--vault-password-file /root/ans/vault/.vault_passを付けます。 ansible-vault view 파일(プレースホルダーはファイルです)で、復号結果だけを確認できます(ファイルはそのまま)。- よくある間違い1: パスワードファイルの末尾の改行のせいで開けない場合です。ファイルにはパスワードだけを1行で置いてください。
- よくある間違い2:
no_logを付けず、debugの出力やモジュールの結果にシークレットがそのまま出力されることです。
パスワードファイルを作成して保護する
/root/ans/vault/.vault_passを8バイト以上で作成し、権限を600にしてください。/root/ans/vault/.gitignoreに.vault_passを入れてください。
8文字以上で作成し、権限を600にしてください。そして、このファイルは絶対にコミットされてはいけません。
変数ファイルをまるごと暗号化する
/opt/lab/fixtures/ansible/vault-secrets.plain.ymlを/root/ans/vault/vars/secrets.ymlへコピーして、暗号化してください。1行目がVaultヘッダーで、平文のパスワードが見えてはいけません。
フィクスチャの平文ファイルをコピーしてから、encryptします。1行目がVaultヘッダーに変わっている必要があります。
値1つだけをインラインで暗号化する
/root/ans/vault/vars/inline.ymlを作成し、registry_tokenキーの値だけを暗号化して入れてください。値はghp_で始まる任意の文字列で構いません。ファイル自体は平文である必要があります。
encrypt_stringの出力を、YAMLファイルに貼り付けます。ファイル自体は平文で、値だけが暗号文です。
プレイブックで復号された値を使う
/root/ans/vault/site.ymlで暗号化された変数を読み込み、/root/ans/vault/artifacts/app.envを作成してください。内容にDB_PASSWORD=labhub-Pr0d-2026があり、権限は600です。
vars_filesで暗号化ファイルを読み込み、--vault-password-fileを付けて実行します。結果のファイルの権限は600です。
ログにシークレットが残らないようにする
シークレットを扱うタスクにno_logを付け、実行ログを/root/ans/vault/out/run.txtに保存してください。ログにパスワードが残ってはいけません。
シークレットを扱うタスクにno_logを付け、実行ログに値がないか、自分で確認してください。
パスワードを交換する
/root/ans/vault/.vault_pass_newを作成し、secrets.ymlをrekeyしてください。新しいパスワードでは開け、古いパスワードでは開けない必要があります。
rekeyのあとは、古いパスワードで開けてはいけません。新しいパスワードのファイルを別に作成してください。
vault-idのラベルで鍵を区別する
/root/ans/vault/.vault_pass_prodを作成し、/root/ans/vault/vars/prod.ymlをprodラベルのvault-idで暗号化してください。ヘッダーが$ANSIBLE_VAULT;1.2;AES256;prodである必要があります。
--vault-id 라벨@파일(プレースホルダーはラベルとファイルです)の形式です。ラベルを使うと、ヘッダーのバージョンが1.2になり、ラベルが埋め込まれます。
リポジトリのシークレット監査レポートを作る
/root/ans/vault/out/audit.jsonを作成してください。encrypted_files(暗号化されたファイルのパスを3つ以上)、plaintext_leaks(0件)、verdict("clean")の3つのキーを入れます。
暗号化されたファイルの一覧と、平文で漏れているものの一覧を、JSONにまとめます。漏えいは0である必要があります。