使用 OpenStack Key Manager 管理 Secret

Red Hat OpenStack Platform 16.2

如何将 OpenStack 密钥管理器(barbican)与 OpenStack 部署集成。

OpenStack Documentation Team

摘要

如何将 OpenStack 密钥管理器(barbican)与 OpenStack 部署集成。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。与我们分享您的成功秘诀。

在 JIRA 中提供文档反馈

使用 Create Issue 表单对文档提供反馈。JIRA 问题将在 Red Hat OpenStack Platform Jira 项目中创建,您可以在其中跟踪您的反馈进度。

  1. 确保您已登录到 JIRA。如果您没有 JIRA 帐户,请创建一个帐户来提交反馈。
  2. 点击以下链接打开 Create Issue 页面: Create Issue
  3. 完成 SummaryDescription 字段。在 Description 字段中,包含文档 URL、章节或章节号以及问题的详细描述。不要修改表单中的任何其他字段。
  4. Create

第 1 章 部署和配置 OpenStack 密钥管理器(barbican)

OpenStack Key Manager (barbican)是 Red Hat OpenStack Platform 的 secret Manager。您可以使用 barbican API 和命令行集中管理 OpenStack 服务使用的证书、密钥和密码。在 Red Hat OpenStack Platform 中不默认启用 barbican。您可以在现有 OpenStack 部署中部署 barbican。

barbican 目前支持以下指南中描述的用例:

  • 对称加密密钥 - 用于块存储(cinder)卷加密、临时磁盘加密和对象存储(swift)加密等。
  • 非对称密钥和证书 - 用于 glance 镜像签名和验证,等等。

OpenStack Key Manager 与 Block Storage (cinder)、Network (neutron)和计算(nova)组件集成。

1.1. OpenStack Key Manager 工作流

下图显示了 OpenStack Key Manager 用来管理您的环境的机密的工作流。

barbican 密钥流

1.2. OpenStack Key Manager 加密类型

证书、API 密钥和密码等 secret 可以存储在 barbican 数据库中的加密 blob 中,或者直接存储在安全存储系统中。您可以使用简单的加密插件或 PKCS the 加密插件来加密 secret。

要将 secret 存储为加密 blob 在 barbican 数据库中,可以使用以下选项:

  • 简单的加密插件 - 默认启用简单的加密插件,并使用单个对称密钥加密所有机密有效负载。这个密钥以纯文本形式存储在 barbican.conf 文件中,因此防止未经授权的访问此文件非常重要。
  • PKCS这个加密插件 - PKCS the crypto 插件使用特定于项目的密钥加密密钥(pKEK)加密 secret,这些密钥存储在 barbican 数据库中。这些项目特定的 pKEK 由主密钥密钥(MKEK)加密,后者存储在硬件安全模块(HSM)中。所有加密和解密操作都会在 HSM 中进行,而不是在进程内存中进行。PKCS the 插件通过 PKCS the API 与 HSM 通信。由于加密是在安全硬件中完成的,并且每个项目使用了不同的 pKEK,所以此选项比简单的加密插件更安全。

    红帽支持带有以下任何 HSM 的 PKCS the 后端。

    设备发行版本支持高可用性(HA)支持

    ATOS Trustway Proteccio NetHSM

    16.0+

    16.1+

    Entrust nShield Connect HSM

    16.0+

    不支持

    Thales Luna Network HSM

    16.1+(技术预览)

    16.1+(技术预览)

    注意

    关于高可用性(HA)选项:barbican 服务在 Apache 中运行,并由 director 配置为使用 HAProxy 来实现高可用性。后端层的 HA 选项将取决于所使用的后端。例如,对于简单加密,所有 barbican 实例在配置文件中具有相同的加密密钥,从而导致简单的 HA 配置。

1.2.1. 配置多个加密机制

您可以将单个 Barbican 实例配置为使用多个后端。完成后,您必须将后端指定为 全局默认后端。您还可以为每个项目指定默认后端。如果项目不存在映射,则该项目的 secret 将使用全局默认后端存储。

例如,您可以将 Barbican 配置为使用 Simple crypto 和 PKCS the 插件。如果将 Simple crypto 设为全局默认值,则所有项目使用该后端。然后,您可以通过将 PKCS the 设置为该项目的首选后端来指定哪些项目使用 PKCS the 后端。

如果您决定迁移到新后端,您可以在启用新后端作为全局默认值或项目特定后端时保持原始可用。因此,旧的 secret 通过旧后端仍然可用,新 secret 存储在新的全局默认后端中。

1.3. 部署密钥管理器

若要部署 OpenStack Key Manager,首先为 barbican 服务创建一个环境文件,并使用额外的环境文件重新部署 overcloud。然后,您可以将用户添加到 creator 角色中,以创建和编辑 barbican secret,或者创建在 barbican 中保存 secret 的加密的卷。

注意

此流程将 barbican 配置为使用 simple_crypto 后端。还有额外的后端,如需要不同配置的 PKCS,以及根据使用 HSM 的不同 heat 模板文件。不支持 KMIP、Hashicorp Vault 和 DogTag 等其他后端。

前提条件

  • overcloud 已部署并运行

流程

  1. 在 undercloud 节点上,为 barbican 创建环境文件。

    $ cat /home/stack/templates/configure-barbican.yaml
    	parameter_defaults:
    	  BarbicanSimpleCryptoGlobalDefault: true

    BarbicanSimpleCryptoGlobalDefault 将这个插件设置为全局默认插件。

    您还可以在环境文件中添加以下选项:

    • BarbicanPassword - 为 barbican 服务帐户设置密码。
    • BarbicanWorkers - 为 barbican::wsgi::apache 设置 worker 数量。默认使用 '%{::processorcount}'
    • BarbicanDebug - 启用调试。
    • BarbicanPolicies - 定义要为 barbican 配置的策略。使用哈希值,例如:{ barbican-context_is_admin: { key: context_is_admin, value: 'role:admin' } }。然后,此条目会添加到 /etc/barbican/policy.json 中。后续部分将详细介绍策略。
    • BarbicanSimpleCryptoKek - 若未指定,则 director 将生成密钥加密密钥(KEK)。
  2. 将以下文件添加到 openstack overcloud deploy 命令中,而不在脚本中删除之前添加的角色、模板或环境文件:

    • /usr/share/openstack-tripleo-heat-templates/environments/services/barbican.yaml
    • /usr/share/openstack-tripleo-heat-templates/environments/barbican-backend-simple-crypto.yaml
    • /home/stack/templates/configure-barbican.yaml
  3. 重新运行部署脚本,以将更改应用到部署:

    $ openstack overcloud deploy \
        --timeout 100 \
        --templates /usr/share/openstack-tripleo-heat-templates \
        --stack overcloud \
        --libvirt-type kvm \
        --ntp-server clock.redhat.com \
        -e /home/stack/containers-prepare-parameter.yaml \
        -e /home/stack/templates/config_lvm.yaml \
        -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \
        -e /home/stack/templates/network/network-environment.yaml \
        -e /home/stack/templates/hostnames.yml \
        -e /home/stack/templates/nodes_data.yaml \
        -e /home/stack/templates/extra_templates.yaml \
        -e /home/stack/container-parameters-with-barbican.yaml \
        -e /usr/share/openstack-tripleo-heat-templates/environments/services/barbican.yaml \
        -e /usr/share/openstack-tripleo-heat-templates/environments/barbican-backend-simple-crypto.yaml \
        -e /home/stack/templates/configure-barbican.yaml \
        --log-file overcloud_deployment_38.log
  4. 检索 创建者 角色的 id

    openstack role show creator
    +-----------+----------------------------------+
    | Field     | Value                            |
    +-----------+----------------------------------+
    | domain_id | None                             |
    | id        | 4e9c560c6f104608948450fbf316f9d7 |
    | name      | creator                          |
    +-----------+----------------------------------+
    注意

    除非安装了 OpenStack Key Manager (barbican),否则不会看到 创建者 角色。

  5. 将用户分配给 创建者 角色并指定相关项目。在本例中,project_a 项目中的名为 user1 的用户添加到 创建者角色中

    openstack role add --user user1 --project project_a 4e9c560c6f104608948450fbf316f9d7

验证

  1. 创建测试 secret。例如:

    $ openstack secret store --name testSecret --payload 'TestPayload'
    +---------------+------------------------------------------------------------------------------------+
    | Field         | Value                                                                              |
    +---------------+------------------------------------------------------------------------------------+
    | Secret href   | https://192.168.123.163/key-manager/v1/secrets/4cc5ffe0-eea2-449d-9e64-b664d574be53 |
    | Name          | testSecret                                                                         |
    | Created       | None                                                                               |
    | Status        | None                                                                               |
    | Content types | None                                                                               |
    | Algorithm     | aes                                                                                |
    | Bit length    | 256                                                                                |
    | Secret type   | opaque                                                                             |
    | Mode          | cbc                                                                                |
    | Expiration    | None                                                                               |
    +---------------+------------------------------------------------------------------------------------+
  2. 检索您刚才创建的 secret 的有效负载:

    openstack secret get https://192.168.123.163/key-manager/v1/secrets/4cc5ffe0-eea2-449d-9e64-b664d574be53 --payload
    +---------+-------------+
    | Field   | Value       |
    +---------+-------------+
    | Payload | TestPayload |
    +---------+-------------+

