配置密钥管理器 (barbican) 服务¶
首先,我们需要设置 env.d 参数并定义要在其上运行 barbican-api 的主机。为此,我们可以扩展 openstack_user_config.yml 或添加文件 /etc/openstack_deploy/conf.d/barbican.yml,内容如下
key-manager_hosts: infra1: ip: 172.29.236.11 infra2: ip: 172.29.236.12 infra3: ip: 172.29.236.13
Barbican 可以配置为以单后端和多后端模式工作。它取决于 barbican_backends_config 字典中的密钥数量。此外,如果变量包含多个后端的配置,则必须显式定义默认后端,例如
barbican_backends_config: software: secret_store_plugin: store_crypto crypto_plugin: simple_crypto hsm: secret_store_plugin: store_crypto crypto_plugin: p11_crypto global_default: True
除此之外,您还需要定义插件特定的配置,可以通过定义变量 barbican_plugins_config 来完成。此字典的每个键将用作配置节名称,并且应将值视为键值配置选项,如 config_overrides 选项。
barbican_plugins_config: simple_crypto_plugin: kek: "{{ barbican_simple_crypto_key | b64encode }}"
设置所有变量并完成配置后,您可以通过运行以下 playbook 来部署 Barbican
# openstack-ansible playbooks/lxc-containers-create.yml --limit lxc_hosts,barbican_all # openstack-ansible playbooks/os-barbican-install.yml # openstack-ansible playbooks/haproxy-install.yml
使用 Thales Luna HSM 后端配置 Barbican¶
作为示例,我们将展示 Thales Luna Network HSM (Safenet) 的配置。Barbican 仅将 HMAC 和 MKEK 密钥存储在 HSM 中,这些密钥用于加密和解密存储在 Barbican MySQL 数据库中的密钥。
MKEK 是主密钥加密密钥,用于加密每个项目独有的 KEK。项目中的所有密钥都使用 KEK 进行加密。
您需要创建一个按需数据保护服务并完成 Luna 插槽的初始化。您可以按照 lunacm 文档 获取更多详细信息。设置结果应为
密码官角色密码
生成的 Chrystoki.conf
libdpod.plugin 和 libCryptoki2.so 的二进制文件
注意
目前 barbican 不支持 Thales FIPS 模式。另外请注意,密码官角色密码必须在首次登录时重置,这应在初始化 CO 角色后立即完成。
完成 Thales 的设置后,我们可以定义 Barbican 部署所需的所有变量。在 user_variables.yml 中定义以下内容
barbican_backends_config: hsm: secret_store_plugin: store_crypto crypto_plugin: p11_crypto barbican_plugins_config: p11_crypto_plugin: library_path: /opt/barbican/libs/libCryptoki2.so login: "{{ barbican_dpod_co_password }}" slot_id: 3 mkek_label: thales_mkek_3 mkek_length: 32 hmac_label: thales_hmac_3 barbican_user_libraries: - src: /etc/openstack_deploy/barbican/libCryptoki2.so dest: /opt/barbican/libs/libCryptoki2.so - src: /etc/openstack_deploy/barbican/libdpod.plugin dest: /opt/barbican/libs/plugins/libdpod.plugin - src: /etc/openstack_deploy/barbican/Chrystoki.conf dest: /opt/barbican/Chrystoki.conf
您还应将 barbican_dpod_co_password 添加到 user_secrets.yml 并将其设置为密码官角色密码的值。
我们需要符号链接 Chrystoki.conf 到 /etc。 此外,还需要手动生成将存储在 HSM 上的 hmac 和 mkek 密钥。
# ansible -m file -a "src=/opt/barbican/Chrystoki.conf dest=/etc/Chrystoki.conf state=link" barbican_all # ansible -m command -a "/openstack/venvs/barbican-{{ venv_tag }}/bin/barbican-manage hsm gen_hmac --library-path /opt/libs/64/libCryptoki2.so --passphrase {{ barbican_dpod_co_password }} --slot-id 3 --label thales_hmac_3" barbican_all[0] # ansible -m command -a "/openstack/venvs/barbican-{{ venv_tag }}/bin/barbican-manage hsm gen_mkek --library-path /opt/libs/64/libCryptoki2.so --passphrase {{ barbican_dpod_co_password }} --slot-id 3 --label thales_mkek_3" barbican_all[0]
使用 Entrust nShield Connect HSM 后端配置 Barbican¶
以下示例演示了支持 Entrust nShield Connect HSM 的配置。Barbican 将 HMAC 和 MKEK 密钥存储在 HSM 中,这些密钥用于加密和解密存储在 Barbican MySQL 数据库中的密钥。
MKEK 代表 主密钥加密密钥,用于加密每个项目独有的 KEK。项目中的所有密钥都使用 KEK 进行加密。
在继续之前,您必须安装 Entrust 提供的 Security World 软件。该软件将安装将在配置中引用的库。 此外,HSM 可能使用一个或多个插槽,这些插槽也将需要完成配置。请参阅 nShield Connect Linux 用户指南 和/或 Entrust 支持以获取帮助。
完成安装后,您应该知道或拥有
所需的插槽 ID
文件
libcknfast.so库
可以使用 pcks11-tool 确定插槽 ID,如下所示
# pkcs11-tool -L --module /opt/nfast/toolkits/pkcs11/libcknfast.so Available slots: Slot 0 (0x1d622495): 6606-XXXX-XXXX Rt2 token label : accelerator token manufacturer : nCipher Corp. Ltd token model : token flags : rng, token initialized, other flags=0x200 hardware version : 0.12 firmware version : 12.50 serial num : 6606-XXXX-XXXX pin min/max : 0/256 Slot 1 (0x1d622496): 6606-XXXX-XXXX Rt2 slot 0 (token not recognized) Slot 2 (0x1d622497): 6606-XXXX-XXXX Rt2 slot 2 (empty) Slot 3 (0x1d622498): 6606-XXXX-XXXX Rt2 slot 3 (empty)
可用的插槽值是十六进制,必须转换为十进制
# echo $((0x1d622495)) 492971157
完成 nShield 相关设置后,我们可以定义 Barbican 部署所需的所有变量。为了方便起见,将 libcknfast.so 库复制到部署节点上的 /etc/openstack_deploy/barbican/。它将相应地分发到 Barbican 服务节点。
在 user_variables.yml 中定义以下内容
barbican_backends_config: hsm: secret_store_plugin: store_crypto crypto_plugin: p11_crypto barbican_plugins_config: p11_crypto_plugin: library_path: /opt/barbican/libs/libcknfast.so token_serial_number: 12345678 login: mypassword123 slot_id: 492971157 mkek_label: thales_mkek_0 mkek_length: 32 hmac_label: thales_hmac_0 encryption_mechanism: CKM_AES_CBC hmac_key_type: CKK_SHA256_HMAC hmac_keygen_mechanism: CKK_SHA256_HMAC barbican_user_libraries: - src: /etc/openstack_deploy/barbican/libcknfast.so dest: /opt/barbican/libs/libcknfast.so
可以根据需要添加或修改覆盖变量。
要生成 HMAC 密钥,请使用适当的值执行以下命令
barbican-manage hsm gen_hmac \ --library-path /opt/nfast/toolkits/pkcs11/libcknfast.so \ --passphrase mypassword123 --slot-id 492971157 --label thales_hmac_0 \ --key-type CKK_SHA256_HMAC \ --mechanism CKM_NC_SHA256_HMAC_KEY_GEN
要生成 MKEK 密钥,请使用适当的值执行以下命令
barbican-manage hsm gen_mkek \ --library-path /opt/nfast/toolkits/pkcs11/libcknfast.so \ --passphrase mypassword123 --slot-id 492971157 --label thales_mkek_0
最后,重新启动 nCipher 服务和 Barbican API 服务
# /opt/nfast/sbin/init.d-ncipher restart # systemctl restart barbican-api
使用 Vault 后端配置 Barbican¶
HashiCorp Vault 是一个非常流行的密钥存储引擎,许多公司在生产中使用它。您可以使用 Vault 与 OpenStack 的方法有两种
直接将服务连接到 Vault 与 Castellan。在这种情况下,所有密钥都将存储在 Vault 内部的同一个用户下,并且不会存在租户隔离。此选项根本不需要 Barbican 部署。
将服务连接到 Barbican,Barbican 连接到 Vault。在这种情况下,我们配置 Castellan 以使用 Barbican 驱动程序,服务将到达它以获取密钥。在这种情况下,Barbican 将生成每个项目独有的 KEK,并在其 MySQL 数据库中存储密钥。反过来,主 KEK 将存储在 Vault 内部。
在两种选项中,您都需要在 Vault 中创建一个 KV2 密钥/值存储。
直接将服务连接到 Vault¶
最终,本节与 Barbican 根本无关,因为它不需要 Barbican 端点存在,并且只需要服务配置(如 Nova 或 Cinder)。要使用它,您需要在 user_variables.yml 中定义以下覆盖
nova_nova_conf_overrides: key_manager: backend: vault vault: kv_mountpoint: secret root_token_id: "{{ vault_root_token }}" vault_url: https://vault.example.com use_ssl: True cinder_cinder_conf_overrides: key_manager: backend: vault vault: kv_mountpoint: secret root_token_id: "{{ vault_root_token }}" vault_url: https://vault.example.com use_ssl: True
设置变量后,我们需要运行角色以重新配置服务
# openstack-ansible playbooks/os-cinder-install.yml --tags cinder-config # openstack-ansible playbooks/os-nova-install.yml -- tags nova-config
将 Barbican 连接到 Vault¶
您需要定义如下所示的变量来配置 Babrican 以使用 Vault 存储驱动程序
barbican_backends_config: vault: secret_store_plugin: vault_plugin crypto_plugin: simple_crypto barbican_plugins_config: vault_plugin: kv_mountpoint: secret root_token_id: "{{ vault_root_token }}" vault_url: https://vault.example.com use_ssl: True
配置服务以使用 Barbican¶
我们需要让 Cinder、Nova 和其他服务知道密钥存储 (Barbican) 现在可用于交互。有特殊的变量,如 <service>_barbican_enabled,在 barbican_all 组中至少有一个主机时,应将其设置为 True。因此,通常只需重新运行服务相关角色即可调整服务的配置以与 barbican 交互
# openstack-ansible playbooks/os-cinder-install.yml --tags cinder-config
# openstack-ansible playbooks/os-nova-install.yml --tags nova-config
然后,我们可以使用 barbican,例如,创建 LUKS 加密的卷。您可以参考 Cinder 文档 以获取示例用法。
您还应确保租户已分配 creator 角色,因为这是在 Barbican 中创建密钥所必需的。