Ansible Vault を使用したコンテンツの暗号化

Ansible Vault は変数やファイルを暗号化するため、パスワードや鍵などの機密コンテンツを Playbook やロールの中で平文のまま放置することなく保護することができます。Ansible Vault を使用するには、コンテンツを暗号化および復号を行うために 1 つ以上のパスワードが必要です。シークレットマネージャーなどのサードパーティーツールに Vault のパスワードを保存している場合は、そのパスワードにアクセスするためのスクリプトが必要です。ansible-vault コマンドラインツールでパスワードを使用して、暗号化された変数の作成と表示、暗号化されたファイルの作成、既存ファイルの暗号化、またはファイルの編集、鍵の再設定、復号を行います。また、暗号化されたコンテンツをソースコントロール下に置き、より安全に共有することができます。

警告

  • Ansible Vault による暗号化は、「静止状態のデータ」のみを保護します。コンテンツが復号化された後 (「使用中のデータ」)、プレイやプラグインの作者は、秘密の漏洩を回避する責任があります。出力の非表示に関する詳細は「no_log」を、Ansible Vault で使用するエディターのセキュリティーに関する考慮点は「エディターを確保するための手順」を参照してください。

暗号化された変数やファイルは、暗号化に使用したパスワードを入力することで、アドホックコマンドや Playbook で使用することができます。ansible.cfg ファイルを変更して、パスワードファイルの場所を指定したり、常にパスワードの入力を促すようにすることができます。

Vault パスワードの管理

暗号化されたコンテンツを管理するには、Vault のパスワードを管理するためのストラテジーを立てるとよいでしょう。Vault パスワードは任意の文字列です。Vault パスワードを作成するための特別なコマンドはありません。しかし、Vault パスワードを管理する必要があります。Ansible Vault で変数やファイルを暗号化する際は、毎回パスワードを入力する必要があります。暗号化された変数やファイルをコマンドや Playbook で使用する際には、暗号化に使用したパスワードを入力する必要があります。Vault のパスワードを管理するためのストラテジーを立てるには、次の 2 つの質問から始めます。

  • 同じパスワードですべてのコンテンツを暗号化する必要がりますか。または、異なるニーズに合わせて異なるパスワードを使用しますか

  • パスワードをどこに保存しますか。

1 つのパスワードと複数のパスワードの選択

少人数のチームや機密性の高い値が少ない場合は、Ansible Vault で暗号化するすべてのものに 1 つのパスワードを使用することができます。Vault のパスワードは、後述するようにファイルやシークレットマネージャーに安全に保管してください。

チームの規模が大きかったり、機密性の高い値が多い場合は、複数のパスワードを使用することができます。たとえば、ユーザーやアクセスレベルごとに異なるパスワードを使用することができます。必要に応じて、暗号化したファイルごと、ディレクトリーごと、あるいは環境ごとに異なるパスワードが必要になる場合があります。たとえば、開発環境用と実稼働環境用の 2 つの vars ファイルを含む Playbook を作成し、2 つの異なるパスワードで暗号化する場合などです。Playbook を実行する際には、Vault ID を使用して、対象となる環境に適した Vault パスワードを選択します。

Vault ID を使用した複数パスワードの管理

複数の Vault パスワードを使用する場合は、Vault ID から別のパスワードを区別することができます。以下の 3 つの方法で Vault ID を使用します。

ansible-vault コマンドのオプションとして Vault ID を渡すと、暗号化されたコンテンツにラベル (ヒントやニックネーム) が追加されます。このラベルは、どのパスワードを使用して暗号化したかを記録します。暗号化された変数やファイルは、ヘッダーに平文で Vault ID ラベルを含みます。Vault ID は暗号化されたコンテンツの前の最後の要素です。以下に例を示します。

my_encrypted_var: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          30613233633461343837653833666333643061636561303338373661313838333565653635353162
          3263363434623733343538653462613064333634333464660a663633623939393439316636633863
          61636237636537333938306331383339353265363239643939666639386530626330633337633833
          6664656334373166630a363736393262666465663432613932613036303963343263623137386239
          6330

