RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

Ansible Vault使い方 〜暗号化のための2つの方法〜

皆さんこんにちは。インフラエンジニアやってます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つのファイル丸ごと
  2. 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 viewansible-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つのファイル丸ごと
    • メリット:暗号化したファイルの確認・修正が簡単にできる
    • デメリット:変数名も一緒に暗号化されてるため変数の追跡がしづらい
  2. 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 viewansible-vault editで扱えない要因のため、
イイ感じに不要な部分を除去してやると、ansible-vault viewansible-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コマンドなどを実行する前にインテンドや変数名の行を再度追加する必要があるので注意


エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
20210916153018
https://career-recruit.rakus.co.jp/career_engineer/

カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.com

ラクスDevelopers登録フォーム
20220701175429
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/

イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!

◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.