こんにちは。クラウドインフラの世界へようこそ。
今日は、多くのエンジニアが陥る「静的パスワードの呪縛」からあなたを解放する、極めて実戦的な技術の話をしましょう。
「設定ファイルにDBのパスワードを直書きして、Gitにコミットしそうになって冷や汗をかいた」……そんな経験はありませんか? あるいは、退職したメンバーの権限が残っていないか夜も眠れない、といった悩みも。
これらを一撃で解決するのが、AnsibleとHashiCorp VaultのDynamic Secrets(動的シークレット)を組み合わせた構成です。これをマスターすれば、あなたのインフラは「認証情報を保持しない」という、極めて強固で近代的な姿へと生まれ変わります。
—
1. なぜ「動的」である必要があるのか?
一般的な構成管理では、パスワードを暗号化して保存(Ansible Vaultなど)しますが、これには限界があります。
- 漏洩リスク: 一度漏れたら、手動で全てのパスワードを変更しなければならない。
- 追跡困難: 誰が、いつ、そのパスワードを使ったのかログが残りにくい。
Dynamic Secretsは違います。
Ansibleが実行されるその瞬間に、VaultがDBに対して「このタスクのためだけに、5分間だけ有効なユーザーを作れ」と命令し、終われば自動で削除します。「認証情報は使い捨て」。これが究極のセキュリティです。
—
2. セットアップ:賢いエンジニアの準備
まずは、AnsibleからVaultを叩くための準備です。Pythonのライブラリ `hvac` が必要になります。
AnsibleがVaultと会話するためのコネクタをインストール
pip install hvac
次に、Vault側で「Database Secrets Engine」を有効にします。これはVaultにDBの管理者権限を預け、そこから子ユーザーを生成させる仕組みです。
1. DBエンジンを有効化
vault secrets enable database
2. DB接続設定をVaultに登録(管理者権限が必要)
vault write database/config/my-postgresql \
plugin_name=postgresql-database-plugin \
allowed_roles=”ansible-role” \
connection_url=”postgresql://{{username}}:{{password}}@localhost:5432/postgres” \
username=”admin” password=”admin_password”
3. Ansible用の権限テンプレートを作成
vault write database/roles/ansible-role \
db_name=my-postgresql \
creation_statements=”CREATE ROLE \”{{name}}\” WITH LOGIN PASSWORD ‘{{password}}’ VALID UNTIL ‘{{expiration}}’; GRANT SELECT ON ALL TABLES IN SCHEMA public TO \”{{name}}\”;” \
default_ttl=”1h” \
max_ttl=”24h”
—
3. HelloWorld:動的認証情報の取得と利用
さて、ここからが本番です。Ansible PlaybookからVaultを呼び出し、発行されたばかりの「使い捨てID」でDBに接続してみましょう。
—
- name: Dynamic Secretsの検証
hosts: localhost
tasks:
- name: Vaultから一時的なDB認証情報を取得
community.hashi_vault.vault_kv2_get:
path: database/creds/ansible-role
register: db_creds
- name: 取得した認証情報でDBへ接続確認
community.postgresql.postgresql_query:
db: postgres
login_user: “{{ db_creds.data.username }}”
login_password: “{{ db_creds.data.password }}”
query: SELECT current_user;
register: db_result
- name: 結果を表示
debug:
msg: “現在接続中のユーザーは {{ db_result.query_result[0].current_user }} です。この認証情報は1時間後に自動消滅します。”
—
4. この設計が「現場で最強」である理由
このコードの何が素晴らしいのか、先輩として解説します。
1. パスワードの管理が不要: Gitリポジトリには「認証情報」が一行も存在しません。あるのは「認証情報を要求するロジック」だけです。
2. 冪等性の担保: Ansibleが失敗しても、認証情報はTTL(生存期間)が過ぎれば自動的にゴミ箱へ行きます。クリーンアップを意識する必要はありません。
3. 監査ログの完全性: Vaultのログを見れば、「誰が、どのサーバーに対して、いつ認証情報を発行したか」が完璧に記録されます。
最後に:あなたへのアドバイス
最初は「設定が面倒だ」と思うかもしれません。しかし、一度この仕組みを構築してしまえば、手作業でパスワードをローテーションするあの退屈な作業から永遠に解放されます。
インフラエンジニアの仕事は、「人間がパスワードを触らない世界」を作ることです。ぜひ、このVaultとの連携を第一歩にしてみてください。あなたのサーバー群が、より賢く、よりセキュアに生まれ変わるはずですよ。
困ったことがあれば、いつでもまた聞きに来てください。応援しています。