間違った手に落ちないように秘密を守ることは最優先事項です。しかし、具体的にどのように秘密を保護するのでしょうか?ローカルのテキストファイルに保存することは、暗号化されていないためリスクが高すぎます。なぜAnsible Vaultを使用して変数やファイルを暗号化しないのでしょうか?
このチュートリアルでは、Ansible Vaultを使用してパスワードやキーなどの機密情報を安全に保護する方法を学びます。
続けて読み、のぞき見から秘密を守りましょう!
前提条件
このチュートリアルは実際のデモンストレーションです。一緒に進める場合は、以下のものを準備してください。
- A Linux machine – This tutorial uses Ubuntu 20.04, but any Linux distribution will work.
- マシンにAnsibleがインストールされていること。
デフォルトのAnsible Vaultエディタの設定
システム管理者として、さまざまなサーバーのユーザー名とパスワードを含むさまざまなAnsibleプレイブックに取り組んでいるかもしれません。これらのファイルを平文形式でバージョン管理システムにコミットすることはできません。なぜなら、それは安全ではないからです。そのため、Ansible Vaultが役立ちます。
Ansible Vaultは、データを暗号化ファイルに格納するために既存のワークフローに統合するように設計されています。ただし、最初のAnsible Vaultを作成する前に、デフォルトのAnsible Vaultエディタを設定する必要があります。
1. ターミナルを開き、マシンにSSHします。
2. 次に、テキストエディタを使用して~/.bashrcファイルを開きます。 ~/.bashrcファイルは、新しいターミナルセッションが開始されるたびに実行されるシェルスクリプトです。 このシェルスクリプトは、対話型のシェルセッションを初期化し、環境変数を定義します。
3. ~/.bashrcファイルの末尾に次の行を追加し、変更内容を保存してエディタを終了します。
この行は、現在ログインしているユーザーのEDITOR変数を設定します。 EDITOR変数は、新しいターミナルセッションを開くたびに好みのテキストエディタが使用されることを保証します。
他の好みのテキストエディタを設定できますが、このチュートリアルではnanoテキストエディタを使用します。

4. 最後に、以下のコマンドを実行して変更内容(source)をログアウトせずに適用し、システムの現在のデフォルトテキストエディタを表示します。
以下に示すように、EDITOR変数が好みのエディタに設定されていることを確認してください。

最初のAnsible Vaultを作成して暗号化する
デフォルトのボールトエディターを設定したので、最初のボールトを作成する時間です。機密情報(ユーザー名、パスワード、秘密アクセスキーなど)が含まれるファイルを作成して暗号化します。
あなたはansible-vaultコマンドを実行し、Ansible Vaultsとのやり取りのメインインターフェースを操作します。
1. 次のコマンドを実行してsecret.ymlファイルを作成します。AnsibleはYAMLを使用し、他のデータ形式(JSONなど)と比較してより人間に読みやすい形式です。
ファイルのパスワードを入力して確認するように求められます。後でファイルを暗号化および復号化するためにこのパスワードを使用しますので、覚えやすい強力なパスワードを選択してください。secret.ymlファイルを。

2. ボールトのパスワードを設定した後、デフォルトのテキストエディターが空のファイルを開きます。ファイルに保存する機密情報を入力し、エディターを保存して閉じます。
このチュートリアルでは、secret.ymlファイルにaws_access_keyとaws_secret_key変数を保存します。この時点で、Ansibleはsecret.ymlファイルを暗号化し、他の誰もがボールトの内容を読むことはできません。

3. パスワードなしでsecret.ymlファイルの内容を表示しようとするためにcatコマンドを実行します。
ファイルの内容が暗号化されているかどうかは、以下のようにランダムな数字が表示されている場合に確認できます。ファイルの先頭にある$ANSIBLE_VAULT;1.1;AES256ヘッダーは、AES256暗号を使用してAnsible Vaultでファイルが暗号化されていることを示しています。
高度な暗号化標準(AES)は、同じ鍵を使用してデータを暗号化および復号化する対称キー暗号アルゴリズムです。

既存のファイルを暗号化する
自動的に暗号化されたファイルを作成しましたが、既存のファイルを暗号化する方法はどうでしょうか? Ansibleには、指定したファイルを暗号化するencryptサブコマンドも提供されています。既存のファイルを暗号化する方法を確認するには、Ansible変数を含む特定のファイルを暗号化します。
次のコマンドを実行して、ファイル(vars.yml
)を暗号化します。
最初にsecret.ymlファイルを作成したときと同様に、vars.ymlファイルのパスワードを入力するように求められます。
デフォルトのエディターは今回は開かれません。なぜなら、vars.ymlファイルが既に存在しているからです。その代わりに、Ansibleがファイルを暗号化したことを示す暗号化が成功しましたというメッセージが表示されます。

次に、以下のcatコマンドを実行して、Ansibleがvars.ymlファイルを暗号化したことを確認します。

Ansible Vaultからデータを復号化する
ご覧になった通り、ファイルを暗号化してセキュリティを確保する方法を知っていますね。しかし、ファイルの内容を表示する必要がある場合、どのようにしてファイルを復号化しますか?ファイルを復号化すると、暗号化されたファイルを編集したり、毎回パスワードを提供せずにその内容を読んだりするときに便利です。そして、Ansibleのdecryptサブコマンドが役立ちます。
1. 次のコマンドを実行して、secret.ymlファイルを復号化します。
decryptサブコマンドは、暗号化されたファイルのパスを唯一の引数として受け取ります。
ファイルのパスワードを提供し、ファイルの内容が復号化されて平文でディスクに書き込まれます。

