Windows上でAnsible Vaultの暗号文字列を作成する方法
はじめに
こんにちは。SHIFTインフラサービスグループの水谷です。
約4年に渡るグループ会社(RGAとシステムアイ)への出向が終わり、3月からはSHIFTでインフラ関連の仕事をしております(結局仕事内容はあまり変わってないw)。 ここ最近は特にAnsibleを使う案件が多くなっていることもあり、また少しずつAnsibleに関する記事を書いていきたいと思っています。
さて、今回のお題はAnsible Vaultです。Ansibleにおいてパスワードなどの機密データをPlaybookや変数ファイルに埋め込みたい場合、そのまま平文で埋め込むのはセキュリティ上問題がありますので、暗号化して埋め込むのが一般的です。Ansibleにはこのための機能として、Ansible Vaultが用意されており、よく使われています。
Ansible Vaultにはファイル全体を暗号化する機能と文字列を暗号化する機能の2つがあります。後者を利用し、例えばWindowsのユーザーを作成するPlaybookを作成すると、以下のような感じになります。
- name: Test Playbook
hosts: windows
tasks:
- name: create a test user
ansible.windows.win_user:
name: test
password: !vault |
$ANSIBLE_VAULT;1.1;AES256
33336462636363346261353865616538373435303038646264613331613730623063343936626666
3266626665643466356633366136333763616530626164610a666663383963333966643735356531
64356330633363323335393666383765633230653533623034326261373762636233343638656438
3538636333303735380a356539386466373163336331343166633861633938646133336663386261
3963
passwordパラメーターのところが暗号化されていて、Playbookを実行する際に復号化するためのAnsible Vaultパスワードをコマンドラインパラメーターなどで与えれば、パラメーターを復号化してから実行してくれます。
さて、Ansible Vaultのコマンドラインツールである「ansible-vault」は、(Playbookを実行するための「ansible-playbook」コマンドがそうであるのと同様に)Linux系OS上で動作するツールのため、Windowsマシンではそのまま実行することができません。それでも、Windows上でPlaybookの開発などを行っている場合はWindows上で実行したいケースも少なくないでしょう。
ということで、Windows上でAnsible Vaultの暗号を作成する方法(暗号化する方法)を3つ紹介したいと思います。
WSLを使う方法
1つ目は多くの人が思いつく方法ですが、WSL(Windows Subsystem for Linux)にインストールしたUbuntuなどのLinux系OS上でansible-vaultコマンドを実行する方法です。
WSL上のUbuntuにAnsibleをインストールすれば、ansible-vaultコマンドも一緒にインストールされますので、導入も簡単ですね。
以下は(ファイル全体ではなく)特定の文字列を暗号化する場合の実行例です。
mizutani@C-NPC-0577:~$ ansible-vault --version
ansible-vault 2.10.8
config file = None
configured module search path = ['/home/mizutani/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
executable location = /usr/bin/ansible-vault
python version = 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
mizutani@C-NPC-0577:~$ ansible-vault encrypt_string P@ssword
New Vault password:
Confirm New Vault password:
!vault |
$ANSIBLE_VAULT;1.1;AES256
33336462636363346261353865616538373435303038646264613331613730623063343936626666
3266626665643466356633366136333763616530626164610a666663383963333966643735356531
64356330633363323335393666383765633230653533623034326261373762636233343638656438
3538636333303735380a356539386466373163336331343166633861633938646133336663386261
3963
Encryption successful
当然といえば当然ですが、うまく暗号化できましたね。
ただし、たくさんの文字列を一気に暗号化したい場合、1つずつコマンドを打って暗号化された文字列をコピペしていては時間がすごくかかってしまいますし、ミスも起きます。
Linuxに慣れている人ならササっとシェルスクリプト書いてしまうことでしょうが、普段Windowsをメインに使っている人にとってはちょっと使いにくいかもしれないですね。
ansible-vault-win
次に紹介するのが、Pythonを使った方法です。Windowsに適当なバージョン(3.11など)のPythonをインストールしておき、pipで「ansible-vault-win」をインストールします。これで、Windowsのコマンドライン上からansible-vaultコマンドを実行することができるようになります。
さっそく実行してみましょう。
C:\Users\yuichi.mizutani.03>ansible-vault encrypt_string P@ssword
New vault password (default):
Confirm new vault password (default):
!vault |
$ANSIBLE_VAULT;1.1;AES256
64663033363133373265633436626361653439386161613133626139343535643233363335646463
3438326139613031333330346432303239613035383963610a643262373537386137623032343132
31636230633461346162616339396432613137386632326535393465663961626335616562373131
6261626338323734390a383839313932393437336365333561613563363934333333623230313636
3630
Encryption successful
WSL上で実行したのとほぼ同じ動き、同じ出力ですね。
これでしたらWindows上でも実行できるので、バッチファイルやPowershellなんかからも簡単に呼び出せるので、大量の文字列を暗号化したい場合も、(Windowsのバッチファイルやスクリプティングに慣れた人なら)簡単に短時間で実行できますね。
注意点としては、pipで「ansible-vault」をインストールしても(Windows上では)期待通りに動作せず、エラーメッセージが表示されます。「ansible-vault-win」をインストールしましょう。
Powershell AnsibleVaultパッケージ
最後の方法は、私の最も好きな方法なのですが、Powershell用のAnsible Vaultモジュールをインストールして使う方法です。
Red Hatのエンジニアと思われる方が作ってPowershellギャラリーで公開しているこれです。
https://www.powershellgallery.com/packages/AnsibleVault/0.3.0
インストールはこのページにも書いてある通り、Powershellプロンプトで以下を実行するだけです。
Install-Module -Name AnsibleVault
これでGet-EncryptedAnsibleVaultというコマンドが使用できるようになります。このコマンドのValueパラメータに暗号化したい文字列、PasswordパラメータにVaultのパスワードを与えて実行すれば暗号化してくれます。
例えばVaultパスワードが「VaultPassword!」で、暗号化したい文字列が「P@ssword」の場合は以下のように実行します。
$VaultPassword = ConvertTo-SecureString -string 'VaultPassword!' -AsPlainText -Force
Get-EncryptedAnsibleVault -Value "P@ssword" -Password $VaultPassword
結果は下のようになりました。
$ANSIBLE_VAULT;1.1;AES256
63306632343266646631616636376262386435313630333164383161336532366462356131313934
6261663364643731346233363633343834373933386362610a626639303836646362336663666264
38363837633734386466623864336566626136616631643039356433633738376366333666396234
6132623638343265370a663835666466363334333430646264616234656531636632343631366535
3538
VaultパスワードはSecureString型ですので、その点はご注意を。
このVaultパスワードを(ハードコードせずに)プロンプトで入力させたい場合は、
$VaultPassword = Read-Host -Prompt "Vault Password" -AsSecureString
とすればOKですね。
まとめ
もしかしたらこの3つ以外にも別の方法があるかもしれませんが、私はPowershellを普段よく使っていて、Ansibleのインベントリやホスト変数もPowershellスクリプトで生成したりするので、最後のPowershellモジュールは大変重宝しています。
Pythonが得意な方なら2つ目の方法が良いかもしれませんね。自分に合った方法で、ちょっと面倒な機密データの暗号化を自動化、あるいは効率化してみてはいかがでしょうか。
IaC支援サービスのご紹介
SHIFTではTerraformやCDKを使ったクラウドインフラ構築の自動化や、Ansibleを使ったサーバOSの設定自動化や構成管理のご支援も行っております。ご依頼・ご相談は下記リンクからお願いします。
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/
PHOTO:UnsplashのTowfiqu barbhuiya