ラベルに加えて、関連するパスワードのソースを提供する必要があります。ソースは、Vault パスワードをどのように保存するかによって、プロンプト、ファイル、またはスクリプトになります。パターンは次のようになります。

--vault-id label@source

Playbook が複数の暗号化された変数や、異なるパスワードで暗号化したファイルを使用する場合は、その Playbook を実行する際に Vault ID を渡す必要があります。--vault-id を単独で、もしくは --vault-password-file または --ask-vault-pass と一緒に使用することができます。パターンは、暗号化されたコンテンツを作成するときと同じで、一致するパスワードのラベルとソースを含めます。

Vault ID でコンテンツを暗号化する例と、Vault ID で暗号化されたコンテンツを使用する例については、以下を参照してください。--vault-id オプションは、ansible-vaultansible-playbook など、Vault と相互作用するすべての Ansible コマンドで動作します。

Vault ID の制限

Ansible は、特定の Vault ID ラベルを使用するたびに同じパスワードを使用することを強制しません。異なる変数やファイルを、同じ Vault ID ラベルで異なるパスワードを使用して暗号化することができます。これは通常、プロンプトでパスワードを入力して間違えた場合に起こります。意図的に、同じ Vault ID ラベルで異なるパスワードを使用することは可能です。たとえば、各ラベルを、単一のパスワードではなく、パスワードのクラスへの参照として使用することができます。このシナリオでは、どの特定のパスワードまたはファイルを使用するかを常にコンテキストで知っておく必要があります。しかし、誤って同じ Vault ID ラベルと異なるパスワードを使用する 2 つのファイルを暗号化してしまう可能性が高くなります。誤って同じラベルで異なるパスワードの 2 つのファイルを暗号化してしまった場合は、1つのファイルで rekey を行って問題を解決できます。

Vault ID 一致の強制

デフォルトでは、Vault ID ラベルは、変数やファイルの暗号化にどのパスワードを使用したかを思い出させるためのヒントに過ぎません。Ansible は、暗号化されたコンテンツのヘッダーにある Vault ID が、コンテンツの使用時に指定した Vault ID と一致するかどうかはチェックしません。Ansible は、指定したパスワードで暗号化されたコマンドまたは Playbook によって呼び出されたすべてのファイルおよび変数を復号します。暗号化されたコンテンツをチェックし、コンテンツに含まれる Vault ID が --vault-id で指定したものと一致した場合にのみ暗号化を解除するには、設定オプション DEFAULT_VAULT_ID_MATCH を設定します。DEFAULT_VAULT_ID_MATCH を設定すると、各パスワードは同じラベルで暗号化したデータを復号するためにのみ使用されます。これは効率的で予測可能であり、異なる値が異なるパスワードで暗号化された場合のエラーを減らすことができます。

注釈

DEFAULT_VAULT_ID_MATCH の設定が有効になっている場合でも、特定の Vault ID ラベルを使用するたびに、Ansible は同じパスワードの使用を強制しません。

Vault パスワードの保存およびアクセス

Valut パスワードを記憶したり、Valut パスワードを任意のソースから手動でコピーしてコマンドラインプロンプトに貼り付けたりすることもできますが、ほとんどのユーザーは安全に保管し、必要に応じて Ansible 内からアクセスします。Ansible 内で機能する Valut パスワードの保管方法には、ファイルに保管する方法と、システムキーリングやシークレットマネージャーなどのサードパーティーツールに保管する方法があります。サードパーティーのツールにパスワードを保存する場合、Ansible 内からパスワードを取得するには、Vault パスワードクライアントスクリプトが必要です。

パスワードのファイルへの保存

Vault のパスワードをファイルに保存するには、ファイルの 1 行にパスワードを文字列で入力します。ファイルのパーミッションが適切であることを確認してください。パスワードファイルをソースコントロールに追加しないでください。

Vault パスワードクライアントスクリプトを使用したサードパーティーツールへのパスワードの保存