1.4. 查看密钥管理器策略

barbican 使用策略来决定允许哪些用户对 secret 执行操作,如添加或删除密钥。为实现这些控制,S keystone 项目角色(如您之前创建的 创建者 )映射到 barbican 内部权限。因此,分配给这些项目角色的用户会收到对应的 barbican 权限。

默认策略在代码中定义,通常不需要任何修改。如果没有进行策略更改,您可以使用环境中的现有容器查看默认策略。如果更改了默认策略,并且您希望查看默认值,请首先使用单独的系统拉取 openstack-barbican-api 容器。

前提条件

  • OpenStack Key Manager 已部署并运行

流程

  1. 使用您的红帽凭证登录到 podman:

    podman login
    username: ********
    password: ********
  2. 拉取 openstack-barbican-api 容器:

    podman pull \
    registry.redhat.io/rhosp-rhel8/openstack-barbican-api:16.2
  3. 在当前工作目录中生成策略文件:

    podman run -it \
    registry.redhat.io/rhosp-rhel8/openstack-barbican-api:16.2 \
    oslopolicy-policy-generator \
    --namespace barbican > barbican-policy.yaml

验证

查看 barbican-policy.yaml 文件,以检查 barbican 使用的策略。策略由四个不同的角色来实施,用于定义用户如何与机密和机密元数据交互。用户通过分配给特定角色接收这些权限:

admin
admin 角色可以在所有项目间读取、创建、编辑和删除 secret。
创建者
creator 角色可以读取、创建、编辑和删除位于创建者范围的项目中的 secret。
Observer
observer 角色只能读取 secret。
audit
audit 角色只能读取元数据。audit 角色无法读取 secret。

例如,以下条目列出了每个项目的 管理观察 器和 创建 keystone 角色。请注意,请注意它们被分配了 role:adminrole:observerrole:creator 权限:

#
#"admin": "role:admin"

#
#"observer": "role:observer"

#
#"creator": "role:creator"

这些角色也可以通过 barbican 分组在一起。例如,指定 admin_or_creator 的规则可应用到 rule:adminrule:creator 的成员。

在文件的下面,有 secret:putsecret:delete 操作。请注意,注意哪些角色有执行这些操作的权限。在以下示例中,secret:delete 表示只有 admin创建者 角色成员才能删除机密条目。此外,该规则指出该项目的 admin创建者 角色中的用户可以删除该项目中的机密。项目匹配由 secret_project_match 规则定义,该规则也会在策略中定义。

secret:delete": "rule:admin_or_creator and rule:secret_project_match"

第 2 章 使用 OpenStack Key Manager (barbican)管理 secret 和密钥

您可以使用 OpenStack Key Manager 创建、更新和删除 secret 和加密密钥。您还可以备份和恢复加密密钥和 barbican 数据库。建议您定期备份加密密钥和 barbican 数据库。

2.1. 查看 secret

要查看 secret 列表,请运行 openstack secret list 命令。该列表包括 URI、名称、类型和其他有关 secret 的信息。

流程

  • 查看 secret 列表:

    $ openstack secret list
    +------------------------------------------------------------------------------------+------+---------------------------+--------+-------------------------------------------+-----------+------------+-------------+------+------------+
    | Secret href                                                                        | Name | Created                   | Status | Content types                             | Algorithm | Bit length | Secret type | Mode | Expiration |
    +------------------------------------------------------------------------------------+------+---------------------------+--------+-------------------------------------------+-----------+------------+-------------+------+------------+
    | https://192.168.123.169:9311/v1/secrets/24845e6d-64a5-4071-ba99-0fdd1046172e | None | 2018-01-22T02:23:15+00:00 | ACTIVE | {u'default': u'application/octet-stream'} | aes       |        256 | symmetric   | None | None       |
    +------------------------------------------------------------------------------------+------+---------------------------+--------+-------------------------------------------+-----------+------------+-------------+------+------------+

2.2. 创建 secret

要创建 secret,请运行 openstack secret store 命令,并指定 secret 的名称以及 secret 的有效负载(可选)。

流程

  • 创建 secret。例如:

    $ openstack secret store --name testSecret --payload 'TestPayload'
    +---------------+------------------------------------------------------------------------------------+
    | Field         | Value                                                                              |
    +---------------+------------------------------------------------------------------------------------+
    | Secret href   | https://192.168.123.163:9311/v1/secrets/ecc7b2a4-f0b0-47ba-b451-0f7d42bc1746 |
    | Name          | testSecret                                                                         |
    | Created       | None                                                                               |
    | Status        | None                                                                               |
    | Content types | None                                                                               |
    | Algorithm     | aes                                                                                |
    | Bit length    | 256                                                                                |
    | Secret type   | opaque                                                                             |
    | Mode          | cbc                                                                                |
    | Expiration    | None                                                                               |
    +---------------+------------------------------------------------------------------------------------+

2.3. 在 secret 中添加有效负载

您无法更改 secret 的有效负载(除删除 secret 外),但是如果您在没有指定有效负载的情况下创建了 secret,您可以使用 openstack secret update 命令向它添加一个有效负载。

流程

  • 在 secret 中添加有效负载:

    $ openstack secret update https://192.168.123.163:9311/v1/secrets/ca34a264-fd09-44a1-8856-c6e7116c3b16 'TestPayload-updated'
    $

2.4. 删除 secret

要删除 secret,请运行 openstack secret delete 命令并指定 secret URI。

流程

  • 使用指定的 URI 删除 secret:

    $ openstack secret delete https://192.168.123.163:9311/v1/secrets/ecc7b2a4-f0b0-47ba-b451-0f7d42bc1746
    $

2.5. 生成对称密钥

要生成对称密钥,请使用 order create 命令,然后将密钥存储在 barbican 中。然后,您可以将对称密钥用于某些任务,如 nova 磁盘加密和 swift 对象加密。

前提条件

  • OpenStack Key Manager 已安装并运行

流程

  1. 使用 order create 生成一个新的 256 位密钥,并将其存储在 barbican 中。例如:

    $ openstack secret order create --name swift_key --algorithm aes --mode ctr --bit-length 256 --payload-content-type=application/octet-stream key
    +----------------+-----------------------------------------------------------------------------------+
    | Field          | Value                                                                             |
    +----------------+-----------------------------------------------------------------------------------+
    | Order href     | https://192.168.123.173:9311/v1/orders/043383fe-d504-42cf-a9b1-bc328d0b4832 |
    | Type           | Key                                                                               |
    | Container href | N/A                                                                               |
    | Secret href    | None                                                                              |
    | Created        | None                                                                              |
    | Status         | None                                                                              |
    | Error code     | None                                                                              |
    | Error message  | None                                                                              |
    +----------------+-----------------------------------------------------------------------------------+

    您还可以使用 --mode 选项将生成的密钥配置为使用特定的模式,如 ctrcbc。如需更多信息,请参阅 NIST SP 800-38A

  2. 查看顺序详情来标识生成的键的位置,这里显示为 Secret href 值:

    $ openstack secret order get https://192.168.123.173:9311/v1/orders/043383fe-d504-42cf-a9b1-bc328d0b4832
    +----------------+------------------------------------------------------------------------------------+
    | Field          | Value                                                                              |
    +----------------+------------------------------------------------------------------------------------+
    | Order href     | https://192.168.123.173:9311/v1/orders/043383fe-d504-42cf-a9b1-bc328d0b4832  |
    | Type           | Key                                                                                |
    | Container href | N/A                                                                                |
    | Secret href    | https://192.168.123.173:9311/v1/secrets/efcfec49-b9a3-4425-a9b6-5ba69cb18719 |
    | Created        | 2018-01-24T04:24:33+00:00                                                          |
    | Status         | ACTIVE                                                                             |
    | Error code     | None                                                                               |
    | Error message  | None                                                                               |
    +----------------+------------------------------------------------------------------------------------+
  3. 检索 secret 的详情:

    $ openstack secret get https://192.168.123.173:9311/v1/secrets/efcfec49-b9a3-4425-a9b6-5ba69cb18719
    +---------------+------------------------------------------------------------------------------------+
    | Field         | Value                                                                              |
    +---------------+------------------------------------------------------------------------------------+
    | Secret href   | https://192.168.123.173:9311/v1/secrets/efcfec49-b9a3-4425-a9b6-5ba69cb18719 |
    | Name          | swift_key                                                                     |
    | Created       | 2018-01-24T04:24:33+00:00                                                          |
    | Status        | ACTIVE                                                                             |
    | Content types | {u'default': u'application/octet-stream'}                                          |
    | Algorithm     | aes                                                                                |
    | Bit length    | 256                                                                                |
    | Secret type   | symmetric                                                                          |
    | Mode          | ctr                                                                                |
    | Expiration    | None                                                                               |
    +---------------+------------------------------------------------------------------------------------+

