5.5. 在使用 Ansible 泄露时更改 IdM 服务 vault secret

当服务实例被破坏时,请按照此流程重复使用 Ansible playbook 来更改存储在服务 vault 中的 secret。以下示例中,假设获取的机密在 webserver3.idm.example.com 上已被破坏,而存储机密的非对称 vault 存储的密钥没有被破坏。在示例中,管理员重复利用在非对称库中存储一个 secret 时,以及从非对称库中获取一个 secret 导入到 IdM 主机 时使用的 Ansible playbook。在流程开始时,IdM 管理员将新的 PEM 文件存储在非对称的密码库中,对清单文件进行调整,以便不会从已被侵入的 Web 服务器(webserver3.idm.example.com)检索新机密,,然后重新运行这两个过程。

先决条件

  • 您已配置了 Ansible 控制节点以满足以下要求:

    • 您使用 Ansible 版本 2.14 或更高版本。
    • 您已在 Ansible 控制器上安装了 ansible-freeipa 软件包。
    • 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了带有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件
    • 示例假定 secret.yml Ansible vault 存储了 ipaadmin_password
  • 您知道 IdM 管理员密码。
  • 您已创建了非对称密码库用于存储服务机密。
  • 您已为 IdM 主机上运行的 web 服务生成了一个新的 httpd 密钥,以替换已被破坏的旧密钥。
  • httpd 密钥存储在本地 Ansible 控制器上,例如 /usr/share/doc/ansible-freeipa/playbooks/vault/private-key-to-an-externally-certificate.pem 文件中。

步骤

  1. 导航到 /usr/share/doc/ansible-freeipa/playbooks/vault 目录:

    $ cd /usr/share/doc/ansible-freeipa/playbooks/vault
  2. 打开清单文件,并确保正确定义了以下主机:

    • [ipaserver] 部分中的 IdM 服务器。
    • 要在 [webservers] 部分中检索 secret 的主机。例如,要指示 Ansible 获取到 webserver1.idm.example.comwebserver2.idm.example.com 的 secret,请输入:

      [ipaserver]
      server.idm.example.com
      
      [webservers]
      webserver1.idm.example.com
      webserver2.idm.example.com
    重要

    确保列表不包含被入侵的 webserver,在当前的示例 webserver3.idm.example.com 中。

  3. 打开 data-archive-in-asymmetric-vault-copy.yml 文件进行编辑。
  4. 通过在 ipavault 任务部分设置以下变量来修改该文件:

    • ipaadmin_password 变量设置为 IdM 管理员密码。
    • name 变量设置为 vault 的名称,如 secret_vault
    • service 变量设置为 vault 的服务所有者,如 HTTP/webserver.idm.example.com
    • in 变量设置为 "{{ lookup('file', 'new-private-key-to-an-externally-signed-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
  5. 保存这个文件。
  6. 运行 playbook:

    $ ansible-playbook --vault-password-file=password_file -v -i inventory.file data-archive-in-asymmetric-vault-copy.yml
  7. 打开 retrieve-data-asymmetric-vault-copy.yml 文件进行编辑。
  8. 通过在 ipavault 任务部分设置以下变量来修改该文件:

    • ipaadmin_password 变量设置为 IdM 管理员密码。
    • name 变量设置为 vault 的名称,如 secret_vault
    • service 变量设置为密码库的服务所有者,如 HTTP/webserver1.idm.example.com
    • private_key_file 变量设置为用于检索服务 vault secret 的私钥的位置。
    • out 变量设置为 IdM 服务器上您要检索 new-private-key-to-an-externally-signed-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
  9. 在 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
  10. 在 playbook 中添加一个部分,将检索到的 new-private-key-to-an-externally-signed-certificate.pem 文件从 Ansible 控制器所在的地方传输到清单文件的 webservers 部分所列出的 webserver 中:

    ---
    - 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
  11. 保存这个文件。
  12. 运行 playbook:

    $ ansible-playbook --vault-password-file=password_file -v -i inventory.file retrieve-data-asymmetric-vault-copy.yml