Ansible-Vaultを用いた機密情報の暗号化のTips

# はじめに
Ansibleを用いたコードによるインフラ構成管理を実践しようとすると、機密情報の扱いに困る事があると思います。具体的には以下のような情報をレポジトリ管理に入れたい時です。

- AWSのcredential
- DBのパスワード
- facebook_appのapp_secret

せっかくミドルウェアやネットワーク設定等をコード管理している( =テスト回したりコードレビューできる) のに、一部の情報だけサーバのローカル上で管理とかも嫌ですよね。
とはいえ、これら機密情報を万が一間違ってpublicなgithubレポジトリ等にあげた日には
Bitcoin採掘屋さんに目をつけられ多大な請求が、、、なんて事にもなりかねません

# Ansible-Vaultとは
Ansibleで提供されている、暗号/復号化用パスワードを用いてyamlファイルを暗号化する仕組みです。これを用いる事で、機密情報を暗号化した状態で保存する事ができます。
一例ですが、サーバプロビジョニング発射台を以下のような構成にしておけば、機密情報を安全にgithub等で管理しつつ、Playbook実行時にこれら変数を利用する事が可能です。

- Ansible実行サーバをVPC等でセキュアレイヤーに配置。外部からの接続を受け付けさせない
    - bastinサーバ等経由でのみ接続を許可、直接外部からのsshとかさせない
- パスワード自体は上記サーバ上の足元に設置(= レポ管理に入れない)
- 機密情報はAnsible-Vaultを用いて上記パスワードで暗号化した状態でgithub上で管理
- タスク実行時は足元のパスワードファイルをplaybookに渡してやり、動的に復号化させる

# 使い方

## 暗号化するファイルを作成する
```
cd path/to/ansible-dir
ansible-vault create secret.yml

# 暗号化/復号化に用いるパスワードを求められる
Vault password
Confirm Vault password:
```

## 暗号化するファイルの中身を記述する
```
secret:
  aws:
    auth_access_key: hoge
    auth_secret_key: huga
  database:
    db_write_user_password: hoge
    db_read_user_password: huga
```

## 復号
``` 
# パスワードをサーバ上のローカルファイルに保存
echo "パスワード" > ~/.vault_password

ansible-vault decrypt secret.yml --vault-password-file ~/.vault_password
```

## 編集
```
ansible-vault edit secret.yml --vault-password-file ~/.vault_password
```

# 精製物
```
# cat secret.yml

$ANSIBLE_VAULT;1.1;AES256
37333339613364646664643061356161303036613666333165343633346164663666663730633530
3935656635623537346339643433313166393166346434380a313433356566303634316366386335
36663339306161616362623636633439636663306136623337333533643964303138663036336137
3233643130373862650a653261636463373965636261363061373565646534636333323239633139
34656362663061323866353665313036343435613637636537396633643235336664393063393531
35326431613531623437343161653033396666646635623435653066393537346163366130643062
64353131363365616166373833613665633731316138316234636330616237343464393338326137
61343362316566383965303663303831393139363531373663333135346365653536626531663637
65396634383161633233613937393635343530303263643630303363643864666131373331626537
39663638326561363162666563306236383036633663393632613431376262343537353562363537
62633335313561326465373564396365626537376138643461383938626236313038386632363164
61333535393635643462323964646366303933646133353737353732663035636538623465333937
63653262653939663433623630373636663466356465376162363430323435303837343466623935
64313361613862643861666334303661656465333464626332363535336631383531643332396233
61633666323939303765636466643037626661653730646339353539656466306361663035646535
36333665316562666430373765633333633263333061393936326137666531373565316563623836
39643633613762613264343530366338616332663037366237663938303536303763613838396364
39333834663931303338323862313234376235633562653132313737396233653066633932343934
65653739313161343065636430663636363863363630653232376663653666376236396662393533
34336132383162636335353865316137623631396137663166663163393032396331383236373665
34663239386230636337636336313365633865373135346530613061346435646337343030646337
63396132383862313939663338376236626330333662303032323434376133626263313531393463
32343138633665636132626163343239323039383535393835363330363230366461623238303365
6335306533396466363763363234564675734583364376135326635306364666433623034333037393833323932
31363133663834393639643236643839643533666166366334666134653739343537666664636261
453543535353535353237326364306638346365343833383735346136383630316332356433396665
65323739623832633935656338393632623636663066306438323866633563303165326664623933
32393839356564343476757575737336434336263383966323832373930363539653239396637363231333932
37353762383036353937633861646462313033656637333939643361363961373366386236633833
6162356635663064653161626364396665376137623839316164
```

# playbook利用時

## playbook例
```
# test_mysql_provisioning.yml

- hosts: {{ Name }}
  sudo: yes
  user: test
  remote_user: test
  gather_facts: true
  vars_files:
    - secret.yml
  roles:
    - mysql
```

## 使い方
上記playbook例のように、暗号化したymlファイルを読みに行っている場合、
復号用のパスワードを外から渡してやる必要があります。

```
ansible-playbook test-mysql-provisioning.yml -i ec2.py --vault-password-file ~/.vault_password
```

また、configurationファイルの方に以下のように書いてしまえば勝手に読んでくれるので、
わざわざplaybook実行時に渡してやる必要もありません。

```
# cat .ansible.cfg

[defaults]
private_key_file = ~/.ssh/ansible_key
vault_password_file = ~/.vault_password
```