Ansible Vaultでシークレットを安全に保管する方法

間違った手に落ちないように秘密を守ることは最優先事項です。しかし、具体的にどのように秘密を保護するのでしょうか?ローカルのテキストファイルに保存することは、暗号化されていないためリスクが高すぎます。なぜ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テキストエディタを使用します。

export EDITOR=nano
Setting the Default Text Editor

4. 最後に、以下のコマンドを実行して変更内容(source)をログアウトせずに適用し、システムの現在のデフォルトテキストエディタを表示します。

# 環境変数を現在のシェルセッションに読み込みます。
source ~/.bashrc
# システムの現在のデフォルトテキストエディタを表示します。
echo $EDITOR

以下に示すように、EDITOR変数が好みのエディタに設定されていることを確認してください。

Applying and Verifying Changes

最初のAnsible Vaultを作成して暗号化する

デフォルトのボールトエディターを設定したので、最初のボールトを作成する時間です。機密情報(ユーザー名、パスワード、秘密アクセスキーなど)が含まれるファイルを作成して暗号化します。

あなたはansible-vaultコマンドを実行し、Ansible Vaultsとのやり取りのメインインターフェースを操作します。

1. 次のコマンドを実行してsecret.ymlファイルを作成します。AnsibleはYAMLを使用し、他のデータ形式(JSONなど)と比較してより人間に読みやすい形式です。

ansible-vault create secret.yml

ファイルのパスワードを入力して確認するように求められます。後でファイルを暗号化および復号化するためにこのパスワードを使用しますので、覚えやすい強力なパスワードを選択してください。secret.ymlファイルを。

Creating the secret.yml File with a Password

2. ボールトのパスワードを設定した後、デフォルトのテキストエディターが空のファイルを開きます。ファイルに保存する機密情報を入力し、エディターを保存して閉じます。

このチュートリアルでは、secret.ymlファイルにaws_access_keyとaws_secret_key変数を保存します。この時点で、Ansibleはsecret.ymlファイルを暗号化し、他の誰もがボールトの内容を読むことはできません。

Providing Sensitive Information (secrets)

3. パスワードなしでsecret.ymlファイルの内容を表示しようとするためにcatコマンドを実行します。

cat secret.yml

ファイルの内容が暗号化されているかどうかは、以下のようにランダムな数字が表示されている場合に確認できます。ファイルの先頭にある$ANSIBLE_VAULT;1.1;AES256ヘッダーは、AES256暗号を使用してAnsible Vaultでファイルが暗号化されていることを示しています。

高度な暗号化標準(AES)は、同じ鍵を使用してデータを暗号化および復号化する対称キー暗号アルゴリズムです。

Viewing the secret.yml file Without the Vault’s Password

既存のファイルを暗号化する

自動的に暗号化されたファイルを作成しましたが、既存のファイルを暗号化する方法はどうでしょうか? Ansibleには、指定したファイルを暗号化するencryptサブコマンドも提供されています。既存のファイルを暗号化する方法を確認するには、Ansible変数を含む特定のファイルを暗号化します。

次のコマンドを実行して、ファイル(vars.yml)を暗号化します。

ansible-vault encrypt vars.yml

最初にsecret.ymlファイルを作成したときと同様に、vars.ymlファイルのパスワードを入力するように求められます。

デフォルトのエディターは今回は開かれません。なぜなら、vars.ymlファイルが既に存在しているからです。その代わりに、Ansibleがファイルを暗号化したことを示す暗号化が成功しましたというメッセージが表示されます。

Encrypting an Existing File (vars.yml)

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

cat vars.yml
Verifying Encrypted Existing File

Ansible Vaultからデータを復号化する

ご覧になった通り、ファイルを暗号化してセキュリティを確保する方法を知っていますね。しかし、ファイルの内容を表示する必要がある場合、どのようにしてファイルを復号化しますか?ファイルを復号化すると、暗号化されたファイルを編集したり、毎回パスワードを提供せずにその内容を読んだりするときに便利です。そして、Ansibleのdecryptサブコマンドが役立ちます。

1. 次のコマンドを実行して、secret.ymlファイルを復号化します。

decryptサブコマンドは、暗号化されたファイルのパスを唯一の引数として受け取ります。

ansible-vault decrypt secret.yml

ファイルのパスワードを提供し、ファイルの内容が復号化されて平文でディスクに書き込まれます。

Decrypting File Data

2. 次に、catコマンドを実行してsecret.ymlファイルの復号化された内容を表示します。

cat secret.yml

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

file to your heart’s content

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

ansible-vault encrypt secret.yml
Encrypting a Decrypted File (secret.yml)

Ansible Vaultのパスワードの更新

ファイルを暗号化および復号化する際に毎回パスワードを入力する必要があることがわかりましたが、おそらくファイルを復号化せずにパスワードを更新したい場合があります。その場合は、rekeyサブコマンドを使用する必要があります。このサブコマンドを使用すると、ファイルのパスワードを自由に変更できます。