2.6. 备份简单的加密密钥

要备份简单的加密密钥,请将包含主 KEK 的 barbican.conf 文件备份到安全强化的位置,然后备份 barbican 数据库。

重要

该流程包括生成测试 secret 和密钥的步骤。如果您已经为 secret 生成了密钥,请跳过测试密钥步骤并使用您生成的密钥。

前提条件

  • OpenStack Key Manager 已安装并运行
  • 您有一个 KEK 备份的安全强化位置

流程

  1. 在 overcloud 上,生成新的 256 位密钥并将其存储在 barbican 中:

    (overcloud) [stack@undercloud-0 ~]$ openstack secret order create --name swift_key --algorithm aes --mode ctr --bit-length 256 --payload-content-type=application/octet-stream key
    +----------------+-----------------------------------------------------------------------+
    | Field          | Value                                                                 |
    +----------------+-----------------------------------------------------------------------+
    | Order href     | http://10.0.0.104:9311/v1/orders/2a11584d-851c-4bc2-83b7-35d04d3bae86 |
    | Type           | Key                                                                   |
    | Container href | N/A                                                                   |
    | Secret href    | None                                                                  |
    | Created        | None                                                                  |
    | Status         | None                                                                  |
    | Error code     | None                                                                  |
    | Error message  | None                                                                  |
    +----------------+-----------------------------------------------------------------------+
  2. 创建测试 secret:

    (overcloud) [stack@undercloud-0 ~]$ openstack secret store --name testSecret --payload 'TestPayload'
    +---------------+------------------------------------------------------------------------+
    | Field         | Value                                                                  |
    +---------------+------------------------------------------------------------------------+
    | Secret href   | http://10.0.0.104:9311/v1/secrets/93f62cfd-e008-401f-be74-bf057c88b04a |
    | Name          | testSecret                                                             |
    | Created       | None                                                                   |
    | Status        | None                                                                   |
    | Content types | None                                                                   |
    | Algorithm     | aes                                                                    |
    | Bit length    | 256                                                                    |
    | Secret type   | opaque                                                                 |
    | Mode          | cbc                                                                    |
    | Expiration    | None                                                                   |
    +---------------+------------------------------------------------------------------------+
  3. 确认已创建了测试 secret:

    (overcloud) [stack@undercloud-0 ~]$ openstack secret list
    +------------------------------------------------------------------------+------------+---------------------------+--------+-------------------------------------------+-----------+------------+-------------+------+------------+
    | Secret href                                                            | Name       | Created                   | Status | Content types                             | Algorithm | Bit length | Secret type | Mode | Expiration |
    +------------------------------------------------------------------------+------------+---------------------------+--------+-------------------------------------------+-----------+------------+-------------+------+------------+
    | http://10.0.0.104:9311/v1/secrets/93f62cfd-e008-401f-be74-bf057c88b04a | testSecret | 2018-06-19T18:25:25+00:00 | ACTIVE | {u'default': u'text/plain'}               | aes       |        256 | opaque      | cbc  | None       |
    | http://10.0.0.104:9311/v1/secrets/f664b5cf-5221-47e5-9887-608972a5fefb | swift_key  | 2018-06-19T18:24:40+00:00 | ACTIVE | {u'default': u'application/octet-stream'} | aes       |        256 | symmetric   | ctr  | None       |
    +------------------------------------------------------------------------+------------+---------------------------+--------+-------------------------------------------+-----------+------------+-------------+------+------------+
  4. 将包含主 KEK 的 barbican.conf 文件复制到安全强化位置。
  5. 登录到 controller-0 节点并检索 barbican 用户密码:

    [heat-admin@controller-0 ~]$ sudo grep -r "barbican::db::mysql::password" /etc/puppet/hieradata
    /etc/puppet/hieradata/service_configs.json:    "barbican::db::mysql::password": "seDJRsMNRrBdFryCmNUEFPPev",
    注意

    只有 barbican 用户有权访问 barbican 数据库。因此,需要 barbican 用户密码来备份或恢复数据库。

  6. 备份 barbican 数据库:

    [heat-admin@controller-0 ~]$ mysqldump -u barbican -p"seDJRsMNRrBdFryCmNUEFPPev" barbican > barbican_db_backup.sql
  7. 检查数据库备份是否存储在 /home/heat-admin 中:

    [heat-admin@controller-0 ~]$ ll
    total 36
    -rw-rw-r--. 1 heat-admin heat-admin 36715 Jun 19 18:31 barbican_db_backup.sql
  8. 在 overcloud 上,删除之前创建的 secret,并验证它们不再存在:

    (overcloud) [stack@undercloud-0 ~]$ openstack secret delete http://10.0.0.104:9311/v1/secrets/93f62cfd-e008-401f-be74-bf057c88b04a
    (overcloud) [stack@undercloud-0 ~]$ openstack secret delete http://10.0.0.104:9311/v1/secrets/f664b5cf-5221-47e5-9887-608972a5fefb
    (overcloud) [stack@undercloud-0 ~]$ openstack secret list
    
    (overcloud) [stack@undercloud-0 ~]$

2.7. 从备份中恢复简单的加密密钥

要从备份中恢复 barbican 数据库,请使用 barbican 权限登录到 Controller 节点,并恢复 barbican 数据库。要从备份中恢复 KEK,请使用备份文件覆盖 barbican.conf 文件。

前提条件

  • OpenStack Key Manager 已安装并运行
  • 您有一个 barbican.conf 文件和 barbican 数据库的现有备份

流程

  1. 登录到 controller-0 节点,检查控制器上是否有 barbican 数据库,该数据库是否授予对 barbican 用户的访问权限来恢复数据库:

    [heat-admin@controller-0 ~]$ mysql -u barbican -p"seDJRsMNRrBdFryCmNUEFPPev"
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 3799
    Server version: 10.1.20-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | barbican           |
    | information_schema |
    +--------------------+
    2 rows in set (0.00 sec)
    
    MariaDB [(none)]> exit
    Bye
    [heat-admin@controller-0 ~]$
  2. 将备份文件恢复到 barbican 数据库:

    [heat-admin@controller-0 ~]$ sudo mysql -u barbican -p"seDJRsMNRrBdFryCmNUEFPPev" barbican < barbican_db_backup.sql
    [heat-admin@controller-0 ~]$
  3. 使用之前备份的文件覆盖 barbican.conf 文件。

验证

  • 在 overcloud 上,验证测试 secret 是否已成功恢复:

    (overcloud) [stack@undercloud-0 ~]$ openstack secret list
    +------------------------------------------------------------------------+------------+---------------------------+--------+-------------------------------------------+-----------+------------+-------------+------+------------+
    | Secret href                                                            | Name       | Created                   | Status | Content types                             | Algorithm | Bit length | Secret type | Mode | Expiration |
    +------------------------------------------------------------------------+------------+---------------------------+--------+-------------------------------------------+-----------+------------+-------------+------+------------+
    | http://10.0.0.104:9311/v1/secrets/93f62cfd-e008-401f-be74-bf057c88b04a | testSecret | 2018-06-19T18:25:25+00:00 | ACTIVE | {u'default': u'text/plain'}               | aes       |        256 | opaque      | cbc  | None       |
    | http://10.0.0.104:9311/v1/secrets/f664b5cf-5221-47e5-9887-608972a5fefb | swift_key  | 2018-06-19T18:24:40+00:00 | ACTIVE | {u'default': u'application/octet-stream'} | aes       |        256 | symmetric   | ctr  | None       |
    +------------------------------------------------------------------------+------------+---------------------------+--------+-------------------------------------------+-----------+------------+-------------+------+------------+
    (overcloud) [stack@undercloud-0 ~]$

第 3 章 将 OpenStack 密钥管理器(barbican)与硬件安全模块(HSM)设备集成

使用基于硬件的加密处理,将 Red Hat OpenStack Platform 部署与硬件安全模块(HSM)设备集成,以提高安全状态。当您规划 OpenStack Key Manager 与 HSM 设备集成时,您必须选择一个受支持的加密类型和 HSM 设备,设置常规备份,并查看可能会影响您的部署的任何其他信息或限制。

3.1. 将 OpenStack 密钥管理器(barbican)与 IaaS HSM 集成

要将 PKCS Liberty 后端与您的 Trustway Proteccio Net HSM 设备集成,请创建一个配置文件,使用参数将 barbican 与 HSM 连接。您可以通过在 atos_hsms 参数下列出两个或多个 HSM 来启用 HA。

规划

默认情况下,HSM 最多可有 32 个并发连接。如果您超过这个数字,您可能会从 PKCS the 客户端遇到内存错误。您可以计算连接数量,如下所示:

  • 每个控制器都有一个 barbican-api,以及一个 barbican-worker 进程。
  • 每个 Barbican API 进程都使用 N Apache worker 执行 - (其中 N 默认为 CPU 的数量)。
  • 每个 worker 都有一个到 HSM 的连接。