Valut パスワードは、システムキーリング、データベース、またはシークレットマネージャーに保存し、Valut パスワードクライアントスクリプトを使用して Ansible 内から取り出すことができます。パスワードは 1 行の文字列として入力します。パスワードに Vault ID がある場合は、パスワード保存ツールと連携する方法で保存します。

Vault パスワードクライアントスクリプトを作成するには、以下のようにします。

  • -client または -client.EXTENSION で終わる名前でファイルを作成します。

  • ファイルを実行可能な状態にします。

  • スクリプト自体:
    • 標準出力にパスワードを出力します。

    • --vault-id オプションを許可します。

    • スクリプトがデータを要求する場合 (例: データベースパスワード) には、プロンプトを標準エラーに送信します。

サードパーティーのツールに保存されている Vault パスワードを使用する Playbook を実行する場合は、--vault-id フラグ内でスクリプトをソースとして指定します。以下を例に示します。

ansible-playbook --vault-id dev@contrib/vault/vault-keyring-client.py

Ansible はクライアントスクリプトを --vault-id オプション付きで実行するため、スクリプトは指定された Vault ID ラベルを知ることができます。たとえば、シークレットマネージャーからパスワードを読み込むスクリプトは、Vault ID ラベルを使用して、「dev」または「prod」のいずれかのパスワードを選択できます。上記のコマンドの例では、クライアントスクリプトの実行結果は次のようになります。

contrib/vault/vault-keyring-client.py --vault-id dev

システムキーリングからパスワードを読み込むクライアントスクリプトの例は、contrib/vault/vault-keyring-client.py を参照してください。

Ansible Vault を使用したコンテンツの暗号化

Vault のパスワードを管理および保管するためのストラテジーができたら、コンテンツの暗号化を開始できます。Ansible Vault では、変数とファイルの 2 種類のコンテンツを暗号化することができます。暗号化されたコンテンツには、必ず !vault タグが含まれます。これは、コンテンツの復号が必要であることを Ansible と YAML に伝えるもので、複数行の文字列を可能にする | 文字も含まれています。--vault-id で作成された暗号化コンテンツには、Vault ID ラベルも含まれます。Ansible Vault における暗号化プロセスと形式の詳細は、「Ansible Vault で暗号化されたファイルの形式」を参照してください。この表は、暗号化された変数と暗号化されたファイルの主な違いを示しています。

暗号化された変数

暗号化されたファイル

どのくらい暗号化されているのか

平文ファイル内の変数

ファイル全体

復号するタイミング

オンデマンドで (必要な場合にのみ)

読み込みまたは参照する場合 1

暗号化できるもの

変数のみ

構造化データファイル

1

Ansible は、ファイルを復号しない限り、暗号化されたファイルからコンテンツを必要とするかどうかを認識できないため、Playbook およびロールで参照される暗号化されたファイルをすべて復号します。

Ansible Vault による個々の変数の暗号化

ansible-vault encrypt_string コマンドを使用して、YAML ファイル内で 1 つの値を暗号化することができます。Vault を使用した変数を安全に表示できる方法は、「Vault 処理された変数を安全に表示」を参照してください。

変数を暗号化することの利点および欠点

変数レベルの暗号化では、ファイルを簡単に読み取ることができます。平文の変数と暗号化された変数を混在させることができ、プレイやロールの中でインラインでも使用できます。しかし、パスワードのローテーションはファイルレベルの暗号化のように簡単ではありません。暗号化された変数に 鍵の再設定 は使用できません。また、変数レベルの暗号化は変数に対してのみ機能します。タスクやその他のコンテンツを暗号化する場合は、ファイル全体を暗号化する必要があります。

暗号化されたファイルの作成

ansible-vault encrypt_string コマンドは、入力 (もしくはコピーまたは生成) した文字列を暗号化して、Playbook、ロール、変数ファイルに含めることができる形式にします。基本的な暗号化変数を作成するには、ansible-vault encrypt_string コマンドに 3 つのオプションを渡します。

  • Vault パスワードのソース (プロンプト、ファイル、またはスクリプト、Vault ID あり/なし)

  • 暗号化する文字列

  • 文字列名 (変数の名前)

パターンは以下のようになります。

