はじめに
近年、AWS・Azure・GCPといった複数のクラウドサービスを組み合わせて利用するケースが増えています。しかし、それぞれの環境で認証情報を個別に管理すると、運用の手間やセキュリティリスクが発生する可能性があります。
HCP Vaultを利用すれば、クラウド問わず一元的に認証情報を管理でき、マルチクラウド環境でも同じ運用・セキュリティポリシーを適用できます。これにより、認証情報管理の手間を大幅に削減し、安全かつ効率的なシークレット管理が実現できます。
本記事では、Ansibleを使ってHCP Vaultで認証情報を登録・取得する方法を解説します。
HCP VaultとAnsibleを組み合わせた、認証情報の管理・自動化の推進にお役立てください。
TL;DR
この記事を読めば、以下のことがわかります
- AnsibleでHCP Vaultに認証情報を自動登録する方法
- HCP Vaultから認証情報を取得し、Playbookで活用する方法
- HCP Vault関連のPlaybookを書く時のポイント
前提条件
- Initial Root Tokenが作成済みであること
- あくまでも動作確認なので、このトークンを使用します
- 環境変数
ANSIBLE_HASHI_VAULT_TOKENに設定します
実行環境
- Ansible
- ansible-core: 2.19.3
- Ansible Collection
- community.hashi_vault: 7.1.0
- Python library
- hvac: 2.4.0
詳細
1. Playbook実行前の準備(環境変数の設定)
-
Playbookを実行する環境で以下のように環境変数を設定します
export ANSIBLE_HASHI_VAULT_ADDR=https://<Vault Server Address>:<Vault Server Port>/ export ANSIBLE_HASHI_VAULT_TOKEN=<Initial Root Token>
2. サーバーのユーザー名・パスワード登録用Playbookの実行
-
実行コマンド
ansible-navigator run vault_server_cred_register.yml -
Playbook例
- ポイント
- 保管するシークレットエンジン(今回は、test_servers)の存在確認をして、存在しなかった場合は作成します
- シークレットエンジンに対して、サーバーごとのログインに必要なユーザー名とパスワードを保管します
vault_server_cred_register.yml--- - name: Register server credentials to HCP Vault hosts: localhost connection: local gather_facts: false vars: # Vaultのマウントポイント vault_mount_point: test_servers/ # 登録するデータ server_creds: - hostname: server01 username: user01 password: p@ssw0rd01 - hostname: server02 username: user02 password: p@ssw0rd02 tasks: # Vaultに現在マウントされているシークレットエンジン一覧を取得 - name: Get list of mounted engines community.hashi_vault.vault_read: url: "{{ lookup('env', 'ANSIBLE_HASHI_VAULT_ADDR') }}" token: "{{ lookup('env', 'ANSIBLE_HASHI_VAULT_TOKEN') }}" validate_certs: false path: "sys/mounts" register: __mount_list # 指定パスにKV v2シークレットエンジンがなければマウント - name: Mount KV v2 engine if not exists community.hashi_vault.vault_write: url: "{{ lookup('env', 'ANSIBLE_HASHI_VAULT_ADDR') }}" token: "{{ lookup('env', 'ANSIBLE_HASHI_VAULT_TOKEN') }}" validate_certs: false path: "sys/mounts/{{ vault_mount_point }}" data: type: kv options: version: 2 when: - __mount_list.data.data[vault_mount_point] is not defined # 各サーバーのユーザー名とパスワードをVaultに登録 - name: Register username and password to Vault per server community.hashi_vault.vault_kv2_write: url: "{{ lookup('env', 'ANSIBLE_HASHI_VAULT_ADDR') }}" token: "{{ lookup('env', 'ANSIBLE_HASHI_VAULT_TOKEN') }}" validate_certs: false engine_mount_point: "{{ vault_mount_point }}" path: "{{ item.hostname }}" data: username: "{{ item.username }}" password: "{{ item.password }}" loop: "{{ server_creds }}" - ポイント
-
実行結果
- 以下のような階層構造で、サーバーの認証情報が保管されます
test_servers/ # KV v2シークレットエンジンのマウントポイント ├── server01/ # サーバーごとのパス │ ├── username # ユーザー名(シークレットのキー) │ └── password # パスワード(シークレットのキー) └── server02/ ├── username └── password
3. サーバーのユーザー名・パスワード確認用Playbookの実行
-
実行コマンド
ansible-navigator run vault_server_cred_display.yml -i hosts.yml -
インベントリ例
- ポイント
- Lookupプラグインで
community.hashi_vault.hashi_vaultを指定することで、認証情報を取得可能です- 変数
inventory_hostnameを使うことで、ホスト名にもとづいた認証情報の取得がしやすくなります - インベントリで
urlやtokenを指定しなくても動くのは、community.hashi_vault.hashi_vaultがデフォルトで環境変数ANSIBLE_HASHI_VAULT_ADDRとANSIBLE_HASHI_VAULT_TOKENを見にいく仕様だからです
- 変数
- Lookupプラグインで
hosts.yml--- all: hosts: server01: ansible_host: 192.0.2.1 ansible_user: >- {{ lookup('community.hashi_vault.hashi_vault', 'secret=test_servers/data/' + inventory_hostname + ':username', validate_certs=false) }} ansible_password: >- {{ lookup('community.hashi_vault.hashi_vault', 'secret=test_servers/data/' + inventory_hostname + ':password', validate_certs=false) }} server02: ansible_host: 192.0.2.2 ansible_user: >- {{ lookup('community.hashi_vault.hashi_vault', 'secret=test_servers/data/' + inventory_hostname + ':username', validate_certs=false) }} ansible_password: >- {{ lookup('community.hashi_vault.hashi_vault', 'secret=test_servers/data/' + inventory_hostname + ':password', validate_certs=false) }} - ポイント
-
Playbook例
vault_server_cred_display.yml--- - name: Fetch server credential and display hosts: all gather_facts: false tasks: - name: Display server info ansible.builtin.debug: msg: - "IP Address: {{ ansible_host }}" - "Username: {{ ansible_user }}" - "Password: {{ ansible_password }}" -
実行結果
- 以下のように、実行ログにサーバーの認証情報が表示されます(以下は実行ログの一部を抜粋)
TASK [Display server info] ***************************************************** ok: [server01] => { "msg": [ "IP Address: 192.0.2.1", "Username: user01", "Password: p@ssw0rd01" ] } ok: [server02] => { "msg": [ "IP Address: 192.0.2.2", "Username: user02", "Password: p@ssw0rd02" ] }
さいごに
本記事では、AnsibleとHCP Vaultを組み合わせて、認証情報の登録・取得を自動化する方法を紹介しました。
これにより、クラウドを問わず、セキュアかつ効率的に認証情報を管理できることがご理解いただけたかと思います。
運用の自動化やセキュリティ強化を目指す方は、ぜひHCP VaultとAnsibleの活用を検討してみてください。
参考URL
-
community.hashi_vault
-
community.hashi_vaultコレクションのモジュール一覧
-
-
community.hashi_vault.hashi_vault
-
community.hashi_vault.hashi_vaultLookupプラグインの使い方
-