每个 barbican-worker 进程都有一个与数据库的连接。您可以使用 BarbicanWorkers heat 参数为每个 API 进程定义 Apache worker 的数量。默认情况下,Apache worker 的数量与 CPU 数量匹配。

例如,如果您有三个控制器,每个控制器都有 32 个内核,则每个控制器上的 Barbican API 都使用 32 个 Apache worker。因此,一个控制器会消耗所有 32 HSM 连接。为避免这种争用,请限制为每个节点配置的 Barbican Apache worker 的数量。在本例中,将 BarbicanWorkers 设置为 10,以便所有三个控制器都能够为每个 HSM 进行 10 个并发连接。

前提条件

  • 为 Ice HSM 提供厂商软件的受密码保护的 HTTPS 服务器

表 3.1. HTTPS 服务器提供的文件

FileExample提供的

Proteccio Client Software ISO 镜像文件

Proteccio1.09.05.iso

HSM 供应商

SSL 服务器证书

proteccio.CRT

HSM 管理员

SSL 客户端证书

client.CRT

HSM 管理员

SSL 客户端密钥

client.KEY

HSM 管理员

流程

  1. 为 Barbican 创建 configure-barbican.yaml 环境文件并添加以下参数:

    parameter_defaults
      BarbicanSimpleCryptoGlobalDefault: false
      BarbicanPkcs11CryptoGlobalDefault: true
      BarbicanPkcs11CryptoLogin: ********
      BarbicanPkcs11CryptoSlotId: 1
      ATOSVars:
        atos_client_iso_name: Proteccio1.09.05.iso
        atos_client_iso_location: https://user@PASSWORD:example.com/Proteccio1.09.05.iso
        atos_client_cert_location: https://user@PASSWORD:example.com/client.CRT
        atos_client_key_location: https://user@PASSWORD:example.com/client.KEY
        atos_hsms:
          - name: myHsm1
            server_cert_location: https://user@PASSWORD:example.com/myHsm1.CRT
            ip: 192.168.1.101
          - name: myHsm2
            server_cert_location: https://user@PASSWORD:example.com/myHsm2.CRT
            ip: ip: 192.168.1.102
    注意

    atos_hsms 参数取代了os _hsm_ip_addressatos_server_cert_location 的参数,它们已被弃用,并将在以后的发行版本中删除。

    表 3.2. Heat 参数

    参数

    BarbicanSimpleCryptoGlobalDefault

    这是一个布尔值,用于确定 simplecrypto 是否是全局默认值。

    BarbicanPkcs11GlobalDefault

    这是一个布尔值,用于决定 PKCS the 是否为全局默认值。

    BarbicanPkcs11CryptoSlotId

    Barbican 使用的 Virtual HSM 的插槽 ID。

    ATOSVars

    atos_client_iso_name

    kiosk 客户端软件 ISO 的文件名。这个值必须与 atos_client_iso_location 参数的 URL 中的文件名匹配。

    atos_client_iso_location

    URL,包括用户名和密码,用于指定 Proteccio Client Software ISO 镜像的 HTTPS 服务器位置。

    atos_client_cert_location

    URL,包括用户名和密码,用于指定 SSL 客户端证书的 HTTPS 服务器位置。

    atos_client_key_location

    URL,包括用户名和密码,用于指定 SSL 客户端密钥的 HTTPS 服务器位置。这必须是上述客户端证书的匹配密钥。

    atos_hsms

    指定 HSM 的名称、证书位置和 IP 地址的一个或多个 HSM 列表。当您在这个列表中包含多个 HSM 时,Barbican 为负载均衡和高可用性配置 HSM。

  2. 在部署命令中包含自定义 configure-barbican.yaml, barbican.yaml 和针对 ATOS 的 barbican-backend-pkcs11-atos.yaml 环境文件,以及与部署相关的任何其他环境文件:

    $ openstack overcloud deploy \
        --timeout 100 \
        --templates /usr/share/openstack-tripleo-heat-templates \
        --stack overcloud \
        --libvirt-type kvm \
        --ntp-server clock.redhat.com \
        -e /home/stack/containers-prepare-parameter.yaml \
        -e /home/stack/templates/config_lvm.yaml \
        -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \
        -e /home/stack/templates/network/network-environment.yaml \
        -e /home/stack/templates/hostnames.yml \
        -e /home/stack/templates/nodes_data.yaml \
        -e /home/stack/templates/extra_templates.yaml \
        -e /usr/share/openstack-tripleo-heat-templates/environments/services/barbican.yaml \
        -e /usr/share/openstack-tripleo-heat-templates/environments/barbican-backend-pkcs11-atos.yaml \
        -e /home/stack/templates/configure-barbican.yaml \
        --log-file overcloud_deployment_with_atos.log

验证

  1. 创建测试 secret:

    $ openstack secret store --name testSecret --payload 'TestPayload'
    +---------------+------------------------------------------------------------------------------------+
    | Field         | Value                                                                              |
    +---------------+------------------------------------------------------------------------------------+
    | Secret href   | https://192.168.123.163/key-manager/v1/secrets/4cc5ffe0-eea2-449d-9e64-b664d574be53 |
    | Name          | testSecret                                                                         |
    | Created       | None                                                                               |
    | Status        | None                                                                               |
    | Content types | None                                                                               |
    | Algorithm     | aes                                                                                |
    | Bit length    | 256                                                                                |
    | Secret type   | opaque                                                                             |
    | Mode          | cbc                                                                                |
    | Expiration    | None                                                                               |
    +---------------+------------------------------------------------------------------------------------+
  2. 检索您刚才创建的 secret 的有效负载:

    openstack secret get https://192.168.123.163/key-manager/v1/secrets/4cc5ffe0-eea2-449d-9e64-b664d574be53 --payload
    +---------+-------------+
    | Field   | Value       |
    +---------+-------------+
    | Payload | TestPayload |
    +---------+-------------+

3.2. 将 OpenStack 密钥管理器(barbican)与 Thales Luna Network HSM 集成

要将 PKCS the 后端与您的 Thales Luna Network HSM 设备集成,以便为硬件加密处理,请使用 Ansible 角色在 Controller 上下载并安装 Thales Luna 客户端软件,并创建一个密钥管理器配置文件来包括预定义的 HSM IP 和凭证。

前提条件

  • 为 Thales Luna Network HSM 提供厂商软件的受密码保护的 HTTPS 服务器。
  • 供应商在压缩的 zip 存档中提供 Luna Network HSM 客户端软件。

流程

  1. 在 director 上安装 ansible-role-lunasa-hsm 角色:

    sudo dnf install ansible-role-lunasa-hsm
  2. 为 Key Manager (barbican)创建一个 configure-barbican.yaml 环境文件,并添加特定于您的环境的参数。

    parameter_defaults:
      BarbicanPkcs11CryptoMKEKLabel: "barbican_mkek_0"
      BarbicanPkcs11CryptoHMACLabel: "barbican_hmac_0"
      BarbicanPkcs11CryptoLogin: "$PKCS_11_USER_PIN"
      BarbicanPkcs11CryptoGlobalDefault: true
      LunasaVars:
        lunasa_client_tarball_name: 610-012382-014_SW_Client_HSM_6.2_RevA.tar.zip
        lunasa_client_tarball_location: https://user:$PASSWORD@http-server.example.com/luna_software/610-012382-014_SW_Client_HSM_6.2_RevA.tar.zip
        lunasa_client_installer_path: 610-012382-014_SW_Client_HSM_6.2_RevA/linux/64/install.sh
        lunasa_hsms:
          - hostname: luna-hsm.example.com
            admin_password: "$HSM_ADMIN_PASSWORD"
            partition: myPartition1
            partition_serial: 123456789

    表 3.3. Heat 参数

    参数

    BarbicanSimpleCryptoGlobalDefault

    这是一个布尔值,用于确定 simplecrypto 是否是全局默认值。

    BarbicanPkcs11GlobalDefault

    这是一个布尔值,用于决定 PKCS the 是否为全局默认值。

    BarbicanPkcs11CryptoTokenLabel

    如果您有一个 HSM,则参数的值是分区标签。如果您在两个或多个分区间使用 HA,则这是您要提供给 HA 组的标签。

    BarbicanPkcs11CryptoLogin

    用于登录到 HSM 的 PKCS the 密码,由 HSM 管理员提供。

    LunasaVar

    lunasa_client_tarball_name

    Luna 软件 tarball 的名称。

    lunasa_client_tarball_location

    指定 Luna Software tarball 的 HTTPS 服务器位置的 URL。

    lunasa_client_installer_path

    zipped tarball 中的 install.sh 脚本的路径。

    lunasa_client_rotate_cert

    (可选)当设置为 true 时,将生成新的客户端证书来替换任何现有证书。默认:false

    lunasa_client_working_dir

    (可选)在 Controller 节点上工作目录。Default: /tmp/lunasa_client_install

    lunasa_hsms

    指定名称、主机名、admin_password、分区和分区序列号的一个或多个 HSM 列表。当您在这个列表中包含多个 HSM 时,Barbican 为高可用性配置 HSM。

  3. 在部署命令中包含自定义 configure-barbican.yaml 和 Thales barbican-backend-pkcs11-llunasa.yaml 环境文件,以及与部署相关的任何其他模板:

    $ openstack overcloud deploy --templates \
      ....
      -e /usr/share/openstack-tripleo-heat-templates/environments/services/barbican.yaml \
      -e /usr/share/openstack-tripleo-heat-templates/environments/barbican-backend-pkcs11-lunasa.yaml \
      -e /home/stack/templates/configure-barbican.yaml \
      --log-file overcloud_deployment_with_luna.log

