Ansible Vaultのベストプラクティス

Ansible Vaultのベストプラクティス

はじめに

Ansible Vaultは、パスワード等の機密情報を暗号化できます。暗号化は、ファイル単位、変数単位のどちらにも対応していますが、単純に使うと、いずれも下記のデメリットが発生します。

  • ファイル単位

    ファイル全体が暗号化されてしまうため、メンテナンス時にgrepなどで探してもヒットしない

  • 変数単位

    ansible-vault encrypt_stringコマンドで対象の文字列を暗号化する必要があるため、historyに機密情報が残る

これらを解決するために、公式ドキュメントでは、間接的な層を使って暗号化することを推奨しています。

docs.ansible.com

ディレクトリ構成

間接的な層を使うとは、暗号化したファイルとは別に、暗号化したファイルを参照するファイルを作成しておくことです。group_varsの場合、下記のような構成を指します。

group_vars/
`-- db
    |-- vars.yml    # 暗号化しない。vault.ymlを参照。
    `-- vault.yml   # 暗号化する。

グループ変数ファイルの中身

vault.yml

ansible-vaultコマンドで暗号化する想定です。機密情報を記載します。機密情報の変数は、わかりやすいようにvault_プレフィックスを付けて定義します。

---
vault_db_password: dbpass

vars.yml

こちらは暗号化しません。機密情報にあたる変数のみ、vault.ymlを参照するよう定義します。

---
db_user: dbuser
db_password: "{{ vault_db_password }}"

Playbook

変数を参照する際は、vars.ymlに記載した変数名を指定します。

- hosts: db
  gather_facts: false
  connection: local
  tasks:
    - debug:
        msg: "{{ item }}"
      loop:
        - "{{ db_user }}"
        - "{{ db_password }}"

実行結果

# ansible-vault encrypt group_vars/db/vault.yml 
New Vault password: 
Confirm New Vault password: 
Encryption successful
# ansible-playbook -i inventory.ini vault_test.yml --ask-vault-pass
Vault password: 

PLAY [db] ***********************************************************************************

TASK [debug] ********************************************************************************
ok: [db01] => (item=dbuser) => 
  msg: dbuser
ok: [db01] => (item=dbpass) => 
  msg: dbpass

PLAY RECAP **********************************************************************************
db01                       : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

おわりに

商用環境の場合、この手の暗号化はAnsible Towerの認証情報機能を利用するケースが多いと思いますが、メンテナンス性を意識した変数暗号化のあり方は、参考になるかもしれません。

docs.ansible.com