TT Lab
はじめる
学ぶ 学習パス コース

Ansible実戦

シークレットを暗号化してリポジトリに入れる

TT Labで続きを見る

目標

シークレットをリポジトリの中に置きつつ、平文では置かず、実行時にだけ復号して使う流れを身につけます。

なぜ重要なのか

シークレット管理の基準は、「暗号化されているか」ではなく、「露出経路がいくつあるか、取り消しと交換に何分かかるか」です。シークレットがコードと同じリポジトリにあれば、数を数えられ、レビューを経るので、この2つの問いに答えられるようになります。逆に、.envファイルやチャットやWikiに散らばっていると、取り消し自体が不可能になります。ラボで特に気をつけることは2つあります。パスワードファイルはリポジトリの外、または.gitignoreの中に置き、権限を600にすること、そしてシークレットを扱うタスクにno_logを付けることです。せっかく暗号化しても、実行ログに平文で出力されてしまえば、何の意味もありません。

ステップ

  1. /root/ans/vault/.vault_passを8バイト以上で作成し、権限を600にしてください。/root/ans/vault/.gitignoreに.vault_passを入れてください。
  2. /opt/lab/fixtures/ansible/vault-secrets.plain.ymlを/root/ans/vault/vars/secrets.ymlへコピーして、暗号化してください。1行目がVaultヘッダーで、平文のパスワードが見えてはいけません。
  3. /root/ans/vault/vars/inline.ymlを作成し、registry_tokenキーの値だけを暗号化して入れてください。値はghp_で始まる任意の文字列で構いません。ファイル自体は平文である必要があります。
  4. /root/ans/vault/site.ymlで暗号化された変数を読み込み、/root/ans/vault/artifacts/app.envを作成してください。内容にDB_PASSWORD=labhub-Pr0d-2026があり、権限は600です。
  5. シークレットを扱うタスクにno_logを付け、実行ログを/root/ans/vault/out/run.txtに保存してください。ログにパスワードが残ってはいけません。
  6. /root/ans/vault/.vault_pass_newを作成し、secrets.ymlをrekeyしてください。新しいパスワードでは開け、古いパスワードでは開けない必要があります。
  7. /root/ans/vault/.vault_pass_prodを作成し、/root/ans/vault/vars/prod.ymlをprodラベルのvault-idで暗号化してください。ヘッダーが$ANSIBLE_VAULT;1.2;AES256;prodである必要があります。
  8. /root/ans/vault/out/audit.jsonを作成してください。encrypted_files(暗号化されたファイルのパスを3つ以上)、plaintext_leaks(0件)、verdict("clean")の3つのキーを入れます。

参考

パスワードファイルを作成して保護する

/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である必要があります。