ansible-vault encrypt_string <password_source> '<string_to_encrypt>' --name '<string_name_of_variable>'

たとえば、「a_password_file」に保存されたパスワードのみを使用して文字列を「foobar」を暗号化する際に、変数「the_secret」に名前を付けます。

ansible-vault encrypt_string --vault-password-file a_password_file 'foobar' --name 'the_secret'

上記のコマンドにより、以下のような内容が作成されます。

the_secret: !vault |
      $ANSIBLE_VAULT;1.1;AES256
      62313365396662343061393464336163383764373764613633653634306231386433626436623361
      6134333665353966363534333632666535333761666131620a663537646436643839616531643561
      63396265333966386166373632626539326166353965363262633030333630313338646335303630
      3438626666666137650a353638643435666633633964366338633066623234616432373231333331
      6564

文字列「foooodev」を暗号化するには、Vault ID ラベル「dev」に「a_password_file」に格納されている「dev」の Vault パスワードを追加し、暗号化された変数「the_dev_secret」を呼び出します。

ansible-vault encrypt_string --vault-id dev@a_password_file 'foooodev' --name 'the_dev_secret'

上記のコマンドにより、以下のような内容が作成されます。

the_dev_secret: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          30613233633461343837653833666333643061636561303338373661313838333565653635353162
          3263363434623733343538653462613064333634333464660a663633623939393439316636633863
          61636237636537333938306331383339353265363239643939666639386530626330633337633833
          6664656334373166630a363736393262666465663432613932613036303963343263623137386239
          6330

標準入力から読み込んだ文字列「letmein」を暗号化するために、a_password_file に保存されている「dev」の Vault のパスワードを使用して Vault ID「dev」を追加し、変数に「db_password」という名前を付けます。

echo -n 'letmein' | ansible-vault encrypt_string --vault-id dev@a_password_file --stdin-name 'db_password'

警告

秘密の内容をコマンドラインで直接入力すると (プロンプトなし)、シェルの履歴に秘密の文字列が残ります。テスト時以外はこのようなことをしないでください。

上記のコマンドにより、以下が出力されます。

Reading plaintext input from stdin. (ctrl-d to end input, twice if your content does not already have a new line)
db_password: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          61323931353866666336306139373937316366366138656131323863373866376666353364373761
          3539633234313836346435323766306164626134376564330a373530313635343535343133316133
          36643666306434616266376434363239346433643238336464643566386135356334303736353136
          6565633133366366360a326566323363363936613664616364623437336130623133343530333739
          3039

暗号化する文字列の入力を求められるため、「a_password_file」の「dev」の Vault パスワードで暗号化し、変数名を「new_user_password」とし、Vault ID ラベル「dev」を付与します。

ansible-vault encrypt_string --vault-id dev@a_password_file --stdin-name 'new_user_password'

上記のコマンドにより、以下のプロンプトが表示されます。

Reading plaintext input from stdin. (ctrl-d to end input, twice if your content does not already have a new line)

暗号化する文字列 (「hunter2」など) を入力し、ctrl-d を押してお待ちください。

警告

暗号化する文字列を指定した後に Enter を押さないでください。暗号化された値に改行を追加します。

上記のシーケンスにより、以下のような出力が作成されます。

new_user_password: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          37636561366636643464376336303466613062633537323632306566653533383833366462366662
          6565353063303065303831323539656138653863353230620a653638643639333133306331336365
          62373737623337616130386137373461306535383538373162316263386165376131623631323434
          3866363862363335620a376466656164383032633338306162326639643635663936623939666238
          3161

上記の例の出力を将来使用するために、任意の Playbook、変数ファイル、またはロールに追加することができます。暗号化された変数は、平文の変数よりもサイズが大きくなりますが、機密性の高いコンテンツを保護する一方で、Playbook、変数ファイル、またはロールの残りの部分は平文のままなとなるため、簡単に読み取ることができます。

暗号化された変数の表示

