密钥管理器支持的卷加密¶
我们推荐使用密钥管理服务 (barbican) 来存储 OpenStack 卷加密功能使用的加密密钥。可以通过更新 cinder.conf 和 nova.conf 来启用它。
初始配置¶
需要对运行 cinder-api 或 nova-compute 服务器的任何节点进行配置更改。
更新 cinder-api 服务器的步骤
编辑
/etc/cinder/cinder.conf文件以使用密钥管理服务,如下所示查找
[key_manager]部分。在
[key_manager]部分下方新起一行,并添加以下内容backend = barbican
重启
cinder-api、cinder-volume和cinder-backup。
更新 nova-compute 服务器
安装
python-barbicanclientPython 包。通过编辑
/etc/nova/nova.conf来设置密钥管理器服务[key_manager] backend = barbican
注意
使用 ‘#’ 前缀注释掉该部分以 ‘fixed_key’ 开头的行。
重启
nova-compute。
密钥管理访问控制¶
可以代表最终用户分配特殊权限,以允许他们管理自己的加密密钥,这在创建加密卷时是必需的。Barbican 默认策略 对于访问控制规定,只有具有 admin 或 creator 角色的用户才能创建密钥。该策略非常灵活,可以进行修改。
要分配 creator 角色,管理员必须知道用户 ID、项目 ID 和 creator 角色 ID。有关更多信息,请参阅 分配角色。管理员可以使用 openstack role list 命令列出现有角色及其关联的 ID。如果 creator 角色不存在,管理员可以 创建角色。
创建一个加密卷类型¶
块存储卷类型分配提供到特定后端的分发,并且可用于指定存储设备的 actionable 信息。
此示例创建一个名为 LUKS 的卷类型,并为存储系统提供配置信息以加密或解密卷。
激活您的管理员凭据
$ . admin-openrc.sh
创建卷类型,将卷类型标记为加密并提供必要的详细信息。使用
--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。
激活您的管理员凭据
$ . admin-openrc.sh
创建一个未加密的 1GB 测试卷
$ openstack volume create --size 1 'unencrypted volume'
创建一个加密的 1GB 测试卷
$ openstack volume create --size 1 --type LUKS 'encrypted volume'
请注意加密参数;它将显示 True 或 False。选项 volume_type 也显示,以便于查看。
非管理员用户需要 creator 角色才能在 Barbican 中存储密钥并创建加密卷。作为管理员,您可以以以下方式向用户授予 creator 角色
$ openstack role add --project PROJECT --user USER creator
有关详细信息,请参阅 Barbican 访问控制页面。
测试卷加密¶
这是一个简单的测试场景,可帮助验证您的加密。它假定基于 LVM 的块存储服务器。
在完成卷加密设置并创建 LUKS 卷类型后,请执行以下步骤,如前几节所述。
创建 VM
$ openstack server create --image cirros-0.3.1-x86_64-disk --flavor m1.tiny TESTVM
创建两个卷,一个加密,一个未加密,然后将它们附加到您的 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 中实际附加块设备的位置,此处仅用于说明目的。在 VM 上,将一些文本发送到新附加的卷并同步它们
# echo "Hello, world (unencrypted /dev/vdb)" >> /dev/vdb # echo "Hello, world (encrypted /dev/vdc)" >> /dev/vdc # sync && sleep 2 # sync && sleep 2
在托管 cinder 卷服务的系统上,同步以刷新 I/O 缓存,然后测试是否可以找到您的字符串
# sync && sleep 2 # sync && sleep 2 # strings /dev/stack-volumes/volume-* | grep "Hello" Hello, world (unencrypted /dev/vdb)
在上面的示例中,您可以看到搜索返回写入未加密卷的字符串,但未返回加密卷的字符串。
已知问题¶
将未加密的卷重新类型化为相同大小的加密卷很可能会失败。即使卷与源卷的大小相同,加密卷也需要存储额外的加密信息开销。这导致新卷无法容纳所有数据。