85.5. 在使用 Ansible 泄露时更改 IdM 服务 vault secret
当服务实例被破坏时,请按照此流程重复使用 Ansible playbook 来更改存储在服务 vault 中的 secret。以下示例中的情景假定 on webserver3.idm.example.com 检索到的机密已被破坏,而不是存储该机密的非对称库的密钥。在示例中,管理员重复利用在非对称库中存储一个 secret 时,以及从非对称库中获取一个 secret 导入到 IdM 主机 时使用的 Ansible playbook。在流程开始时,IdM 管理员使用非对称密码库中的新 secret 存储一个新的 PEM
文件,调整清单文件,而不检索到被入侵的 Web 服务器 webserver3.idm.example.com,然后重新运行这两个程序。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您使用 Ansible 版本 2.14 或更高版本。
-
您已在 Ansible 控制器上安装了
ansible-freeipa
软件包。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible 库存储了
ipaadmin_password
。
-
目标节点(这是执行
ansible-freeipa
模块的节点)是 IdM 域的一部分,作为 IdM 客户端、服务器或副本的一部分。 - 您知道 IdM 管理员密码。
- 您已创建了非对称密码库用于存储服务机密。
-
您已为在 IdM 主机上运行的 web 服务生成了新的
httpd
密钥,以替换泄露的旧密钥。 -
新的
httpd
密钥存储在 Ansible 控制器上,例如 /usr/share/doc/ansible-freeipa/playbooks/vault/private-key-to-an-externally-certificate.pem 文件中。
流程
导航到
/usr/share/doc/ansible-freeipa/playbooks/vault
目录:$ cd /usr/share/doc/ansible-freeipa/playbooks/vault
打开清单文件,并确保正确定义了以下主机:
-
[ipaserver]
部分中的 IdM 服务器。 要检索
[webservers]
部分中的机密的主机。例如,要指示 Ansible 检索到 webserver1.idm.example.com 和 webserver2.idm.example.com 的 secret,请输入:[ipaserver] server.idm.example.com [webservers] webserver1.idm.example.com webserver2.idm.example.com
重要确保列表不包含当前 example webserver3.idm.example.com 中被入侵的 web 服务器。
-
- 打开 data-archive-in-asymmetric-vault-copy.yml 文件进行编辑。
通过在
ipavault
任务部分设置以下变量来修改该文件:-
将
ipaadmin_password
变量设置为 IdM 管理员密码。 -
将
name
变量设置为 vault 的名称,如 secret_vault。 -
将
service
变量设置为密码库的服务所有者,如 HTTP/webserver.idm.example.com。 -
将
中的变量
设置为 "{{ lookup('file', 'new-private-key-to-an-externally-certificate.pem')| b64encode }}"。这可确保 Ansible 使用私钥从 Ansible 控制器上的工作目录检索文件,而不是从 IdM 服务器检索。 将
action
变量设置为member
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver.idm.example.com in: "{{ lookup('file', 'new-private-key-to-an-externally-signed-certificate.pem') | b64encode }}" action: member
-
将
- 保存该文件。
运行 playbook:
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file data-archive-in-asymmetric-vault-copy.yml
- 打开 retrieve-data-asymmetric-vault-copy.yml 文件进行编辑。
通过在
ipavault
任务部分设置以下变量来修改该文件:-
将
ipaadmin_password
变量设置为 IdM 管理员密码。 -
将
name
变量设置为 vault 的名称,如 secret_vault。 -
将
service
变量设置为密码库的服务所有者,如 HTTP/webserver1.idm.example.com。 -
将
private_key_file
变量设置为用于检索服务 vault secret 的私钥的位置。 -
将
变量
设置为 IdM 服务器上您要检索 new-private-key-to-an-externally-certificate.pem 机密的位置,如当前工作目录。 将
action
变量设置为member
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Retrieve data from vault hosts: ipaserver become: no gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Retrieve data from the service vault ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com vault_type: asymmetric private_key: "{{ lookup('file', 'service-private.pem') | b64encode }}" out: new-private-key-to-an-externally-signed-certificate.pem state: retrieved
-
将
在 playbook 中添加一个部分,它将从 IdM 服务器检索数据文件到 Ansible 控制器:
--- - name: Retrieve data from vault hosts: ipaserver become: true gather_facts: false tasks: [...] - name: Retrieve data file fetch: src: new-private-key-to-an-externally-signed-certificate.pem dest: ./ flat: yes mode: 0600
在 playbook 中添加一个部分,它将检索到的 new-private-key-to-an-externally-certificate.pem 文件从 上的 Ansible 控制器传输到清单文件的
webservers
部分:--- - name: Send data file to webservers become: true gather_facts: no hosts: webservers tasks: - name: Send data to webservers copy: src: new-private-key-to-an-externally-signed-certificate.pem dest: /etc/pki/tls/private/httpd.key mode: 0444
- 保存该文件。
运行 playbook:
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file retrieve-data-asymmetric-vault-copy.yml