Ansibleでパスワードなどの機密情報を暗号化して管理する

カテゴリ: Ansible

Ansibleでサーバをプロビジョニングする際、データベースのパスワードなどの取り扱いに注意を要する機密情報を扱う場合があります。

Ansibleで機密情報を管理したい場合ansible towerなどの別プロダクトを使う方法もあるのですが、簡単に情報管理したい場合はどうすれば良いでしょうか?

ansibleの変数を別ファイルで管理する

Ansibleでは変数を定義することができ、また変数定義のみを以下のようにvar_filesで指定することが可能です。

  • playbook.yml
- hosts: localhost
  vars_files:
    - credentials.yml
  tasks:
    - debug: "msg='database user is {{ db_user }}'"
  • credentials.yml
[localhost:vars]
db_user: sakila
db_password: passw0rd

上記2つのファイルを用意してplaybookを実行すると、以下のように別ファイルで定義した変数をplaybookから参照できていることがわかります。

$ ansible-playbook playbook.yml

TASK [debug] ***************************************************************
ok: [localhost] => {
    "msg": "database user is sakila"
}

PLAY RECAP *****************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0

gitでansibleの定義を管理している場合、.gitignoteにcredentials.ymlを追加しておき、このファイルだけ別管理すれば機密情報だけを別管理することができます。

credentials.ymlを暗号化してgitで管理する

ですが作業の都合上credentials.ymlの機密情報も合わせてgit管理したい場合もあります。
このような場合に備えて、Ansibleでは、Vaultというファイルを可逆暗号できる仕組みがあります。

vaultを使いたい場合は、まずは以下のようにansible-vault encryptコマンドでファイルを暗号化します。 コマンドを実行するとパスワードの入力が求められるので、適切なパスワードを入力します。

$ ansible-vault encrypt credentials.yml
New Vault password:
Confirm New Vault password:
Encryption successful

ansible-vault encryptコマンドを実行後にcredentials.ymlをみると以下のように暗号化されています。

$ more credentials.yml

$ANSIBLE_VAULT;1.1;AES256
31376335636462366133356533386238633539323634666564386436623466396433666161343664
3832303233376236306463616466633139353830323335350a373633323361373636666331313934
34643234646534343031653535643164643762313438663531656362636136653036656331376436
6664656336306133390a343730396431653861666631663762376232336161386537623263623465
37303063636632306632636535643338643337653331303830653965386339626534393631376262
3865363335346637623136353262623832626566303332626261

暗号化された機密ファイルを使ってプロビジョニングを行うためには、'--ask-vault-pass'オプションをつけてansible-playbookコマンドを実行します。すると、以下のように'Vault password:'とパスワードの入力を求められます。暗号化した時に指定したパスワードを入力することで復号化が行えます。

$ ansible-playbook --ask-vault-pass playbook.yml
Vault password:
TASK [debug] ************************************************************************************
ok: [localhost] => {
    "msg": "database user is sakila"
}

PLAY RECAP **************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0

こうしておくことで、機密情報を暗号化できるので、credentials.ymlも含めてgitで管理することが可能となります。

ansible-vaultの復号エラー例

ansible-vaultで暗号化したファイルを持っているにも関わらず、復号に失敗した時のエラーメッセージ例を以下にします。

パスワードを間違えた場合は、以下のようにError in vault password promptエラーが出力されます。

$  ansible-playbook --ask-vault-pass playbook.yml
Vault password:
 [WARNING]: Error in vault password prompt (default): Invalid vault password was provided

暗号化したにも関わらず'--ask-vault-pass'オプションをつけ忘れた時は、復号化を試みたがsecretが無いというエラーが出力されます。

$ ansible-playbook playbook.yml
ERROR! Attempting to decrypt but no vault secrets found

CIを使って自動化したい場合

CIで実行するなど非対話での実行が必要な場合は、パスワードを別ファイルに書いておき、--vault-password-fileオプションを使って指定することも可能です。

$  ansible-playbook --vault-password-file vault-password.txt

指定するファイルに実行許可をつけておくと、ansible-playbookはこのコマンドを実行し、標準出力の内容をパスワードとみなします。

$ chmod o+x password.sh
$ ansible-playbook --vault-password-file password.sh

ansible-vault encryptの内容を復号化する

機密情報を追記や更新したい場合は、ansible-vault viewで復号化したテキストを取り出すことができます

$ ansible-vault view credentials.yml
Vault password:
db_user: sakila
db_password: passw0rd

パスワードを変更する

ansible-vault encryptで暗号化したファイルのパスワードを変えたい場合は一旦復号化してから別のパスワードで暗号化しなおしても良いのですが、ansible-vault rekeyコマンドを使うことでパスワードの変更も行えます。

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。