暗号化された変数の元の値は、デバッグモジュールを使用して見ることができます。その際には、変数の暗号化に使用したパスワードを渡す必要があります。たとえば、上記の最後の例で作成した変数を「vars.yml」というファイルに保存した場合に、その変数の暗号化されていない値を見るには次のようにします。

ansible localhost -m ansible.builtin.debug -a var="new_user_password" -e "@vars.yml" --vault-id dev@a_password_file

localhost | SUCCESS => {
    "new_user_password": "hunter2"
}

Ansible Vault によるファイルの暗号化

Ansible Vault は、Ansible が使用するあらゆる構造化データファイルを暗号化することができます。以下に例を示します。

  • インベントリーからのグループ変数ファイル

  • インベントリーからのホスト変数ファイル

  • -e @file.yml または -e @file.json で ansible-playbook に渡される変数ファイル

  • include_vars または vars_files により読み込まれた変数ファイル

  • ロールの変数ファイル

  • ロール内のデフォルトファイル

  • タスクファイル

  • ハンドラーファイル

  • バイナリーファイルまたはその他の任意のファイル

完全なファイルは Vault で暗号化されます。

注釈

Ansible Vault はエディターを使用して暗号化されたファイルの作成または変更します。エディターのセキュリティー保護に関するいくつかのガイダンスは、「エディターを確保するための手順」を参照してください。

ファイルを暗号化することの利点および欠点

ファイルレベルの暗号化は簡単に使用できます。暗号化されたファイルのパスワードローテーションは、rekey コマンドで簡単に行うことができます。ファイルを暗号化すると、慎重に扱うべき値だけでなく、使用する変数の名前も隠すことができます。しかし、ファイルレベルの暗号化では、ファイルの内容に簡単にアクセスして読むことができなくなります。これは暗号化されたタスクファイルでは問題になるかもしれません。変数ファイルを暗号化する場合、これらの変数への参照を暗号化されていないファイルに保持する 1 つの方法、「Vault 処理された変数を安全に表示」を参照してください。Ansible は、暗号化されたファイルを読み込んだり参照したりする際には、常に暗号化されたファイル全体を復号します。これは、Ansible は復号しない限りコンテンツが必要かどうかを知ることができないからです。

暗号化されたファイルの作成

「multi_password_file」の Vault パスワード「test」を使用して、「foo.yml」という名前の新しい暗号化データファイルを作成するには、以下を行います。

ansible-vault create --vault-id test@multi_password_file foo.yml

このツールは、エディター ($EDITOR で定義したエディターがなんであれ、デフォルトは vi) を起動します。コンテンツを追加します。エディターセッションを終了すると、ファイルは暗号化されたデータとして保存されます。ファイルのヘッダーには、作成時に使用した Vault ID が反映されます。

``$ANSIBLE_VAULT;1.2;AES256;test``

Vault ID「my_new_password」が割り当てられた新しい暗号化データファイルを作成し、パスワードの入力を求められるようにするには、以下を行います。

ansible-vault create --vault-id my_new_password@prompt foo.yml

ここでも、エディターのファイルにコンテンツを追加して保存します。プロンプトで作成した新しいパスワードを必ず保存し、そのファイルを復号するときに見つけられるようにしてください。

既存ファイルの暗号化

既存ファイルを暗号化するには、ansible-vault encrypt コマンドを使用します。このコマンドは、一度に複数のファイルで動作します。以下に例を示します。

ansible-vault encrypt foo.yml bar.yml baz.yml

「プロジェクト」IDで既存のファイルを暗号化し、パスワードの入力を求めるプロンプトを表示するには、以下のようになります。

ansible-vault encrypt --vault-id project@prompt foo.yml bar.yml baz.yml

暗号化したファイルの表示

暗号化したファイルの内容を編集せずに表示する場合は、ansible-vault view コマンドを使用できます。

ansible-vault view foo.yml bar.yml baz.yml

暗号化されたファイルの編集

暗号化されたファイルをその場で編集するには、ansible-vault edit コマンドを使用します。このコマンドは、ファイルを一時的なファイルに復号し、内容を編集できるようにした後、内容を保存して再度暗号化し、エディターを閉じるときに一時的なファイルを削除します。以下に例を示します。

