加密密钥

本文档描述了支持的密钥加密操作,并解释了如何使用适当的工具执行它们。

Ansible-Vault

OpenStack-Ansible 提供了使用 Ansible Vault 加密和轮换密钥文件和密钥对的工具。

角色默认值

# Allowed values: "encrypt", "decrypt" and "rotate"
ansible_vault_action: encrypt
# Path to the OpenStack-Ansible configuration (openstack_deploy) folder
ansible_vault_repo_path: "{{ lookup('ansible.builtin.env', 'OSA_CONFIG_DIR') | default(lookup('ansible.builtin.env', 'PWD') ~ '/openstack_deploy', True) }}"
# Name of the region, which will be used as vault id
ansible_vault_region: "{{ service_region | default('RegionOne') }}"
# Path to the ansible-vault password file
ansible_vault_pw: "{{ lookup('ansible.builtin.env', 'ANSIBLE_VAULT_PASSWORD_FILE') }}"
# Path to the freshly generated ansible-vault password file. Used for rotation only
ansible_vault_new_pw: "{{ ansible_vault_pw ~ '.new' }}"
# If in-place copy is enabled, role will completely override the resulting file
# When disabled, Ansible will produce a managed block for each managed variable
ansible_vault_in_place_copy: true
# Paths to files, where individual variables needs to be encrypted
ansible_vault_secrets_paths:
  - "{{ ansible_vault_repo_path }}/user_secrets.yml"
  - "{{ ansible_vault_repo_path }}/group_vars/all/secrets.yml"
# Instead of defining paths to files explicitly, you can search filesystem for
# files with individually encrypted secrets. Results will be combined with
# `ansible_vault_secrets_paths`
ansible_vault_secrets_search_paths: []
ansible_vault_secrets_search_pattern: "secrets.yml"
# Can be overriden to a specific destination in case venv is not activated
ansible_vault_binary: ansible-vault

安装 Collection

要安装 Collection,请在您的区域部署配置文件中定义它,该文件位于 /etc/openstack_deploy/user-collection-requirements.yml,如下所示

- name: osa_ops.encrypt_secrets
  type: git
  version: master
  source: https://opendev.org/openstack/openstack-ansible-ops#/encrypt_secrets

然后,运行 ./scripts/bootstrap-ansible.sh 以安装 Collection。

密钥文件的初始加密

首次初始化区域时,应在将其存储在 Git 中之前加密密钥和生成的私钥。 您可以在本地或在部署主机上执行此过程。

注意

每当生成新的服务或密钥对时,都必须重新运行加密过程,这可能发生在后续的部署阶段。

本地加密密钥

本地加密密钥的过程类似于在部署主机上运行它,但 OpenStack-Ansible 可能需要一些特定于上下文的变量,这些变量不可用,必须手动提供。

在继续之前,请确保您拥有已安装 Ansible 的 Python 虚拟环境。

  1. 生成 Ansible Vault 的密码并安全地存储它

pwgen 36 1 > /tmp/vault.secret
  1. 运行加密 playbook

ansible-playbook osa_ops.encrypt_secrets.ansible_vault -e ansible_vault_region=${REGION_NAME} -e ansible_vault_pw=/tmp/vault.secret
  1. /tmp/vault.secret 的内容复制到部署主机,例如复制到 /etc/openstack/vault.secret

  2. /etc/openstack_deploy/user.rc 中定义 vault secret 路径

export ANSIBLE_VAULT_PASSWORD_FILE=/etc/openstack/vault.secret
  1. 在您首选的密码管理器中安全地存储密码。

  2. 将更改推送到您的 Git 仓库。

  3. 确保部署主机解密任何必需的密钥。

在部署主机上加密密钥

按照以下步骤直接在部署主机上加密密钥

  1. 生成密码并安全地存储它

pwgen 36 1 > /etc/openstack/vault.secret
  1. /etc/openstack_deploy/user.rc 中定义 vault secret 路径

export ANSIBLE_VAULT_PASSWORD_FILE=/etc/openstack/vault.secret
  1. 运行加密 playbook

openstack-ansible osa_ops.encrypt_secrets.ansible_vault
  1. 将更改提交并推送到 /etc/openstack_deploy 到您的 Git 仓库。

  2. 将 vault 密码 (/etc/openstack/vault.secret) 保存在安全的密码管理器中。

  3. 在运行 OpenStack playbook 之前,解密任何必要的密钥。

在部署主机上解密密钥对

OpenStack-Ansible PKI 角色不支持在部署主机上以加密格式存储私钥。 相反,配置一个在将它们放置在部署主机上后解密密钥的流水线。

应将加密的密钥对提交到 Git 仓库,但未加密地存储在部署主机上。

要解密它们,请运行以下 playbook

openstack-ansible osa_ops.encrypt_secrets.ansible_vault -e ansible_vault_action=decrypt

轮换 Ansible Vault 密钥

轮换 Ansible Vault 密码需要使用新密码重新加密仓库中的所有密钥。 假设原始密码存储在 /tmp/vault.secret 中,请按照以下步骤操作

  1. 生成新的 vault 密码/加密密钥

pwgen 45 1 > /tmp/vault.secret.new
  1. 使用新密码重新加密所有密钥

ANSIBLE_VAULT_PASSWORD_FILE=/tmp/vault.secret ansible-playbook osa_ops.encrypt_secrets.ansible_vault -e ansible_vault_action=rotate
  1. 将新密码传输到部署主机,并将其安全地存储在密码管理器中。