搜索

4.2. 加密块存储(cinder)卷

download PDF

您可以使用 barbican 管理块存储(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 后端。

    注意

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

  4. 获取 barbican secret UUID。这个值显示在 encryption_key_id 字段中。

    $ cinder --os-volume-api-version 3.64 volume show Encrypted-Test-Volume
    +------------------------------+-------------------------------------+
    |Property                      |Value                                |
    +------------------------------+-------------------------------------+
    |attached_servers              |[]                                   |
    |attachment_ids                |[]                                   |
    |availability_zone             |nova                                 |
    |bootable                      |false                                |
    |cluster_name                  |None                                 |
    |consistencygroup_id           |None                                 |
    |created_at                    |2022-07-28T17:35:26.000000           |
    |description                   |None                                 |
    |encrypted                     |True                                 |
    |encryption_key_id             |0944b8a8-de09-4413-b2ed-38f6c4591dd4 |
    |group_id                      |None                                 |
    |id                            |a0b51b97-0392-460a-abfa-093022a120f3 |
    |metadata                      |                                     |
    |migration_status              |None                                 |
    |multiattach                   |False                                |
    |name                          |vol                                  |
    |os-vol-host-attr:host         |hostgroup@tripleo_iscsi#tripleo_iscsi|
    |os-vol-mig-status-attr:migstat|None                                 |
    |os-vol-mig-status-attr:name_id|None                                 |
    |os-vol-tenant-attr:tenant_id  |a2071ece39b3440aa82395ff7707996f     |
    |provider_id                   |None                                 |
    |replication_status            |None                                 |
    |service_uuid                  |471f0805-072e-4256-b447-c7dd10ceb807 |
    |shared_targets                |False                                |
    |size                          |1                                    |
    |snapshot_id                   |None                                 |
    |source_volid                  |None                                 |
    |status                        |available                            |
    |updated_at                    |2022-07-28T17:35:26.000000           |
    |user_id                       |ba311b5c2b8e438c951d1137333669d4     |
    |volume_type                   |LUKS                                 |
    |volume_type_id                |cc188ace-f73d-4af5-bf5a-d70ccc5a401c |
    +------------------------------+-------------------------------------+
    注意

    您必须使用 --os-volume-api-version 3.64 参数和 Cinder CLI 来显示 encryption_key_id 值。没有对应的 OpenStack CLI 命令。

  5. 使用 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/0944b8a8-de09-4413-b2ed-38f6c4591dd4 | None | 2018-01-22T02:23:15+00:00 | ACTIVE | {u'default': u'application/octet-stream'} | aes       |        256 | symmetric   | None | None       |
    +------------------------------------------------------------------------------------+------+---------------------------+--------+-------------------------------------------+-----------+------------+-------------+------+------------+
  6. 将新卷附加到现有实例。例如:

    $ openstack server add volume testInstance Encrypted-Test-Volume

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

4.2.1. 将块存储卷迁移到 OpenStack Key Manager

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

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

前提条件

在迁移前,请查看 Barbican-managed 加密卷和使用 ConfKeyManager 的卷之间的以下区别:

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

流程

  1. 部署 barbican 服务。
  2. creator 角色添加到 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 以外的另一个密钥管理器后端时,这个安全检查是处理代码的安全检查。这是因为代码只支持一个迁移场景: ConfKeyManager barbican。
    • 不迁移加密密钥,因为没有与此主机关联的卷。 - 当 cinder-volume 在多个主机上运行,而特定主机没有与之关联的卷时会出现这种情况。这是因为每个主机都需要负责处理自己的卷。
    • 开始迁移 ConfKeyManager 键。
    • 将卷 <UUID> 加密密钥迁移到 Barbican - 迁移期间,将检查所有主机的卷;如果卷仍在使用 ConfKeyManager 的密钥 ID (它只包括零 (00000000-0000-0000-0000-000000000000),则会出现这个消息。

      • 对于 cinder-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 存储在备份本身上,但它不会出现在 Backup 数据库中。因此,迁移过程无法了解某些加密卷的备份是否仍然存在,仍依赖于所有零 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

故障排除

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

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

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

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

因此,在迁移时下一次尝试应该会成功。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.