配置密钥管理器 (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 文档 获取更多详细信息。设置结果应为

  1. 密码官角色密码

  2. 生成的 Chrystoki.conf

  3. 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 支持以获取帮助。

完成安装后,您应该知道或拥有

  1. 所需的插槽 ID

  2. 文件 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 的方法有两种

  1. 直接将服务连接到 Vault 与 Castellan。在这种情况下,所有密钥都将存储在 Vault 内部的同一个用户下,并且不会存在租户隔离。此选项根本不需要 Barbican 部署。

  2. 将服务连接到 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 中创建密钥所必需的。