第25章 Ansible を使用した IdM サービス Vault の管理: シークレットの保存および取得
このセクションでは、管理者が ansible-freeipa
vault
モジュールを使用してサービスシークレットを一元的にセキュアに保存する方法を説明します。この例で使用される Vault は非対称であるため、これを使用する場合は、管理者は以下の手順を実行する必要があります。
-
openssl
ユーティリティーなどを使用して秘密鍵を生成する。 - 秘密鍵をもとに公開鍵を生成する。
サービスシークレットは、管理者が Vault にアーカイブする時に公開鍵を使用して暗号化されます。その後、ドメイン内の特定のマシンでホストされるサービスインスタンスが、秘密鍵を使用してシークレットを取得します。シークレットにアクセスできるのは、サービスと管理者のみです。
シークレットが漏洩した場合には、管理者はサービス Vault でシークレットを置き換えて、漏洩されていないサービスインスタンスに配布しなおすことができます。
前提条件
- Key Recovery Authority (KRA) Certificate System コンポーネントが IdM ドメインの 1 つ以上のサーバーにインストールされている。詳細は IdM での Key Recovery Authority (KRA) のインストール を参照してください。
このセクションでは、以下の手順にを説明します。
この手順での以下の用語にを説明します。
- admin は、サービスパスワードを管理する管理者です。
- private-key-to-an-externally-signed-certificate.pem は、サービスシークレットを含むファイルです (ここでは外部署名証明書への秘密鍵)。この秘密鍵と、Vault からのシークレットの取得に使用する秘密鍵と混同しないようにしてください。
- secret_vault は、サービスシークレット保存向けに作成された Vault です。
- HTTP/webserver1.idm.example.com は Vault の所有者となるサービスです。
- HTTP/webserver2.idm.example.com および HTTP/webserver3.idm.example.com は Vault メンバーサービスです。
- service-public.pem は、password_vault に保存されているパスワードの暗号化に使用するサービスの公開鍵です。
- service-private.pem は、secret_vault に保存されているパスワードの復号化に使用するサービスの秘密鍵です。
25.1. Ansible を使用して IdM に非対称サービス Vault を存在させる手順
以下の手順に従って、Ansible Playbook を使用して 1 つ以上のプライベート Vault を持つサービス Vault コンテナーを作成し、機密情報を安全に保存します。以下の手順で使用する例では、管理者は secret_vault という名前の非対称 Vault を作成します。こうすることで、Vault メンバーは、Vault のシークレットを取得する際に、秘密鍵を使用して必ず認証することになります。Vault メンバーは、IdM クライアントからファイルを取得できます。
前提条件
次の要件を満たすように Ansible コントロールノードを設定した。
- Ansible バージョン 2.14 以降を使用している。
-
Ansible コントローラーに
ansible-freeipa
パッケージがインストールされている。 - ~/MyPlaybooks/ ディレクトリーに、IdM サーバーの完全修飾ドメイン名 (FQDN) を使用して Ansible インベントリーファイル を作成している (この例の場合)。
-
この例では、secret.yml Ansible Vault に
ipaadmin_password
が保存されていることを前提としています。
-
ターゲットノード (
ansible-freeipa
モジュールが実行されるノード) が、IdM クライアント、サーバー、またはレプリカとして IdM ドメインに含まれている。 - IdM 管理者 パスワードが分かっている。
手順
/usr/share/doc/ansible-freeipa/playbooks/vault
ディレクトリーに移動します。$ cd /usr/share/doc/ansible-freeipa/playbooks/vault
サービスインスタンスの公開鍵を取得します。たとえば、
openssl
ユーティリティーを使用する場合は以下を行います。service-private.pem
秘密鍵を生成します。$ openssl genrsa -out service-private.pem 2048 Generating RSA private key, 2048 bit long modulus .+++ ...........................................+++ e is 65537 (0x10001)
秘密鍵をもとに
service-public.pem
公開鍵を生成します。$ openssl rsa -in service-private.pem -out service-public.pem -pubout writing RSA key
オプション: inventory.file など、存在しない場合はインベントリーファイルを作成します。
$ touch inventory.file
インベントリーファイルを開き、
[ipaserver]
セクションに、設定する IdM サーバーを定義します。たとえば、Ansible に対して server.idm.example.com を設定するように指示するには、次のコマンドを実行します。[ipaserver] server.idm.example.com
Ansible Playbook ファイル ensure-asymmetric-vault-is-present.yml のコピーを作成します。以下に例を示します。
$ cp ensure-asymmetric-vault-is-present.yml ensure-asymmetric-service-vault-is-present-copy.yml
- ensure-asymmetric-vault-is-present-copy.yml ファイルを開いて編集します。
- Ansible コントローラーから server.idm.example.com サーバーに service-public.pem の公開鍵をコピーするタスクを追加します。
ipavault
タスクセクションに以下の変数を設定して、残りのファイルを変更します。-
ipaadmin_password
変数は IdM 管理者パスワードに設定します。 -
secret_vault などの
name
変数を使用して Vault の名前を定義します。 -
vault_type
変数は asymmetric に設定します。 -
service
変数は、Vault を所有するサービスのプリンシパル (例: HTTP/webserver1.idm.example.com) に設定します。 public_key_file
は、公開鍵の場所に設定します。以下は、今回の例で使用するように変更した Ansible Playbook ファイルです。
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Copy public key to ipaserver. copy: src: /path/to/service-public.pem dest: /usr/share/doc/ansible-freeipa/playbooks/vault/service-public.pem mode: 0600 - name: Add data to vault, from a LOCAL file. ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault vault_type: asymmetric service: HTTP/webserver1.idm.example.com public_key_file: /usr/share/doc/ansible-freeipa/playbooks/vault/service-public.pem
-
- ファイルを保存します。
Playbook を実行します。
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-asymmetric-service-vault-is-present-copy.yml