ansible-vault edit foo.yml

vault2」パスワードファイルで暗号化され、Vault ID「pass2」を割り当てたファイルを編集するには、以下を実行します。

ansible-vault edit --vault-id pass2@vault2 foo.yml

暗号化されたファイルのパスワードまたは Vault ID の変更

暗号化された 1 つまたは複数のファイルのパスワードを変更するには、rekey コマンドを使用します。

ansible-vault rekey foo.yml bar.yml baz.yml

このコマンドは、複数のデータファイルの鍵を一度に再設定することができ、元のパスワードと新しいパスワードを要求します。鍵を一度に再設定したファイルに別の ID を設定するには、新しい ID を --new-vault-id に渡します。たとえば、「ppold」ファイルから「preprod1」の Vault ID で暗号化されたファイルのリストで Vault ID「preprod2」に鍵を再設定し、新しいパスワードの入力を求める場合です。

ansible-vault rekey --vault-id preprod1@ppold --new-vault-id preprod2@prompt foo.yml bar.yml baz.yml

暗号化されたファイルの復号化

暗号化されたファイルがあり、そのファイルを暗号化したままにしておきたくない場合は、ansible-vault decrypt コマンドを実行することで永久に暗号化を解除することができます。このコマンドは暗号化されていないファイルをディスクに保存するため、代わりに edit を使用しないようにしてください。

ansible-vault decrypt foo.yml bar.yml baz.yml

エディターを確保するための手順

Ansible Vault は、設定されたエディターに依存しており、これが情報漏えいの原因となることがあります。ほとんどのエディターには、データの損失を防ぐ方法がありますが、通常は、秘密のコピーが平文で保存されている可能性のある追加の平文ファイルに依存しています。エディターのドキュメントを参照して、セキュアなデータの開示を回避するようにエディターを設定してください。以下のセクションでは、一般的なエディターに関するガイダンスを提供していますが、エディターのセキュリティーを確保するための完全なガイドと考えるべきではありません。

vim

以下の vim オプションをコマンドモードで設定することで、情報漏えいのケースを回避することができます。特にプラグインを使用している場合など、セキュリティーを確保するために変更しなければならない設定が他にもあるかもしれないため、vim のドキュメントを参照してください。

  1. クラッシュまたは中断が発生した場合に自動保存として機能する swapfiles を無効にします。

set noswapfile
  1. バックアップファイルの作成を無効にします。

set nobackup
set nowritebackup
  1. viminfo ファイルを無効にして、現在のセッションからデータをコピーします。

set viminfo=
  1. システムクリップボードへのコピーを無効にします。

set clipboard=

必要に応じて、すべてのファイルまたは特定のパスまたは拡張の .vimrc にこれらの設定を追加できます。詳細は、vim マニュアルを参照してください。

Emacs

以下の Emacs オプションを設定することで、情報漏えいを回避することができます。特にプラグインを使用する場合は、セキュリティーを確保するために変更する必要がある設定が他にもあるかもしれないため、Emacs のドキュメントを参照してください。

  1. データをシステムクリップボードにコピーしないでください。

(setq x-select-enable-clipboard nil)
  1. バックアップファイルの作成を無効にします。

(setq make-backup-files nil)
  1. 自動保存ファイルを無効にします。

(setq auto-save-default nil)

暗号化された変数とファイルの使用

暗号化された変数やファイルを使用するタスクや Playbook を実行する際は、変数やファイルを復号するためのパスワードを提供する必要があります。これは、コマンドラインまたは Playbook の中で行うことができます。

単一のパスワードを渡す

タスクや Playbook が必要とするすべての暗号化された変数やファイルが単一のパスワードを使用する場合は、CLI オプション --ask-vault-pass または --vault-password-file を使用できます。

パスワードを要求する場合は、以下のようになります。

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

/path/to/my/vault-password-file ファイルからパスワードを取得するには、以下を行います。

ansible-playbook --vault-password-file /path/to/my/vault-password-file site.yml

Vault パスワードクライアントスクリプト my-vault-password-client.py から Vault パスワードを取得する場合は、以下のようになります。

