密钥管理器支持的卷加密

我们推荐使用密钥管理服务 (barbican) 来存储 OpenStack 卷加密功能使用的加密密钥。可以通过更新 cinder.confnova.conf 来启用它。

初始配置

需要对运行 cinder-apinova-compute 服务器的任何节点进行配置更改。

更新 cinder-api 服务器的步骤

  1. 编辑 /etc/cinder/cinder.conf 文件以使用密钥管理服务,如下所示

    • 查找 [key_manager] 部分。

    • [key_manager] 部分下方新起一行,并添加以下内容

      backend = barbican
      
  2. 重启 cinder-apicinder-volumecinder-backup

更新 nova-compute 服务器

  1. 安装 python-barbicanclient Python 包。

  2. 通过编辑 /etc/nova/nova.conf 来设置密钥管理器服务

    [key_manager]
    backend = barbican
    

    注意

    使用 ‘#’ 前缀注释掉该部分以 ‘fixed_key’ 开头的行。

  3. 重启 nova-compute

密钥管理访问控制

可以代表最终用户分配特殊权限,以允许他们管理自己的加密密钥,这在创建加密卷时是必需的。Barbican 默认策略 对于访问控制规定,只有具有 admincreator 角色的用户才能创建密钥。该策略非常灵活,可以进行修改。

要分配 creator 角色,管理员必须知道用户 ID、项目 ID 和 creator 角色 ID。有关更多信息,请参阅 分配角色。管理员可以使用 openstack role list 命令列出现有角色及其关联的 ID。如果 creator 角色不存在,管理员可以 创建角色

创建一个加密卷类型

块存储卷类型分配提供到特定后端的分发,并且可用于指定存储设备的 actionable 信息。

此示例创建一个名为 LUKS 的卷类型,并为存储系统提供配置信息以加密或解密卷。

  1. 激活您的管理员凭据

    $ . admin-openrc.sh
    
  2. 创建卷类型,将卷类型标记为加密并提供必要的详细信息。使用 --encryption-control-location 指定加密的执行位置:front-end (默认) 或 back-end

    $ openstack volume type create --encryption-provider luks \
      --encryption-cipher aes-xts-plain64 --encryption-key-size 256 --encryption-control-location front-end LUKS
    
      +-------------+----------------------------------------------------------------+
      | Field       | Value                                                          |
      +-------------+----------------------------------------------------------------+
      | description | None                                                           |
      | encryption  | cipher='aes-xts-plain64', control_location='front-end',        |
      |             | encryption_id='8584c43f-1666-43d1-a348-45cfcef72898',          |
      |             | key_size='256',                                                |
      |             | provider='luks'                                                |
      | id          | b9a8cff5-2f60-40d1-8562-d33f3bf18312                           |
      | is_public   | True                                                           |
      | name        | LUKS                                                           |
      +-------------+----------------------------------------------------------------+
    

从 Kilo 版本开始,OpenStack 仪表板 (horizon) 支持创建加密卷类型。有关说明,请参阅 创建加密卷类型

创建一个加密卷

使用 OpenStack 仪表板 (horizon) 或 openstack volume create 命令创建卷,就像您通常一样。对于加密卷,传递 --type LUKS 标志,该标志指定卷类型将为 LUKS (Linux Unified Key Setup)。如果省略该参数,则使用默认卷类型 unencrypted

  1. 激活您的管理员凭据

    $ . admin-openrc.sh
    
  2. 创建一个未加密的 1GB 测试卷

    $ openstack volume create --size 1 'unencrypted volume'
    
  3. 创建一个加密的 1GB 测试卷

    $ openstack volume create --size 1 --type LUKS 'encrypted volume'
    

请注意加密参数;它将显示 TrueFalse。选项 volume_type 也显示,以便于查看。

非管理员用户需要 creator 角色才能在 Barbican 中存储密钥并创建加密卷。作为管理员,您可以以以下方式向用户授予 creator 角色

$ openstack role add --project PROJECT --user USER creator

有关详细信息,请参阅 Barbican 访问控制页面

测试卷加密

这是一个简单的测试场景,可帮助验证您的加密。它假定基于 LVM 的块存储服务器。

在完成卷加密设置并创建 LUKS 卷类型后,请执行以下步骤,如前几节所述。

  1. 创建 VM

    $ openstack server create --image cirros-0.3.1-x86_64-disk --flavor m1.tiny TESTVM
    
  2. 创建两个卷,一个加密,一个未加密,然后将它们附加到您的 VM

    $ openstack volume create --size 1 'unencrypted volume'
    $ openstack volume create --size 1 --type LUKS 'encrypted volume'
    $ openstack volume list
    $ openstack server add volume --device /dev/vdb TESTVM 'unencrypted volume'
    $ openstack server add volume --device /dev/vdc TESTVM 'encrypted volume'
    

    注意

    --device 选项指定附加卷的挂载点可能不是来宾 VM 中实际附加块设备的位置,此处仅用于说明目的。

  3. 在 VM 上,将一些文本发送到新附加的卷并同步它们

    # echo "Hello, world (unencrypted /dev/vdb)" >> /dev/vdb
    # echo "Hello, world (encrypted /dev/vdc)" >> /dev/vdc
    # sync && sleep 2
    # sync && sleep 2
    
  4. 在托管 cinder 卷服务的系统上,同步以刷新 I/O 缓存,然后测试是否可以找到您的字符串

    # sync && sleep 2
    # sync && sleep 2
    # strings /dev/stack-volumes/volume-* | grep "Hello"
    Hello, world (unencrypted /dev/vdb)
    

在上面的示例中,您可以看到搜索返回写入未加密卷的字符串,但未返回加密卷的字符串。

已知问题

将未加密的卷重新类型化为相同大小的加密卷很可能会失败。即使卷与源卷的大小相同,加密卷也需要存储额外的加密信息开销。这导致新卷无法容纳所有数据。