2. 次に、catコマンドを実行してsecret.ymlファイルの復号化された内容を表示します。
ターミナルにsecret.yml ファイルの内容が暗号化されていない状態で印刷されます。この時点でファイル内の行を自由に追加、編集、または削除できます。

3. 最後に、以下のコマンドを実行して secret.yml ファイルを暗号化し、ファイルの内容を安全に保つためのパスワードを提供します。

Ansible Vaultのパスワードの更新
ファイルを暗号化および復号化する際に毎回パスワードを入力する必要があることがわかりましたが、おそらくファイルを復号化せずにパスワードを更新したい場合があります。その場合は、rekey
サブコマンドを使用する必要があります。このサブコマンドを使用すると、ファイルのパスワードを自由に変更できます。
以下のコマンドを実行して、secret.yml
ファイルのパスワードを更新します。
rekeyサブコマンドは、暗号化されたファイルのパスを唯一の引数として取ります。
ファイルの現在のパスワードを入力し、以下に示すように新しいパスワードを入力してください。
この時点で、古いパスワードではファイルを復号化できなくなります。

次に、以下のコマンドを実行してsecret.yml
を復号化しようとしてください。
プロンプトが表示されたら、古いパスワードを入力し、Decryption failedというエラーメッセージが表示されることを確認します。この出力は、ファイルのパスワードが正常に更新されたことを確認します。

Playbooksとモジュールでセキュアなデータを使用する
ファイルの暗号化と復号化コマンドが機能することを確認しました。ただし、アプリケーションのセキュリティを確保してプロセスを自動化する場合は、Playbooksとモジュールを使用する必要があります。
1. Ansibleの設定を含むAnsible構成ファイル(~/.ansible.cfg)をエディタで開きます。
以下のコードを~/.ansible.cfgファイルの末尾にコピーして貼り付け、変更内容を保存してエディタを閉じます。このコードは、Ansibleにインベントリファイル(~/.ansible-hosts)を探すよう指示します。
2. 次に、Ansibleが管理ノードで管理できるホストのインベントリを含む~/.ansible-hostsファイルを開きます。
以下のコードを~/.ansible-hostsファイルに追加し、変更内容を保存してファイルを閉じます。このコードは、Ansibleがローカル接続タイプを介してlocalhostを管理できることを指示します。
3. 以下のコマンドを実行して新しい暗号化されたファイルを作成します。ファイルには任意の名前を付けることができますが、このチュートリアルではファイル名をhelloworld.ymlとしています。

helloworld.ymlファイルに以下のコードを入力し、変更を保存してエディターを閉じます。
このコードは、インベントリ内のすべてのホストにhello worldメッセージを表示する基本的なAnsibleプレイブックです。コードブロックの先頭の—記号は、YAMLドキュメントの開始を示しています。
4. 最後に、以下のansible-playbookコマンドを–ask-vault-passオプションと共に実行して、インベントリ内のすべてのホストでhelloworld.ymlプレイブックを実行します。
プロンプトに従ってhelloworld.ymlファイルのパスワードを提供します。以下に示すように、プレイブックの実行が成功しました。
- ok=2 – 2つのタスクが成功裏に実行されたことを示します。
- changed=1 – システムの状態に1つの変更が加えられたことを示します。この場合、シェルにhello worldメッセージが書き込まれました。
- unreachableとfailedは両方とも0 – 実行中に到達不能または失敗したホストはなかったことを示します。

パスワードファイルを使用したAnsible Vault
一回限りのタスクを実行する際に手動でパスワードを入力するのは実用的ではありませんが、実際の使用ではそれが現実的ではありません。
A better way to provide the password for encrypting and decrypting files is to use a password file. This way, you can store the password in a secure location, and Ansible will read the password from the file needed.
1. 以下のコマンドを実行して、Ansible Vaultのパスワードを.vault_passという名前のファイルに保存します。my_vault_passwordを実際のボールトパスワードに置き換えてください。
2. 次に、以下の各コマンドを実行して、ファイルの所有権(chown)をrootに変更し、.vault_passファイルのアクセス権を変更します。これらのコマンドにより、ファイルに読み書きできるのはあなただけ(rootユーザー)になります。
3. 最後に、以下のansible-playbookコマンドを実行し、–vault-password-fileオプションの後にパスワードファイル(.vault_pass)を指定して、パスワードファイルを使用してplaybook(helloworld.yml)を実行します。
以下のように、Ansibleが暗号化されたファイルのパスワードを要求せずにplaybookを実行しました。

結論
このチュートリアルでは、Ansible Vaultを使用してAnsibleのplaybookとタスクのために機密データを暗号化および復号化する方法を学びました。Ansible Vaultのパスワードをパスワードファイルを使用して安全な場所に保存しました。これにより、playbookを実行する際のユーザーの介入が少なくて済むようになります。
この新しい知識を持っていると、機密データを安全に暗号化して他の人と共有することができ、データのセキュリティを心配する必要がありません。
パスワード管理にLastPassを使用しているのであれば、Ansible VaultのパスワードをLastPassに保存し、必要なときにAnsibleが自動的に取得することもできます。