第25章 Ansible を使用した IdM サービス Vault の管理: シークレットの保存および取得
本セクションでは、管理者が ansible-freeipa vault モジュールを使用してサービスシークレットを一元的にセキュアに保存する方法を説明します。この例で使用されている Vault は非対称です。そのため、これを使用するには、管理者が次の手順を実行する必要があります。
-
opensslユーティリティーなどを使用して秘密鍵を生成する。 - 秘密鍵をもとに公開鍵を生成する。
サービスシークレットは、管理者が Vault にアーカイブする時に公開鍵を使用して暗号化されます。その後、ドメイン内の特定のマシンでホストされるサービスインスタンスが、秘密鍵を使用してシークレットを取得します。シークレットにアクセスできるのは、サービスと管理者のみです。
シークレットが漏洩した場合には、管理者はサービス Vault でシークレットを置き換えて、漏洩されていないサービスインスタンスに配布しなおすことができます。
前提条件
- 以下の Playbook で定義された ipaserver ホストカテゴリーのすべての IdM サーバーに、KRA (Key Recovery Authority)証明書システムコンポーネントがインストールされている。詳細は IdM での Key Recovery Authority (KRA) のインストール を参照してください。
この手順では、以下を使用します。
- IdM の 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-freeipaパッケージがインストールされました。 - この例では、~/MyPlaybooks/ ディレクトリーに、IdM サーバーの完全修飾ドメイン名 (FQDN) を含む Ansible インベントリーファイル が作成されていることを前提としています。
-
この例では、secret.yml Ansible Vault に
ipaadmin_passwordが保存されていることを前提としています。
-
ターゲットノード (
ansible-freeipaモジュールが実行されるノード) が、IdM クライアント、サーバー、またはレプリカとして IdM ドメインに含まれている。
手順
MyPlaybooks ディレクトリーに移動します。
$ cd ~/MyPlaybooks/Ansible Playbook ファイル( /usr/share/doc/ansible-freeipa/playbooks/vault/ensure-asymmetric-vault-is-present.yml )のコピーを作成します。以下に例を示します。
$ cp /usr/share/doc/ansible-freeipa/playbooks/vault/ensure-asymmetric-vault-is-present.yml ensure-asymmetric-vault-is-present-copy.ymlサービスインスタンスの公開鍵を取得します。たとえば、
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
- 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