3.3. 将 OpenStack 密钥管理器(barbican)与 Entrust nShield Connect XC HSM 集成

要将 PKCS the backend 与 Entrust nShield Connect XC HSM 集成,请使用 Ansible 角色在 Controller 上下载并安装 Entrust 客户端软件,并创建一个 Barbican 配置文件使其包含预定义的 HSM IP 和凭证。

前提条件

  • 为 Entrust nShield Connect XC 提供厂商软件的密码保护的 HTTPS 服务器。

流程

  1. 为 Barbican 创建 configure-barbican.yaml 环境文件,并添加特定于您的环境的参数。使用以下片段作为示例:

        parameter_defaults:
            VerifyGlanceSignatures: true
            SwiftEncryptionEnabled: true
            BarbicanPkcs11CryptoLogin: 'sample string'
            BarbicanPkcs11CryptoSlotId: '492971158'
            BarbicanPkcs11CryptoGlobalDefault: true
            BarbicanPkcs11CryptoLibraryPath: '/opt/nfast/toolkits/pkcs11/libcknfast.so'
            BarbicanPkcs11CryptoEncryptionMechanism: 'CKM_AES_CBC'
            BarbicanPkcs11CryptoHMACKeyType: 'CKK_SHA256_HMAC'
            BarbicanPkcs11CryptoHMACKeygenMechanism: 'CKM_NC_SHA256_HMAC_KEY_GEN'
            BarbicanPkcs11CryptoMKEKLabel: 'barbican_mkek_10'
            BarbicanPkcs11CryptoMKEKLength: '32'
            BarbicanPkcs11CryptoHMACLabel: 'barbican_hmac_10'
            BarbicanPkcs11CryptoThalesEnabled: true
            BarbicanPkcs11CryptoEnabled: true
            ThalesVars:
                thales_client_working_dir: /tmp/thales_client_install
                thales_client_tarball_location: https://your server/CipherTools-linux64-dev-12.40.2.tgz
                thales_client_tarball_name: CipherTools-linux64-dev-12.40.2.tgz
                thales_client_path: linux/libc6_11/amd64/nfast
                thales_client_uid: 42481
                thales_client_gid: 42481
                thales_km_data_location: https://your server/kmdata_post_card_creation.tar.gz
                thales_km_data_tarball_name: kmdata_post_card_creation.tar.gz
                thales_rfs_server_ip_address: 192.168.10.12
                thales_hsm_config_location: hsm-C90E-02E0-D947
                nShield_hsms:
                  - name: hsm-name.example.com
                    ip: 192.168.10.10
                thales_rfs_user: root
                thales_rfs_key: |
                    -----BEGIN RSA PRIVATE KEY-----
    Sample private key
    -----END RSA PRIVATE KEY-----
    
    resource_registry:
        OS::TripleO::Services::BarbicanBackendPkcs11Crypto: /home/stack/tripleo-heat-templates/puppet/services/barbican-backend-pkcs11-crypto.yaml

    表 3.4. Heat 参数

    参数

    BarbicanSimpleCryptoGlobalDefault

    这是一个布尔值,用于确定 simplecrypto 是否是全局默认值。

    BarbicanPkcs11GlobalDefault

    这是一个布尔值,用于决定 PKCS the 是否为全局默认值。

    BarbicanPkcs11CryptoSlotId

    Barbican 使用的 Virtual HSM 的插槽 ID。

    BarbicanPkcs11CryptoMKEKLabel

    此参数定义 HSM 中生成的 mKEK 的名称。director 使用此名称在 HSM 中创建此密钥。

    BarbicanPkcs11CryptoHMACLabel

    此参数定义 HSM 中生成的 HMAC 密钥的名称。director 使用此名称在 HSM 中创建此密钥。

    ThalesVars

    thales_client_working_dir

    用户定义的临时工作目录。

    thales_client_tarball_location

    指定 Entrust 软件的 HTTPS 服务器的 URL。

    thales_km_data_tarball_name

    Entrust 软件 tarball 的名称。

    thales_rfs_key

    用于获取与 RFS 服务器的 SSH 连接的私钥。您必须将它作为授权密钥添加到 RFS 服务器中。

  2. 包含自定义 configure-barbican.yaml 环境文件,以及 barbican.yaml 和 Thales 特定 barbican-backend-pkcs11-thales.yaml 环境文件,以及运行 openstack overcloud deploy 命令时部署所需的任何其他模板:

    $ openstack overcloud deploy \
        --timeout 100 \
        --templates /usr/share/openstack-tripleo-heat-templates \
        --stack overcloud \
        --libvirt-type kvm \
        --ntp-server clock.redhat.com \
        -e /home/stack/containers-prepare-parameter.yaml \
        -e /home/stack/templates/config_lvm.yaml \
        -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \
        -e /home/stack/templates/network/network-environment.yaml \
        -e /home/stack/templates/hostnames.yml \
        -e /home/stack/templates/nodes_data.yaml \
        -e /home/stack/templates/extra_templates.yaml \
        -e /usr/share/openstack-tripleo-heat-templates/environments/services/barbican.yaml \
        -e /usr/share/openstack-tripleo-heat-templates/environments/barbican-backend-pkcs11-thales.yaml \
        -e /home/stack/templates/configure-barbican.yaml \
        --log-file overcloud_deployment_with_atos.log

验证

  1. 创建测试 secret:

    $ openstack secret store --name testSecret --payload 'TestPayload'
    +---------------+------------------------------------------------------------------------------------+
    | Field         | Value                                                                              |
    +---------------+------------------------------------------------------------------------------------+
    | Secret href   | https://192.168.123.163/key-manager/v1/secrets/4cc5ffe0-eea2-449d-9e64-b664d574be53 |
    | Name          | testSecret                                                                         |
    | Created       | None                                                                               |
    | Status        | None                                                                               |
    | Content types | None                                                                               |
    | Algorithm     | aes                                                                                |
    | Bit length    | 256                                                                                |
    | Secret type   | opaque                                                                             |
    | Mode          | cbc                                                                                |
    | Expiration    | None                                                                               |
    +---------------+------------------------------------------------------------------------------------+
  2. 检索您刚才创建的 secret 的有效负载:

    openstack secret get https://192.168.123.163/key-manager/v1/secrets/4cc5ffe0-eea2-449d-9e64-b664d574be53 --payload
    +---------+-------------+
    | Field   | Value       |
    +---------+-------------+
    | Payload | TestPayload |
    +---------+-------------+

3.3.1. 使用 Entrust nShield Connect 进行负载均衡

现在,您可以通过指定一组有效 HSM,在 Entrust nShield Connect HSMs 上启用负载共享。当列出了多个 HSM 时,会启用负载共享。

这个功能在此发行版本中作为技术预览提供,因此不受红帽完全支持。它只应用于测试,不应部署在生产环境中。

有关技术预览功能的更多信息,请参阅覆盖范围详细信息

流程

  • 为 Entrust nShield Connect HSMs 配置 nameip 参数时,指定多个将启用负载共享:

      parameter_defaults:
        ....
        ThalesVars:
          ....
          nshield_hsms:
            - name: hsm-name1.example.com
              ip: 192.168.10.10
            - name: hsm-nam2.example.com
              ip: 192.168.10.11
          ....

3.4. 轮转 MKEK 和 HMAC 密钥

您可以使用 director 更新轮转 MKEK 和 HMAC 密钥。

注意

由于 Barbican 的限制,MKEK 和 HMAC 具有相同的密钥类型。

流程

  1. 在您的部署环境文件中添加以下参数:

    BarbicanPkcs11CryptoRewrapKeys:          true
  2. 如果您的标签类似如下,请更改 MKEK 和 HMAC 键上的标签:

            BarbicanPkcs11CryptoMKEKLabel: 'barbican_mkek_10'
            BarbicanPkcs11CryptoHMACLabel: 'barbican_hmac_10'

    您可以通过递增值来更改标签:

            BarbicanPkcs11CryptoMKEKLabel: 'barbican_mkek_11'
            BarbicanPkcs11CryptoHMACLabel: 'barbican_hmac_11'
    注意

    不要更改 HMAC 密钥类型。

  3. 使用 director 重新部署以应用更新。director 检查是否为 MKEK 和 HMAC 标记的密钥是否存在,然后创建它们。此外,在 BarbicanPkcs11CryptoRewrapKeys 参数设置为 True 时,director 调用 barbican-manage hsm pkek_rewrap 来重新包装所有现有的 pKEK。