ansible-playbook --vault-password-file my-vault-password-client.py

Vault ID を渡す

--vault-id オプションを使用して、Vault ラベルで単一のパスワードを渡すこともできます。この方法は、1 つのインベントリー内で複数の vault を使用している場合はより明確になります。

Vault ID「dev」のパスワードを要求する場合は、次のようになります。

ansible-playbook --vault-id dev@prompt site.yml

「dev」の Vault ID のパスワードを dev-password のファイルから取得するには、以下を行います。

ansible-playbook --vault-id dev@dev-password site.yml

Vault パスワードクライアントスクリプト my-vault-password-client.py から Vault ID 「dev」のパスワードを取得する場合は、以下を行います。

ansible-playbook --vault-id [email protected]

複数の Vault パスワードを渡す

タスクや Playbook で、異なる Vault ID で暗号化した複数の暗号化変数やファイルが必要な場合は、--vault-id オプションを使用し、複数の --vault-id オプションを渡して Vault ID (「dev」、「prod」、「cloud」、「db」) とパスワードのソース (プロンプト、ファイル、スクリプト) を指定する必要があります。たとえば、ファイルから読み込んだ「dev」のパスワードを使用し、「prod」のパスワードを求めるプロンプトを表示する場合などです。

ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml

デフォルトでは、Vault ID ラベル (dev、prodなど) はヒントでしかありません。Ansible は、各パスワードで Vault のコンテンツの復号を試みます。暗号化されたデータと同じラベルのパスワードが最初に試行され、その後、コマンドラインで指定された順に各 Vault シークレットが試行されます。

暗号化されたデータにラベルがない場合、またはラベルが、提供されたラベルのどれとも一致しない場合、パスワードは指定された順に試行されます。上の例では、「dev」パスワードが最初に試行され、次に「prod」パスワードが試行されます。これは、Ansible がどの Vault ID が何かの暗号化に使用されているかを知らない場合に行われます。

Vault ID なしで --vault-id を使用

--vault-id オプションは、vault-id を指定せずに使用することもできます。この動作は --ask-vault-pass または --vault-password-file と同等であるため、ほとんど使用されません。

たとえば、パスワードファイル dev-password を使用する場合は、以下のようになります。

ansible-playbook --vault-id dev-password site.yml

パスワードを要求する場合は、以下のようになります。

ansible-playbook --vault-id @prompt site.yml

実行スクリプト my-vault-password-client.py からパスワードを取得する場合は、以下のようになります。

ansible-playbook --vault-id my-vault-password-client.py

暗号化されたコンテンツを使用するためのデフォルトの設定

デフォルトの Vault ID の設定

ある Vault ID を他の Vault IDよ りも頻繁に使用する場合は、設定オプション DEFAULT_VAULT_IDENTITY_LIST を設定して、デフォルトの Vault ID とパスワードソースを指定することができます。Ansible は、--vault-id を指定しない場合は、デフォルトの Vault ID とソースを使用します。このオプションには複数の値を設定できます。複数の値を設定することは、複数の CLI オプション --vault-id を渡すことと同じです。

デフォルトのパスワードソースの設定

ある Vault パスワードファイルを他のファイルよりも頻繁に使用する場合は、DEFAULT_VAULT_PASSWORD_FILE 設定オプションまたは環境変数 ANSIBLE_VAULT_PASSWORD_FILE を設定して、そのファイルを指定することができます。たとえば、ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass.txt を設定すると、Ansible は自動的にそのファイル内のパスワードを検索します。これは、たとえば、Jenkins などの継続的統合システムから Ansible を使用する場合に便利です。

暗号化ファイルをいつ表示するか。

一般的に、Ansible Vault で暗号化したコンテンツは、実行後も暗号化されたままです。ただし、1 つだけ例外があります。copy モジュール、template モジュール、unarchive モジュール、script モジュール、または assemble モジュールへの src 引数として暗号化されたファイルを渡した場合、そのファイルはターゲットホスト上では暗号化されません (プレイの実行時に正しい Vault パスワードを供給していることが前提です)。この動作は意図されたものであり、便利なものです。設定ファイルやテンプレートを暗号化して、設定の詳細を共有しないようにすることができますが、その設定を環境内のサーバーにコピーするときは、ローカルのユーザーやプロセスがアクセスできるように、暗号化を解除します。

