Ansible Vaultの「ハードコードの呪縛」を解く:KMS/Vault連携によるシークレット管理の極意
現場のSRE諸君、お疲れ様。
GitHubのコミットログに`.vault_pass`が含まれていないかヒヤヒヤする日々とは、今日で決別しよう。
Ansible Vaultは強力だが、その運用を誤れば「平文のパスワードファイル」という時限爆弾を抱えることになる。多くの現場が陥る「CI/CDサーバーの環境変数にベタ書き」という悪習を捨て、クラウドネイティブなシークレット管理へと昇華させるための極限の知見を授ける。
—
1. なぜ「静的パスワードファイル」は滅びるべきか
CI/CDパイプラインにおいて、`–vault-password-file`でパスワードファイルを読み込ませる運用は、以下のリスクを内包している。
- 認可の不透明性: 誰がそのパスワードにアクセスしたかの監査ログが残らない。
- 回転の困難さ: パスワードを変更する際、全CI環境の環境変数を更新しなければならない。
- 権限の肥大化: CI/CDツールが「パスワードそのもの」を知っている状態は、最小権限の原則に反する。
我々が目指すべきは、「実行時にのみ、認証されたリソースから一時的な鍵を取得し、即座に復号する」というオンザフライの設計だ。
—
2. AWS KMS/HashiCorp Vaultを活用したオンザフライ復号
Ansibleには、シークレットを動的に解決する「Vault Client」プラグインが存在する。今回は実務で最も採用率の高い HashiCorp Vault との連携を例に解説する。
設定の極意:`ansible.cfg` の最適化
まず、プロジェクトルートの `ansible.cfg` に以下の設定を投入し、Vaultの復号ロジックを自動化させる。
[defaults]
Vaultのパスワード取得を外部プログラムに委譲する
vault_password_file = ./scripts/get_vault_pass.sh
[inventory]
インベントリのキャッシュを有効化し、高速化を図る
cache = True
cache_plugin = jsonfile
cache_connection = .ansible/cache
必携スクリプト:`get_vault_pass.sh`
このスクリプトが、CI/CD環境において認証情報を取得する「鍵」となる。
!/bin/bash
AWS IAMロールまたはGitHub ActionsのOIDCトークンを使用してVaultから鍵を取得
最小限の権限で実行されることが肝要
vault kv get -field=password secret/data/ansible/vault_key
—
3. 実務で差がつく!生産性を爆上げする設定とツール
【神プラグイン】`ansible-vault-edit` (VS Code)
ターミナルで編集して失敗する時代は終わった。VS Codeの拡張機能「Ansible」を入れ、`ansible.vaultPasswordFile` 設定をワークスペースに追加せよ。
- 設定例 (.vscode/settings.json):
{
“ansible.vaultPasswordFile”: “./scripts/get_vault_pass.sh”
}
これで、暗号化されたYAMLファイルを開くと、自動で復号状態でプレビューできる。
【極上の開発体験】キーボードショートカットの徹底
VS Codeでの開発効率を最大化するマッピングだ(`keybindings.json`)。
[
{
“key”: “ctrl+alt+v”,
“command”: “ansible.vault.encrypt”,
“when”: “editorTextFocus”
},
{
“key”: “ctrl+alt+d”,
“command”: “ansible.vault.decrypt”,
“when”: “editorTextFocus”
}
]
これで、特定行の暗号化/復号が瞬時に行える。
—
4. チーム開発における「絶対ルール」
チームの生産性を落とさないために、以下の構成を標準とせよ。
1. グループ化の徹底: `group_vars/all/vault.yml` に全ての機密を集約せず、`group_vars/db/vault.yml` のようにロール単位で分割せよ。Gitのコンフリクトを減らすための鉄則だ。
2. Lintの自動化: `ansible-lint` をCI/CDのパイプラインに組み込み、暗号化されていない機密データが含まれていないかを静的解析で弾く。
3. 非対称暗号の活用: 本番環境と開発環境で鍵を分けたい場合、Ansible Vaultの鍵そのものをKMSでラップ(Envelope Encryption)して管理する手法が最強だ。
推奨ディレクトリ構成
.
├── ansible.cfg # 設定の集約
├── group_vars/
│ ├── all/vault.yml # 共通設定(暗号化)
│ └── web/vault.yml # ロール別設定(暗号化)
├── scripts/
│ └── get_vault_pass.sh # KMS/Vault連携ロジック
└── plays/ # 実行用プレイブック
—
最後に:エンジニアとしての矜持
「便利なツールを便利に使う」のは駆け出しの仕事だ。
我々SREは、「ツールがどれだけ複雑になっても、開発者が意識せずとも最高にセキュアな状態になれる仕組み」を設計しなければならない。
Ansible Vaultの暗号化をKMS等の外部サービスで動的に制御するこの手法は、まさにその第一歩だ。明日から、あなたのCI/CDログから「パスワード」の文字列が消え、静寂とセキュリティが訪れることを期待している。
現場からは以上だ。コードを書きに行こう。