皆さんこんにちは。インフラエンジニアやってますkumakichi_kunです。
ついこの間、、、かと思いましたがそうでもないですね、、、
数年前に業務でAnsible Vault
を導入しようとした際に私自身すごく困ったことがあるので、
コマンド例や注意ポイントなどをご紹介いたします。
Ansible Vaultってなに?
Ansible内で平文のまま扱いたくない情報を暗号化する機能です。(Ansibleバージョン:v1.5以降?)
ファイルの実体としては以下のようなUTF-8でエンコードされたテキストですが、
$ANSIBLE_VAULT;1.2;AES256;test 64623535646465656235363633623431396365666237653663633962616437663239343762356463 3833333531663736656533643734303763393835383663650a386231626230373937666331306536 36613136303934643733346566346366653434643039626535646637353230663839353234363039 6364353566643030620a323733616636666131656263373336383233303636376339316634363061 3262
ansible-playbook
コマンドなどを実行する際には内部で以下のように認識される仕組みになります。
this_is_txt
補足①:本記事でのansible実行環境の情報 (バージョンの古さはスルーしていただけると...)
$ ansible --version ansible 2.7.10
補足②:なんでAnsible Vaultが必要だったの?
AnsibleのrootディレクトリをGit上の1PJと紐づけて、バージョン/履歴管理を行っており、
- Ansible内で平文のまま扱われる=Git上で見えてしまう⇒公開される範囲が適切じゃない
という課題が当時存在しました(PJの公開範囲が問題じゃないか、というのは置いておいて、、、)。
これが要因でパスワードの管理をAnsibleとは別のところでやっていたってのが、当時一番解消したいことでした。
これを解決するためAnsible Vault導入を始めました。
ここから本題:Ansible Vaultの紹介
Ansible Vaultでの暗号化は以下2つのパターンがあります。
- 1つのファイル丸ごと
- 1つの変数のみ
それぞれについてコマンドの実行例などとともにご紹介していきます。
1. 1つのファイル丸ごと
1つのファイルの中身をまるっと暗号化する形式です。(そのまんまですねw)
- 暗号化されてる状態
$ANSIBLE_VAULT;1.2;AES256;test 64623535646465656235363633623431396365666237653663633962616437663239343762356463 3833333531663736656533643734303763393835383663650a386231626230373937666331306536 36613136303934643733346566346366653434643039626535646637353230663839353234363039 6364353566643030620a323733616636666131656263373336383233303636376339316634363061 3262
- 復号された状態
this_is_txt
上記のサンプルとして記載しているファイルを作成した際の過程をご紹介します。
# ファイルをvimで作成 $ vim encrypt_file $ cat encrypt_file this_is_txt # 暗号化するためのパスワードファイルを作成 $ vim .vault_password_file $ cat .vault_password_file test_password # ↑で作成していたtxtファイルを暗号化(--vault-idオプションにパスワードファイルを指定) $ ansible-vault encrypt --vault-id test@.vault_password_file encrypt_file $ cat encrypt_file $ANSIBLE_VAULT;1.2;AES256;test 64623535646465656235363633623431396365666237653663633962616437663239343762356463 3833333531663736656533643734303763393835383663650a386231626230373937666331306536 36613136303934643733346566346366653434643039626535646637353230663839353234363039 6364353566643030620a323733616636666131656263373336383233303636376339316634363061 3262 # 暗号化したファイルを復号して確認 $ ansible-vault view --vault-id test@.vault_password_file encrypt_file this_is_txt # 暗号化したファイルを復号して修正 $ ansible-vault edit --vault-id test@.vault_password_file encrypt_file ⇒viが起動するので修正 # ↑で修正したファイルの実体を確認 $ cat encrypt_file $ANSIBLE_VAULT;1.2;AES256;test 39643730306632346466383636663961306437333833303931343937376531316363656634393863 3864663636356461613434643036356234323034626234640a323635666362373936356465653534 37343132653463363732653635393037363436366663343262656433663232393338613036656233 6262373666656436340a343865393663323066353430663431653731333966643862653736646632 3334 # 暗号化したファイルを再度復号して確認 $ ansible-vault view --vault-id test@.vault_password_file encrypt_file this_is_txt2
※各コマンドオプションなどの詳細については公式ドキュメントや私自身が参考にさせていただいた記事のご紹介だけにとどめておきます。
上記のようなencrypt_file
の作り方はいくつかやり方があるので、
こちらを参考に環境などに合わせて、適切な方法を選択していただければ。
この形式には、
- 暗号化した後に中身の確認や修正が簡単にできる
って特徴があります(後述する1つの変数のみ
形式との比較になりますが)。
コレが特徴?って思う方もいるかもしれませんが、
次にご紹介する1つの変数のみ
のご紹介を見てもらえると理解してもらえるかなぁ~と思います。
2. 1つの変数のみ
1つの変数のみを暗号化する形式です。(急募:ネーミングセンス)
変数名は暗号化せず、変数の中身だけ暗号化された状態をansible-playbook
コマンドなどで扱えます。
- 暗号化されてる状態
password_vars: !vault | $ANSIBLE_VAULT;1.2;AES256;test 36656531623938393464666363353630333865316435346533303035663965323862383666356437 3938613939663031343436663634623833396630373965370a306532643662353931313839393735 66623034373862626262333735363461386339373666663935383431383266656463323333393433 3331363264383963300a303039343335666134313862616633663634313035616165376437386436 32343966366636643061643439383235356236303533616566316432616566336330
- 復号された状態
password_vars: this_is_password
上記のサンプルとして記載している変数を作成した際の過程をご紹介します。
# 暗号化するためのパスワードファイルを作成 $ vim .vault_password_file $ cat .vault_password_file test_password # ↑で作成していたtxtファイルを暗号化(--vault-idオプションにパスワードファイルを指定) $ ansible-vault encrypt_string --vault-id test@~/.vault_password_file --stdin-name password_vars Reading plaintext input from stdin. (ctrl-d to end input) this_is_password ←ココでCtrl+D入力 ※ENTERを入力してしまうと末尾に改行が含まれてしまうので要注意 password_vars: !vault | $ANSIBLE_VAULT;1.2;AES256;test 36656531623938393464666363353630333865316435346533303035663965323862383666356437 3938613939663031343436663634623833396630373965370a306532643662353931313839393735 66623034373862626262333735363461386339373666663935383431383266656463323333393433 3331363264383963300a303039343335666134313862616633663634313035616165376437386436 32343966366636643061643439383235356236303533616566316432616566336330 # ↓のようにコマンドラインで暗号化したい文字列を指定するやり方もありますが、 # historyに残ってしまうのであまり好ましくありません(知られたくない文字列のハズなので) # ansible-vault encrypt_string this_is_password --vault-id test@~/.vault_password_file --name password_vars # ↑で生成した文字列をtxtに追記 $ vim encrypt_vars $ cat encrypt_vars password_vars: !vault | $ANSIBLE_VAULT;1.2;AES256;test 36656531623938393464666363353630333865316435346533303035663965323862383666356437 3938613939663031343436663634623833396630373965370a306532643662353931313839393735 66623034373862626262333735363461386339373666663935383431383266656463323333393433 3331363264383963300a303039343335666134313862616633663634313035616165376437386436 32343966366636643061643439383235356236303533616566316432616566336330
この方法には以下の注意点があります。
- 復号化した状態を修正/確認するのが手間(1つのファイル丸ごととは異なり)
変数名:(平文)+vaultで暗号化した文字列
という構造になってる関係で
ansible-vault view
やansible-vault edit
などのCLI上で復号ができません。
ansible-playbook
コマンドなどでdebugモードで実行すれば中身の確認ができます。
(今回利用しているv2.7での挙動ですが、今後のバージョンアップで機能追加されそうな部分な気がします)
memo)Ansible Vaultの歴史というか流れのようなもの
Ansible Vaultリリース当初(v1.5)はファイル丸ごとの暗号化しかできなかった
→その後、変数部分のみ暗号化が機能追加されてリリース(2.2か2.3~)
v1.5当時?に書かれたもの:https://qiita.com/yteraoka/items/d18e3c353b6e15ca84a8
機能追加時の参考:https://qiita.com/yunano/items/86d3f9beb678adbff50d
v1.5のタイミングはやはりファイル丸ごと暗号化するってのは不便な時があったようで、、、
当時は変数ファイルを分割するなどで対処していたようです。
※この対処法自体は今でも有効に活用できるので、頭の片隅にでも置いておくといいかもしれません。
まとめ
暗号化の単位(というか範囲)は2パターンあるよ!
- 1つのファイル丸ごと
- 1つの変数のみ
それぞれメリットとデメリットがあるよ!
- 1つのファイル丸ごと
- メリット:暗号化したファイルの確認・修正が簡単にできる
- デメリット:変数名も一緒に暗号化されてるため変数の追跡がしづらい
- 1つの変数のみ
- メリット:変数の追跡がラクにできる
- デメリット:暗号化した変数の確認・修正が手間
結論)暗号化する対象を見極めて、 1つのファイル丸ごと
と1つの変数のみ
の形式をうまく使い分けようね!
具体例)
秘密鍵ファイルを暗号化したい!
⇒ファイル丸ごとで暗号化!環境変数とか対象ホスト毎に変えているvarsも暗号化したい!
⇒変数のみ暗号化して既存varsファイルに追記!今はべた書きになってるけど、ココの文字列も暗号化しときたいな~
⇒とりあえず変数とtemplateに分けておく!暗号化するか否かはチーム内で議論して決めよう何かめっちゃ暗号化してる変数増えてきてんな...
暗号化してる変数だけ別のvarsファイルに出してファイル丸ごと暗号化しちゃえ
⇒変数を追跡するのが難しくなり、チーム内の合意がないと混乱を招きます!(実体験)
変数ファイルの丸ごと暗号化は慎重にやりましょう
おわりに
今回Ansible Vaultについてご紹介しました。
この記事がどなたかの助けになれば幸いです。
ちょっとした小技集(蛇足あるいは自分用のメモ)
- ラベル差し替え
ラベルってなんだろう?って方はこちら。
ラベルって機能を利用してpasswordと暗号化する部分を紐づけていますが、間違えてラベルを付加してしまうことがあります。。。
その場合、ラベル部分のみは平文で記載&ansible-vault
コマンド内部で処理されているようで、vim
などで直接編集することが可能です。
(v2.7ではラベルって機能自体が追加オプションを設定しないとあまり意味がない状態ではありますが...)
$ cat encrypt_file $ANSIBLE_VAULT;1.2;AES256;hoge ←ココの末尾がtestになっていてほしかった 64623535646465656235363633623431396365666237653663633962616437663239343762356463 3833333531663736656533643734303763393835383663650a386231626230373937666331306536 36613136303934643733346566346366653434643039626535646637353230663839353234363039 6364353566643030620a323733616636666131656263373336383233303636376339316634363061 3262 $ ANSIBLE_VAULT_ID_MATCH=true ansible-vault view --vault-id test@.vault_password_file encrypt_file ERROR! Decryption failed (no vault secrets were found that could decrypt) on encrypt_file for encrypt_file
ANSIBLE_VAULT_ID_MATCH=true
を追加してansible-vault view
などを実行するとエラーになっちゃいますが、、、
vimで直接修正しちゃえば、、、
$ vim encrypt_file $ANSIBLE_VAULT;1.2;AES256;test ←ココをtestに修正 64623535646465656235363633623431396365666237653663633962616437663239343762356463 3833333531663736656533643734303763393835383663650a386231626230373937666331306536 36613136303934643733346566346366653434643039626535646637353230663839353234363039 6364353566643030620a323733616636666131656263373336383233303636376339316634363061 3262 $ ANSIBLE_VAULT_ID_MATCH=true ansible-vault view --vault-id test@.vault_password_file encrypt_file this_is_txt
同一のコマンドで確認できるようになりました!
(ANSIBLE_VAULT_ID_MATCH=true
を外せばイイじゃないか、というのは置いておいて...)
・変数のみの暗号化している部分を修正する
変数名:(平文)+vaultで暗号化した文字列
という構造がansible-vault view
やansible-vault edit
で扱えない要因のため、
イイ感じに不要な部分を除去してやると、ansible-vault view
やansible-vault edit
で扱えるようになります。
$ cat encrypt_vars password_vars: !vault | $ANSIBLE_VAULT;1.2;AES256;test 36656531623938393464666363353630333865316435346533303035663965323862383666356437 3938613939663031343436663634623833396630373965370a306532643662353931313839393735 66623034373862626262333735363461386339373666663935383431383266656463323333393433 3331363264383963300a303039343335666134313862616633663634313035616165376437386436 32343966366636643061643439383235356236303533616566316432616566336330 $ vim encrypt_vars 1) 変数名の行を削除 2) インテンドを削除 ↓ $ANSIBLE_VAULT;1.2;AES256;test 36656531623938393464666363353630333865316435346533303035663965323862383666356437 3938613939663031343436663634623833396630373965370a306532643662353931313839393735 66623034373862626262333735363461386339373666663935383431383266656463323333393433 3331363264383963300a303039343335666134313862616633663634313035616165376437386436 32343966366636643061643439383235356236303533616566316432616566336330 $ ansible-vault view --vault-id test@.vault_password_file encrypt_vars this_is_password
⇒変数password_vars
の中身が確認できます!(editもできるよ!)
※↑の状態だと変数password_vars
と認識できないので、ansible-playbook
コマンドなどを実行する前にインテンドや変数名の行を再度追加する必要があるので注意
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/
カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.com
ラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/
イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com