Using HashiCorp's Vault with Ansible
ansibleのプレイブック内にある機密情報(dbのパスワードとか)をVault by HashiCorpを使ってvaultの管理下に置いてみようと思う
イメージ的には、今までプレイブックにこんな感じで平文で書かれていたものを、
password="1234abcd"
こんな感じでプレイブック内に書かないようにしたい
password="{{vaultからいい感じに取ってくる何か}}"
確かにこれでプレイブックには含まれなくなるけど、外部のデータストアに機密情報置くことになるけどそこは安全なのか問題がここで発生する
でもvaultはそんな悩みを解決するためのツールだからいい感じに かつ安全に機密情報を管理してアプリケーションからいい感じに機密を使えるであろうことを激しく期待!禿北!!
準備
Ansible Lookup Plugin
Lookup Pluginを使ってみる
Lookup Pluginとは外部ソース(ローカルのファイルや外部のデータストア等)からansible内のデータへのアクセスを可能にしてくれるプラグイン機能
vaultのapiを叩いてその値を利用できそうな雰囲気を醸し出している
探したらあった!jhaals/ansible-vault
中身は単純に、httpを話すライブラリを使ってvaultのapiを叩き、結果を返すものだった
これを以下のpathに設置する
.ansible/plugins/lookup_plugins/vault.py
そして、このプラグインのpathをansible.cfgで指定する
[defaults]
lookup_plugins = .ansible/plugins/lookup_plugins
Vault
Vault on Arukasで試した通り、arukasにvaultを立てておく
立てたらvaultをアンシールしてトークンを取得しておく。参考
そしてjhaals/ansible-vaultのREADMEにあるとおり、VAULT_ADDR
とVAULT_TOKEN
環境変数を設定しておく
debugで試してみる
とりあえずいきなりdbのパスワードで試さずに、debugモジュールを使ってvaultから値を取ってこれるか、試してみる
テスト用のキーバリューをvaultに登録する
$ curl -s -X POST -H "X-Vault-Token:$VAULT_TOKEN" -H "Content-Type: application/json" -d '{ "value": "1234abcd" }' $VAULT_ADDR/v1/secret/test
$ curl -s -X GET -H "X-Vault-Token:$VAULT_TOKEN" $VAULT_ADDR/v1/secret/test | jq .
{
"lease_id": "",
"renewable": false,
"lease_duration": 2592000,
"data": {
"value": "1234abcd"
},
"warnings": null,
"auth": null
}
タスクに以下を追加する
- name: try ansible-vault
debug: msg="{{ lookup('vault', 'secret/test') }}"
tags: debug
プレイブック実行すると、デバッグメッセージにvaultに保管したデータが書き出されるのが確認できる!