以下のコマンドを実行して、secret.ymlファイルのパスワードを更新します。

rekeyサブコマンドは、暗号化されたファイルのパスを唯一の引数として取ります。

ansible-vault rekey secret.yml

ファイルの現在のパスワードを入力し、以下に示すように新しいパスワードを入力してください。

この時点で、古いパスワードではファイルを復号化できなくなります。

Updating Ansible Vault’s Password

次に、以下のコマンドを実行してsecret.ymlを復号化しようとしてください。

ansible-vault decrypt secret.yml

プロンプトが表示されたら、古いパスワードを入力し、Decryption failedというエラーメッセージが表示されることを確認します。この出力は、ファイルのパスワードが正常に更新されたことを確認します。

Verifying New Password is in Effect

Playbooksとモジュールでセキュアなデータを使用する

ファイルの暗号化と復号化コマンドが機能することを確認しました。ただし、アプリケーションのセキュリティを確保してプロセスを自動化する場合は、Playbooksとモジュールを使用する必要があります。

1. Ansibleの設定を含むAnsible構成ファイル(~/.ansible.cfg)をエディタで開きます。

以下のコードを~/.ansible.cfgファイルの末尾にコピーして貼り付け、変更内容を保存してエディタを閉じます。このコードは、Ansibleにインベントリファイル(~/.ansible-hosts)を探すよう指示します。

[defaults]
hostfile = ~/.ansible-hosts

2. 次に、Ansibleが管理ノードで管理できるホストのインベントリを含む~/.ansible-hostsファイルを開きます。

以下のコードを~/.ansible-hostsファイルに追加し、変更内容を保存してファイルを閉じます。このコードは、Ansibleがローカル接続タイプを介してlocalhostを管理できることを指示します。

localhost ansible_connection=local

3. 以下のコマンドを実行して新しい暗号化されたファイルを作成します。ファイルには任意の名前を付けることができますが、このチュートリアルではファイル名をhelloworld.ymlとしています。

ansible-vault create helloworld.yml
Creating Ansible Playbook (helloworld.yml)

helloworld.ymlファイルに以下のコードを入力し、変更を保存してエディターを閉じます。

このコードは、インベントリ内のすべてのホストにhello worldメッセージを表示する基本的なAnsibleプレイブックです。コードブロックの先頭の—記号は、YAMLドキュメントの開始を示しています。

---

- hosts: all # インベントリ内のすべてのホストにタスクを実行するための設定 
  tasks: # 実行するタスクを設定
    - shell: echo 'hello world' # 'hello world'メッセージを表示

4. 最後に、以下のansible-playbookコマンドを–ask-vault-passオプションと共に実行して、インベントリ内のすべてのホストでhelloworld.ymlプレイブックを実行します。

ansible-playbook --ask-vault-pass helloworld.yml

プロンプトに従ってhelloworld.ymlファイルのパスワードを提供します。以下に示すように、プレイブックの実行が成功しました。

  • ok=2 – 2つのタスクが成功裏に実行されたことを示します。
  • changed=1 – システムの状態に1つの変更が加えられたことを示します。この場合、シェルにhello worldメッセージが書き込まれました。
  • unreachableとfailedは両方とも0 – 実行中に到達不能または失敗したホストはなかったことを示します。
Running your playbook

パスワードファイルを使用した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を実際のボールトパスワードに置き換えてください。

echo 'my_vault_password' > .vault_pass

2. 次に、以下の各コマンドを実行して、ファイルの所有権(chown)をrootに変更し、.vault_passファイルのアクセス権を変更します。これらのコマンドにより、ファイルに読み書きできるのはあなただけ(rootユーザー)になります。

# ファイルの所有権をrootユーザーに変更
chown root:root .vault_pass
# ファイルのアクセス権をrootのみに変更(読み取りおよび書き込み権限)
chmod 700 .vault_pass

3. 最後に、以下のansible-playbookコマンドを実行し、–vault-password-fileオプションの後にパスワードファイル(.vault_pass)を指定して、パスワードファイルを使用してplaybook(helloworld.yml)を実行します。

ansible-playbook --vault-password-file=.vault_pass helloworld.yml

以下のように、Ansibleが暗号化されたファイルのパスワードを要求せずにplaybookを実行しました。

Running Playbook using a Password File

結論

このチュートリアルでは、Ansible Vaultを使用してAnsibleのplaybookとタスクのために機密データを暗号化および復号化する方法を学びました。Ansible Vaultのパスワードをパスワードファイルを使用して安全な場所に保存しました。これにより、playbookを実行する際のユーザーの介入が少なくて済むようになります。

この新しい知識を持っていると、機密データを安全に暗号化して他の人と共有することができ、データのセキュリティを心配する必要がありません。

パスワード管理にLastPassを使用しているのであれば、Ansible VaultのパスワードをLastPassに保存し、必要なときにAnsibleが自動的に取得することもできます。

Source:
https://adamtheautomator.com/ansible-vault/