第 4 章 加密和验证 OpenStack 服务

您可以使用 barbican 来加密并验证多个 Red Hat OpenStack Platform 服务,如 Block Storage (cinder)加密密钥、块存储卷镜像、Object Storage (swift)对象和镜像服务(glance)镜像。

重要

如果 Nova 格式已加密卷是未加密的,则先使用它们。然后,生成的块设备会呈现给 Compute 节点。

容器化服务指南

  • 不要更新您可能在物理节点主机操作系统中找到的任何配置文件,例如 /etc/cinder/cinder.conf。容器化服务不引用此文件。
  • 不要更新容器中运行的配置文件。重启容器后,更改将会丢失。

    相反,如果必须更改容器化服务,请更新 /var/lib/config-data/puppet-generated/ 中的配置文件,用于生成容器。

    例如:

    • keystone: /var/lib/config-data/puppet-generated/keystone/etc/keystone/keystone.conf
    • cinder: /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf
    • nova: /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf

    更改会在重启容器后应用。

4.1. 在rest 对象加密 Object Storage (swift)

默认情况下,上传到 Object Storage (swift)的对象会存储未加密的对象。因此,可以直接从文件系统访问对象。如果磁盘在丢弃前没有正确清除磁盘,则可能会造成安全风险。启用 barbican 后,Object Storage 服务(swift)可以透明地加密和解密存储(at-rest)对象。at-rest 加密与传输中的加密不同,因为它在存储在磁盘上时引用加密的对象。

Swift 透明执行这些加密任务,在上传到 swift 时会自动加密对象,然后在提供给用户时自动解密对象。这种加密和解密使用相同的(symmetric)密钥完成,该密钥存储在 barbican 中。

注意

在启用加密并将数据添加到 swift 集群后,您无法禁用加密,因为数据现在存储在加密状态。因此,如果禁用加密,数据将无法读取,直到使用相同的密钥重新启用加密。

前提条件

  • OpenStack Key Manager 已安装并启用

流程

  1. 在您的环境文件中包含 SwiftEncryptionEnabled: True 参数,然后使用 /home/stack/overcloud_deploy.sh 重新运行 openstack overcloud deploy
  2. 确认 swift 已配置为使用 at-rest 加密:

    $ crudini --get /var/lib/config-data/puppet-generated/swift/etc/swift/proxy-server.conf pipeline-main pipeline
    
    pipeline = catch_errors healthcheck proxy-logging cache ratelimit bulk tempurl formpost authtoken keystone staticweb copy container_quotas account_quotas slo dlo versioned_writes kms_keymaster encryption proxy-logging proxy-server

    其结果应包括用于加密的条目。

4.2. 加密块存储(cinder)卷

您可以使用 barbican 管理 Block Storage (cinder)加密密钥。此配置使用 LUKS 对连接到您的实例的磁盘进行加密,包括引导磁盘。密钥管理对用户是透明的;当您使用 luks 作为加密类型创建新卷时,cinder 会为卷生成一个对称密钥 secret,并将其存储在 barbican 中。引导实例时(或附加加密卷),nova 从 barbican 检索密钥,并将 secret 存储在本地作为 Compute 节点上的 Libvirt secret。

流程

  1. 在运行 cinder-volumenova-compute 服务的节点上,确认 nova 和 cinder 都配置为使用 barbican 进行密钥管理:

    $ crudini --get /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf key_manager backend
    castellan.key_manager.barbican_key_manager.BarbicanKeyManager
    
    $ crudini --get /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf key_manager backend
    castellan.key_manager.barbican_key_manager.BarbicanKeyManager
  2. 创建使用加密的卷模板。当您创建新卷时,可以把它们建模到您此处定义的设置中:

    $ openstack volume type create --encryption-provider nova.volume.encryptors.luks.LuksEncryptor --encryption-cipher aes-xts-plain64 --encryption-key-size 256 --encryption-control-location front-end LuksEncryptor-Template-256
    +-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Field       | Value                                                                                                                                                                              |
    +-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | description | None                                                                                                                                                                               |
    | encryption  | cipher='aes-xts-plain64', control_location='front-end', encryption_id='9df604d0-8584-4ce8-b450-e13e6316c4d3', key_size='256', provider='nova.volume.encryptors.luks.LuksEncryptor' |
    | id          | 78898a82-8f4c-44b2-a460-40a5da9e4d59                                                                                                                                               |
    | is_public   | True                                                                                                                                                                               |
    | name        | LuksEncryptor-Template-256                                                                                                                                                         |
    +-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  3. 创建一个新卷,并指定它使用 LuksEncryptor-Template-256 设置:

    $ openstack volume create --size 1 --type LuksEncryptor-Template-256 'Encrypted-Test-Volume'
    +---------------------+--------------------------------------+
    | Field               | Value                                |
    +---------------------+--------------------------------------+
    | attachments         | []                                   |
    | availability_zone   | nova                                 |
    | bootable            | false                                |
    | consistencygroup_id | None                                 |
    | created_at          | 2018-01-22T00:19:06.000000           |
    | description         | None                                 |
    | encrypted           | True                                 |
    | id                  | a361fd0b-882a-46cc-a669-c633630b5c93 |
    | migration_status    | None                                 |
    | multiattach         | False                                |
    | name                | Encrypted-Test-Volume                |
    | properties          |                                      |
    | replication_status  | None                                 |
    | size                | 1                                    |
    | snapshot_id         | None                                 |
    | source_volid        | None                                 |
    | status              | creating                             |
    | type                | LuksEncryptor-Template-256           |
    | updated_at          | None                                 |
    | user_id             | 0e73cb3111614365a144e7f8f1a972af     |
    +---------------------+--------------------------------------+

    生成的 secret 会自动上传到 barbican 后端。

    注意

    确保创建加密卷的用户在项目中具有 创建者 barbican 角色。如需更多信息,请参阅 授予用户对创建者角色的访问权限 部分。

  4. 使用 barbican 确认是否存在磁盘加密密钥。在本例中,时间戳与 LUKS 卷创建时间匹配:

    $ openstack secret list
    +------------------------------------------------------------------------------------+------+---------------------------+--------+-------------------------------------------+-----------+------------+-------------+------+------------+
    | Secret href                                                                        | Name | Created                   | Status | Content types                             | Algorithm | Bit length | Secret type | Mode | Expiration |
    +------------------------------------------------------------------------------------+------+---------------------------+--------+-------------------------------------------+-----------+------------+-------------+------+------------+
    | https://192.168.123.169:9311/v1/secrets/24845e6d-64a5-4071-ba99-0fdd1046172e | None | 2018-01-22T02:23:15+00:00 | ACTIVE | {u'default': u'application/octet-stream'} | aes       |        256 | symmetric   | None | None       |
    +------------------------------------------------------------------------------------+------+---------------------------+--------+-------------------------------------------+-----------+------------+-------------+------+------------+
  5. 将新卷附加到现有实例。例如:

    $ openstack server add volume testInstance Encrypted-Test-Volume

    然后,卷会呈现在客户端操作系统中,并可使用内置工具挂载。

4.2.1. 将块存储卷迁移到 OpenStack 密钥管理器

如果您之前使用 ConfKeyManager 管理磁盘加密密钥,您可以通过扫描数据库以迁移到 barbican 范围内的 encryption_key_id 条目,将卷迁移到 OpenStack Key Manager。每个条目都会获得一个新的 barbican 密钥 ID,现有的 ConfKeyManager secret 被保留。

注意
  • 在以前的版本中,您可以使用 ConfKeyManager 加密的卷重新分配所有权。对于由 barbican 管理的密钥的卷,这不可能。
  • 激活 barbican 不会破坏现有的 keymgr 卷。

前提条件

在迁移前,请查看 Barbican 管理的加密卷和使用 ConfKeyManager 的卷之间的区别:

  • 您无法传输加密卷的所有权,因为目前无法传输 barbican secret 的所有权。
  • barbican 对允许读和删除 secret 的人员更严格,这可能会影响一些 cinder 卷操作。例如,用户无法附加、分离或删除其他用户的卷。

流程

  1. 部署 barbican 服务。
  2. 将创建 者角色 添加到 cinder 服务。例如:

    #openstack role create creator
    #openstack role add --user cinder creator  --project service
  3. 重启 cinder-volumecinder-backup 服务。cinder-volumecinder-backup 服务会自动开始迁移过程。您可以检查日志文件以查看迁移的状态信息:

    • cinder-volume - 迁移存储在 cinder 的 Volumes 和 Snapshots 表中的密钥。
    • cinder-backup - 迁移 Backups 表中的键。
  4. 监控显示迁移已完成的消息的日志,并检查没有更多卷正在使用 ConfKeyManager all-zeros 加密密钥 ID。
  5. cinder.confnova.conf 中删除 fixed_key 选项。您必须确定哪些节点配置了此设置。
  6. 从 cinder 服务中删除 创建者 角色。

