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_ADDRVAULT_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に保管したデータが書き出されるのが確認できる!