Ansible Vault のスピードアップ

多くの暗号化されたファイルがある場合は、起動時にそれらを復号化すると、知覚できるほどの遅延が生じることがあります。これを高速化するには、暗号化パッケージをインストールします。

pip install cryptography

Ansible Vault で暗号化されたファイルの形式

Ansible Vault は、UTF-8 でエンコードされたテキストファイルを作成します。ファイル形式には、改行で終了するヘッダーが含まれます。以下に例を示します。

$ANSIBLE_VAULT;1.1;AES256

または:

$ANSIBLE_VAULT;1.2;AES256;vault-id-label

ヘッダーには、セミコロン (;) で区切られた最大 4 つの要素が含まれます。

  1. 形式 ID ($ANSIBLE_VAULT)。現在、$ANSIBLE_VAULT は唯一の有効な形式 ID です。フォーマット ID は、(vault.is_encrypted_file() を介して) Ansible Vault で暗号化されているコンテンツを識別します。

  2. Vault 形式バージョン (1.X) です。現在、サポートされているすべてのバージョンの Ansible では、ラベル付きの Vault IDが指定された場合は、デフォルトで「1.1」または「1.2」になります。「1.0」形式は読み込みのみサポートしています (書き込み時には自動的に「1.1」形式に変換されます)。形式のバージョンは、現在、正確な文字列の比較としてのみ使用されています (バージョン番号は現在「比較」されません)。

  3. データの暗号化に使用される暗号アルゴリズム (AES256)。現在、AES256 が唯一サポートされている暗号アルゴリズムです。Vault 形式 1.0 では「AES」を使用していましたが、現在のコードでは常に「AES256」を使用します。

  4. データの暗号化に使用される vault ID ラベル (任意: vault-id-label)。たとえば、--vault-id dev@prompt でファイルを暗号化する場合は、vault-id-label が dev になります。

注: 将来的には、ヘッダーが変更する可能性があります。形式 ID と形式バージョンの後のフィールドは、形式のバージョンに依存しており、将来の Vault 形式のバージョンでは、暗号アルゴリズムのオプションやフィールドが追加される可能性があります。

ファイルの残りの内容は「vaulttext」です。vaulttext は、暗号化された暗号文のテキスト版です。各行の幅は 80 文字です。ただし、最終行は短くなる場合があります。

Ansible Vault ペイロード形式 1.1 - 1.2

vaulttext は、暗号化テキストと SHA256 ダイジェストを連結したもので、結果は「hexlifyied」です。

「hexlify」は、Python 標準ライブラリーの binascii モジュールの hexlify() メソッドを指します。

hexlify() が行われた結果:

  • hexlify() で編集されたソルトの文字列とそれに続く改行 (0x0a)。

  • hexlify() で暗号化された HMAC の文字列の後に、改行を入れます。その HMAC は以下のようになります。

    • RFC2104 スタイルの HMAC

      • 入力は次のとおりです。

        • AES256 で暗号化した暗号文

        • PBKDF2 キー。このキー、暗号キー、および暗号 IV を生成します。

          • バイト単位のソルト

          • 10000 回の繰り返し

          • SHA256() アルゴリズム

          • 最初の 32 バイトは暗号キーです。

          • 2 番目の 32 バイトは HMAC キーです。

          • 残りの 16 バイトは暗号 IV です。

  • 暗号文の hexlify() が行われた文字列です。暗号文は以下のようになります。

  • AES256 で暗号化されたデータです。データは次を使用して暗号化されます。

    • AES-CTR ストリーム暗号

    • 暗号鍵

    • IV

    • 整数 IV からシードされた 128 ビットのカウンターブロック

    • 平文

      • 元の平文

      • AES256 ブロックサイズまでのパディング (パディングに使用するデータは RFC5652 に基づいています)