验证

  • 启动进程后,其中一个条目会出现在日志文件中。这表明迁移是否正确启动,或者它标识它遇到的问题:

    • 不迁移加密密钥,因为 ConfKeyManager 仍在使用中。
    • 不迁移加密密钥,因为 ConfKeyManager 的 fixed_key 没有被使用。
    • 不支持迁移加密密钥,因为迁移到 'XXX' key_manager 后端。 - 此消息不太可能出现;它是一种安全检查来处理在 barbican 以外的另一个 Key Manager 后端。这是因为代码只支持一个迁移场景: ConfKeyManager barbican。
    • 不迁移加密密钥,因为没有与此主机关联的卷。 - 当 cinder-volume 在多个主机上运行时,可能会发生与它关联的卷。这是因为每个主机都需要负责处理自己的卷。
    • 开始迁移 ConfKeyManager 键。
    • 将卷 <UUID> 加密密钥迁移到 Barbican - 迁移期间,将检查所有主机的卷;如果卷仍在使用 ConfKeyManager 的密钥 ID (它只包括零 (00000000-0000-0000-0000-000000000000),则会出现这个消息。

      • 对于 cinder-backup,此消息使用稍有不同的大写: 迁移卷 [...]Migrating Backup [...]
  • 每个主机检查其所有卷后,主机会显示概述状态消息:

    `No volumes are using the ConfKeyManager's encryption_key_id.`
    `No backups are known to be using the ConfKeyManager's encryption_key_id.`
  • 您还可以看到以下条目:

    • 使用 ConfKeyManager 的全零加密密钥 ID 仍然有 %d 卷。
    • 使用 ConfKeyManager 的全零加密密钥 ID 仍然有 %d 备份。

      这两个消息都可能出现在 cinder-volumecinder-backup 日志中。每个服务仅处理自己的条目的迁移,而服务则了解另一个的状态。因此,cinder-volume 知道 cinder-backup 仍然有要迁移的备份,cinder-backup 知道 cinder-volume 服务是否有要迁移的卷。

虽然每个主机只迁移自己的卷,但摘要消息基于对任何卷仍然需要迁移的全局评估,但允许您确认所有卷的迁移已完成。

cleanup

将密钥 ID 迁移到 barbican 后,固定密钥会保留在配置文件中。这可能会对某些用户造成安全问题,因为 fixed_key 值没有在 .conf 文件中加密。

要解决这个问题,您可以从 nova 和 cinder 配置中手动删除 fixed_key 值。但是,首先先完成测试并查看日志文件的输出,因为仍依赖于这个值的磁盘无法访问。

重要

encryption_key_id 最近被添加到 Backup 表中,作为 Queens 发行版本的一部分。因此,已存在的加密卷的备份可能会存在。all-zeros encryption_key_id 存储在备份本身上,但不出现在 备份 数据库中。因此,迁移过程无法知道某些加密卷的备份是否仍依赖于全零 ConfKeyMgr 密钥 ID。

  1. 检查现有的 fixed_key 值。这两个服务都必须匹配这些值。

    crudini --get /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf keymgr fixed_key
    crudini --get /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf keymgr fixed_key
    重要

    备份现有的 fixed_key 值。这允许您在出现问题时恢复值,或者需要恢复使用旧加密密钥的备份。

  2. 删除 fixed_key 值:

    crudini --del /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf keymgr fixed_key
    crudini --del /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf keymgr fixed_key

故障排除

只有请求者具有 创建者 角色时,才能创建 barbican secret。这意味着 cinder 服务本身需要创建者角色,否则会发生类似如下的日志序列:

  1. 开始迁移 ConfKeyManager 键。
  2. 将卷 <UUID> 加密密钥迁移到 Barbican
  3. 迁移加密密钥时出错:禁止创建 Secret - 查看您的用户/项目权限
  4. 使用 ConfKeyManager 的全零加密密钥 ID 仍然有 %d 卷。

键消息是第三个消息: Secret 创建尝试不允许。要解决这个问题,更新 cinder 帐户的权限:

  1. 运行 openstack role add --project service --user cinder creator
  2. 重启 cinder-volumecinder-backup 服务。

因此,迁移的下一次尝试应该可以成功。

4.3. 验证 Block Storage (cinder) 卷镜像

块存储服务(cinder)会在从镜像创建卷过程中自动验证任何下载的、已签名的镜像的签名。在将镜像写入卷前,会验证签名。要提高性能,您可以使用 Block Storage Image-Volume 缓存来存储验证的镜像来创建新卷。

注意

Red Hat Ceph Storage 或 RBD 卷不支持 Cinder 镜像签名验证。

流程

  1. 登录到 Controller 节点。
  2. 选择以下选项之一:

    • 查看 日志中的 cinder 镜像验证活动 /var/log/containers/cinder/cinder-volume.log

      例如,当实例引导时,您可以预期以下条目:

      2018-05-24 12:48:35.256 1 INFO cinder.image.image_utils [req-7c271904-4975-4771-9d26-cbea6c0ade31 b464b2fd2a2140e9a88bbdacf67bdd8c a3db2f2beaee454182c95b646fa7331f - default default] Image signature verification succeeded for image d3396fa0-2ea2-4832-8a77-d36fa3f2ab27
    • 使用 openstack volume listcinder volume show 命令:

      1. 使用 openstack volume list 命令查找卷 ID。
      2. 在计算节点上运行 cinder volume show 命令:

        cinder volume show <VOLUME_ID>
  3. 找到 volume_image_metadata 部分,其中包含 验证的行签名 : True

    $ cinder show d0db26bb-449d-4111-a59a-6fbb080bb483
    +--------------------------------+-------------------------------------------------+
    | Property                       | Value                                           |
    +--------------------------------+-------------------------------------------------+
    | attached_servers               | []                                              |
    | attachment_ids                 | []                                              |
    | availability_zone              | nova                                            |
    | bootable                       | true                                            |
    | consistencygroup_id            | None                                            |
    | created_at                     | 2018-10-12T19:04:41.000000                      |
    | description                    | None                                            |
    | encrypted                      | True                                            |
    | id                             | d0db26bb-449d-4111-a59a-6fbb080bb483            |
    | metadata                       |                                                 |
    | migration_status               | None                                            |
    | multiattach                    | False                                           |
    | name                           | None                                            |
    | os-vol-host-attr:host          | centstack.localdomain@nfs#nfs                   |
    | os-vol-mig-status-attr:migstat | None                                            |
    | os-vol-mig-status-attr:name_id | None                                            |
    | os-vol-tenant-attr:tenant_id   | 1a081dd2505547f5a8bb1a230f2295f4                |
    | replication_status             | None                                            |
    | size                           | 1                                               |
    | snapshot_id                    | None                                            |
    | source_volid                   | None                                            |
    | status                         | available                                       |
    | updated_at                     | 2018-10-12T19:05:13.000000                      |
    | user_id                        | ad9fe430b3a6416f908c79e4de3bfa98                |
    | volume_image_metadata          | checksum : f8ab98ff5e73ebab884d80c9dc9c7290     |
    |                                | container_format : bare                         |
    |                                | disk_format : qcow2                             |
    |                                | image_id : 154d4d4b-12bf-41dc-b7c4-35e5a6a3482a |
    |                                | image_name : cirros-0.3.5-x86_64-disk           |
    |                                | min_disk : 0                                    |
    |                                | min_ram : 0                                     |
    |                                | signature_verified : False                      |
    |                                | size : 13267968                                 |
    | volume_type                    | nfs                                             |
    +--------------------------------+-------------------------------------------------+
注意

快照保存为镜像服务(glance)镜像。如果您将计算服务(nova)配置为检查签名的镜像,则必须从 glance 手动下载镜像,为镜像签名,然后重新上传镜像。无论快照来自使用签名镜像创建的实例,还是从从签名镜像创建的卷引导的实例,都为 true。

注意

卷可以上传为镜像服务(glance)镜像。如果原始卷可引导,则镜像可用于在块存储服务(cinder)中创建可引导卷。如果您已将块存储服务配置为检查签名的镜像,则必须从 glance 手动下载镜像,计算镜像签名并使用镜像更新所有适当的镜像签名属性。更多信息请参阅 第 4.5 节 “验证快照”

4.3.1. 自动删除卷镜像加密密钥

当块存储服务(glance)上传到镜像服务(glance)时,块存储服务(cinder)会在密钥管理服务(barbican)中创建一个加密密钥。这会在加密密钥和存储的镜像之间创建一个 1:1 个关系。

加密密钥删除可防止密钥管理服务无限度地消耗资源。Block Storage、Key Management 和 Image 服务会自动管理加密卷的密钥,包括删除密钥。

块存储服务会自动为卷镜像添加两个属性:

  • cinder_encryption_key_id - Key Management 服务为特定镜像的加密密钥的标识符。
  • cinder_encryption_key_deletion_policy - 告知镜像服务的策略是否删除与此镜像关联的密钥。
重要

这些属性的值会自动分配。为避免意外数据丢失,请不要调整这些值

当您创建卷镜像时,块存储服务会将 cinder_encryption_key_deletion_policy 属性设置为 on_image_deletion。当您删除卷镜像时,如果 cinder_encryption_key_deletion_policy 等于 on_image_deletion,则镜像服务会删除对应的加密密钥。

重要

红帽不推荐手动操作 cinder_encryption_key_idcinder_encryption_key_deletion_policy 属性。如果您使用 cinder_encryption_key_id 值标识的加密密钥用于任何其他目的,则可能会破坏数据丢失。

4.4. 签名镜像服务(glance)镜像

当您将镜像服务(glance)配置为验证上传的镜像是否已被篡改,您必须先为镜像签名,然后才能使用这些镜像启动实例。使用 openssl 命令,使用存储在 barbican 中的密钥为镜像签名,然后使用附带的签名信息将镜像上传到 glance。因此,在每次使用前验证镜像签名,如果签名不匹配,则实例构建过程会失败。

前提条件

  • OpenStack Key Manager 已安装并启用

流程

  1. 在环境文件中,通过 VerifyGlanceSignatures: True 设置启用镜像验证。您必须重新运行 openstack overcloud deploy 命令才能使此设置生效。
  2. 要验证是否启用了 glance 镜像验证,请在 overcloud Compute 节点上运行以下命令:

    $ sudo crudini --get /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf glance verify_glance_signatures
    注意

    如果您使用 Ceph 作为镜像和 Compute 服务的后端,则会创建一个 CoW 克隆。因此,无法执行镜像签名验证。

  3. 确认 glance 已配置为使用 barbican:

    $ sudo crudini --get /var/lib/config-data/puppet-generated/glance_api/etc/glance/glance-api.conf key_manager backend
    castellan.key_manager.barbican_key_manager.BarbicanKeyManager
  4. 生成证书:

    openssl genrsa -out private_key.pem 1024
    openssl rsa -pubout -in private_key.pem -out public_key.pem
    openssl req -new -key private_key.pem -out cert_request.csr
    openssl x509 -req -days 14 -in cert_request.csr -signkey private_key.pem -out x509_signing_cert.crt
  5. 将证书添加到 barbican secret 存储中:

    $ source ~/overcloudrc
    $ openstack secret store --name signing-cert --algorithm RSA --secret-type certificate --payload-content-type "application/octet-stream" --payload-content-encoding base64  --payload "$(base64 x509_signing_cert.crt)" -c 'Secret href' -f value
    https://192.168.123.170:9311/v1/secrets/5df14c2b-f221-4a02-948e-48a61edd3f5b
    注意

    记录生成的 UUID 以供稍后的步骤使用。在本例中,证书的 UUID 是 5df14c2b-f221-4a02-948e-48a61edd3f5b

  6. 使用 private_key.pem 为镜像签名并生成 .signature 文件。例如:

    $ openssl dgst -sha256 -sign private_key.pem -sigopt rsa_padding_mode:pss -out cirros-0.4.0.signature cirros-0.4.0-x86_64-disk.img
  7. 将生成的 .signature 文件转换为 base64 格式:

    $ base64 -w 0 cirros-0.4.0.signature  > cirros-0.4.0.signature.b64
  8. base64 值加载到变量中,以便在后续命令中使用它:

    $ cirros_signature_b64=$(cat cirros-0.4.0.signature.b64)
  9. 将签名的镜像上传到 glance。对于 img_signature_certificate_uuid,您必须指定您之前上传到 barbican 的签名密钥的 UUID:

     openstack image create \
    --container-format bare --disk-format qcow2 \
    --property img_signature="$cirros_signature_b64" \
    --property img_signature_certificate_uuid="5df14c2b-f221-4a02-948e-48a61edd3f5b"\
    --property img_signature_hash_method="SHA-256" \
    --property img_signature_key_type="RSA-PSS" cirros_0_4_0_signed \
    --file cirros-0.4.0-x86_64-disk.img
    +--------------------------------+----------------------------------------------------------------------------------+
    | Property                       | Value                                                                            |
    +--------------------------------+----------------------------------------------------------------------------------+
    | checksum                       | None                                                                             |
    | container_format               | bare                                                                             |
    | created_at                     | 2018-01-23T05:37:31Z                                                             |
    | disk_format                    | qcow2                                                                            |
    | id                             | d3396fa0-2ea2-4832-8a77-d36fa3f2ab27                                             |
    | img_signature                  | lcI7nGgoKxnCyOcsJ4abbEZEpzXByFPIgiPeiT+Otjz0yvW00KNN3fI0AA6tn9EXrp7fb2xBDE4UaO3v |
    |                                | IFquV/s3mU4LcCiGdBAl3pGsMlmZZIQFVNcUPOaayS1kQYKY7kxYmU9iq/AZYyPw37KQI52smC/zoO54 |
    |                                | zZ+JpnfwIsM=                                                                     |
    | img_signature_certificate_uuid | ba3641c2-6a3d-445a-8543-851a68110eab                                             |
    | img_signature_hash_method      | SHA-256                                                                          |
    | img_signature_key_type         | RSA-PSS                                                                          |
    | min_disk                       | 0                                                                                |
    | min_ram                        | 0                                                                                |
    | name                           | cirros_0_4_0_signed                                                              |
    | owner                          | 9f812310df904e6ea01e1bacb84c9f1a                                                 |
    | protected                      | False                                                                            |
    | size                           | None                                                                             |
    | status                         | queued                                                                           |
    | tags                           | []                                                                               |
    | updated_at                     | 2018-01-23T05:37:31Z                                                             |
    | virtual_size                   | None                                                                             |
    | visibility                     | shared                                                                           |
    +--------------------------------+----------------------------------------------------------------------------------+
  10. 您可以在 Compute 日志中查看 glance 的镜像验证活动: /var/log/containers/nova/nova-compute.log。例如,当实例引导时,您可以预期以下条目:

    2018-05-24 12:48:35.256 1 INFO nova.image.glance [req-7c271904-4975-4771-9d26-cbea6c0ade31 b464b2fd2a2140e9a88bbdacf67bdd8c a3db2f2beaee454182c95b646fa7331f - default default] Image signature verification succeeded for image d3396fa0-2ea2-4832-8a77-d36fa3f2ab27

4.5. 验证快照

快照保存为镜像服务(glance)镜像。如果您将计算服务(nova)配置为检查签名的镜像,则必须签名快照,即使它们是从带有签名镜像的实例创建的。

流程

  1. 从 glance 下载快照

    openstack image save --file <local-file-name> <image-name>
  2. 生成进行签名以验证快照。这是您生成签名以验证任何镜像时所用的进程。如需更多信息,请参阅验证 镜像服务(glance)镜像
  3. 更新镜像属性:

      openstack image set \
        --property img_signature="$cirros_signature_b64" \
        --property img_signature_certificate_uuid="5df14c2b-f221-4a02-948e-48a61edd3f5b" \
        --property img_signature_hash_method="SHA-256" \
        --property img_signature_key_type="RSA-PSS" \
        <image_id_of_the_snapshot>
  4. 可选:从文件系统中删除下载的 glance 镜像:

    rm <local-file-name>

法律通告

Copyright © 2018 Red Hat, Inc.
本文档内容及图解由红帽根据 Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA")授权。关于 CC-BY-SA 的说明,请参考 http://creativecommons.org/licenses/by-sa/3.0/。根据 CC-BY-SA,如果发布本文档或提供此文档,则必须提供原始版本的 URL。
作为本文档的许可者,红帽可能会放弃强制制执行 CC-BY-SA 第4d 条款,且不声明该条款在适用条款允许的最大限度内有效。
部分适应 Barbican 的开发人员文档。请参阅 Red Hat OpenStack Platform Licenses 中的"使用 OpenStack Key Manager 管理 Secret"。
Red Hat, Red Hat Enterprise Linux, SVVP logo, JBoss, SVVP, Fedora, Infinity 商标,Red Hat, Inc. 是 Red Hat, Inc. 在美国和其他国家的注册商标。
Linux® 是 Linus Torvalds 在美国和其它国家的注册商标。
Java® 是 Oracle 和/或其关系的注册商标。
XFS® 是 Silicon Graphics International Corp. 或其子公司在美国和/或其他国家的商标。
MySQL® 是 MySQL AB 在美国、美国和其他国家的注册商标。
Node.js® 是 Joyent 的官方商标。Red Hat Software Collections 与官方 Joyent Node.js 开源或商业项目没有正式关联或被正式认可。
OpenStack® Word Mark 和 OpenStack 徽标是 OpenStack Foundation 在美国及其他国家的注册商标/服务标记或商标/服务标记,可根据 OpenStack Foundation 授权使用。我们不附属于 OpenStack Foundation 或 OpenStack 社区。
所有其他商标均由其各自所有者所有。