Manila共享加密¶
蓝图:https://blueprints.launchpad.net/manila/+spec/share-encryption
加密OpenStack Manila共享对于确保用户数据的安全性和机密性至关重要。 总体上存在两种级别的加密:“前端”(传输中的数据)和“后端”(静态数据)。 目前,用户可以通过具有自定义额外规格的共享类型来请求后端数据加密。 这些自定义额外规格指示后端驱动程序对静态数据进行加密,但是,用户无法控制加密过程的更多内容。 理想情况下,用户必须能够创建和管理自己的加密密钥。 本规范提出了一种方法,使Manila能够协调用户定义的加密密钥,以对共享数据进行“后端”(静态)加密。
问题描述¶
虽然Manila用户可以使用一些存储后端创建加密共享,但他们无法通过OpenStack Manila创建或控制其加密密钥。 加密密钥由存储后端或Manila驱动程序生成,如果任何人访问了密钥,并且访问了后端存储,他们就可以访问数据。 因此,本规范要解决的是用户对加密密钥的控制。
以下是一些您应该考虑加密Manila共享的原因
数据机密性: 加密通过将数据转换为不可读的密文来保护数据的机密性。 如果未经授权的用户获得对存储的访问权限,他们将无法在没有适当解密密钥的情况下理解加密数据。
合规性要求: 许多行业和监管标准要求对敏感数据进行加密。 加密OpenStack Manila共享有助于您遵守数据保护法规和行业标准,确保您的组织满足法律要求。
防止未经授权的访问: 加密共享增加了防止未经授权访问的额外安全层。 即使有人获得了对底层存储的访问权限,他们也无法在没有加密密钥的情况下访问数据。
缓解内部威胁: 加密有助于缓解内部威胁的风险。 即使是具有存储访问权限的授权用户试图滥用数据,加密也可以防止他们在没有适当解密密钥的情况下读取或篡改敏感信息。
防止数据泄露: 如果发生安全漏洞或数据泄露,加密数据对于攻击者来说更难利用。 这可以显着降低数据泄露的影响,因为被盗的信息在没有加密密钥的情况下仍然无法读取。
风险管理: 加密是全面风险管理策略的基本组成部分。 通过为Manila共享实施加密,您可以增强整体安全态势并降低安全事件的潜在影响。
用例¶
用户希望保护共享中的数据。 本规范的共享加密提供了Manila级别的支持,以触发后端的数据加密,从而保护数据免受攻击者攻击。
用户可以向Manila提供对加密密钥的引用。 存储驱动程序可以将此加密密钥应用于他们创建的共享服务器,或单独应用于特定的共享。 这些密钥通过OpenStack密钥管理服务Barbican存储。 加密密钥引用将在共享创建请求中提供。 在Manila验证密钥引用后,它将连同有关如何访问密钥管理器的信息一起提供给存储后端驱动程序。 密钥数据将用于加密存储后端中的共享数据。
静态数据的实际加密由后端存储系统执行。 Manila的参与范围仅限于与密钥存储协调用户的密钥。
提议的变更¶
修改共享创建API
为了支持“自带密钥”用例,Manila共享创建API将接受可选参数,即
encryption-key-ref。共享类型额外规格更改
将在共享类型上引入一个租户可见的额外规格,名为“encryption_support”。 它可以具有字符串值。 值可以是“share-server”或“share”。 如果设置为“share”,则表示用户期望密钥应用于每个共享。 值“share_server”表示用户期望密钥应用于共享服务器级别。 默认值为None。
Manila API和共享服务更改
Manila api服务将允许配置密钥管理器。 我们将引入一个接口,用于Manila API服务与外部密钥管理器接口(OpenStack Castellan)通信,后者内部与密钥存储(Openstack Barbican)一起工作。 密钥管理器将通过配置文件进行配置。 当提供加密密钥引用并且共享类型将“encryption_support”设置为“share”或“share_server”时,Manila将使用Barbican验证加密密钥引用,并将加密密钥引用存储在共享实例中,以及支持的加密类型。 加密密钥引用将是有效的Barbican secret_ref。 存储后端设备需要通过其他方式获取密钥,以便执行加密。 Manila将整理必要的信息,允许存储后端识别并从密钥管理器检索密钥。 Manila将作为一项服务与Barbican交互。 它将使用服务凭证代表OpenStack用户从Barbican检索密钥。 后端存储设备还需要OpenStack凭证才能与Barbican一起工作。 我们将改进Manila的共享管理器服务,以创建OpenStack身份服务(Keystone)应用程序凭证,以促进此交互,并将这些凭证传递给存储后端驱动程序。 应用程序凭证将被限制,因此仅允许获取密钥管理器的密钥以供服务用户使用。 即使它们属于同一租户,凭证也无法列出密钥或检索无关密钥。 为了限制使用不同加密密钥引用的共享服务器创建,将引入一个新的项目级别配额,称为“server_encryption_keys”。 API服务将在共享类型额外规格为“share-server”的情况下检查配额限制。 一旦达到配额限制,API将抛出错误。
Manila调度器中的更改
CapabilitiesFilter将被更新为考虑共享后端驱动程序的功能encryption_support。
后端驱动程序中的更改
后端驱动程序将报告encryption_support作为一种功能。 它可以具有以下任何值:[“share”]、[“share_server”]、[“share”、“share_server”]或None。 当共享创建请求到达时,如果DHSS=True,将要求驱动程序提供兼容的共享服务器,并且调用将包括共享的encryption-key-ref以及所有其他网络详细信息。 如果存在具有适当密钥引用并满足网络参数的共享服务器,则驱动程序可以呈现该服务器。 如果不存在兼容的共享服务器,则驱动程序返回[],共享管理器将要求驱动程序创建新的服务器。 密钥引用将存储在共享服务器的db模型中。 加密密钥引用以及应用程序凭证将提供给后端硬件以执行加密。 后端存储系统将直接使用Manila通过后端驱动程序共享的引用获取密钥,而无需通过Manila。 获取的密钥数据将用于加密共享数据。
备选方案¶
如果OpenStack Manila没有提供一种方法让用户管理自己的加密密钥,则云可能需要一种外部解决方案,例如
外部或第三方密钥管理服务,支持与OpenStack Manila集成。
客户端加密:放弃静态数据加密。 用户必须在将其存储在Manila共享中之前,在客户端本地加密数据。
文件级加密:使用工具或库加密客户端中的单个文件或目录,而不是将共享数据作为整体进行加密。
自定义脚本或工具:部署本地脚本,使用户能够管理OpenStack Manila之外的加密密钥。 这可能涉及创建一个用户界面或命令行工具,与OpenStack Manila和外部密钥管理系统交互。
OpenStack Manila扩展:非官方API扩展,可以增强Manila的功能以处理加密元数据。
总而言之,这些替代方案不如通过实施本规范中的提案所提供的便利性。
数据模型影响¶
share_servers表中的新字段
字段
类型
是否为空
键
默认值
额外信息
encryption_key_ref
string(36)
YES
NULL
app_cred_id
string(36)
YES
NULL
share_instances表中的新字段
字段
类型
是否为空
键
默认值
额外信息
encryption_key_ref
string(36)
YES
NULL
CLI API 影响¶
将openstackclient(OSC)命令中的参数添加为新参数
openstack share create [--encryption-key-ref <key-ref>]
<share_protocol> <size>
encryption-key-ref:有效的Barbican(即密钥管理器)secret ref(UUID)表示共享或共享服务器加密密钥引用
REST API 影响¶
** 使用用户定义的共享加密密钥创建共享。**
POST /v2/shares
请求
{
"share": {
"description": "My custom share London",
"share_type": null,
"share_proto": "nfs",
"share_network_id": "713df749-aac0-4a54-af52-10f6c991e80c",
"share_group_id": null,
"name": "share_London",
"snapshot_id": null,
"is_public": true,
"size": 1,
"metadata": {
},
"scheduler_hints": {
},
"encryption_key_ref": "b7460a86-30ea-4c20-901f-6cee1e945286",
}
}
如果encryption_key_ref是有效的Barbican secret href或UUID,否则API将响应400 Not Found
响应(202 Accepted)
{
"share": {
"id": "011d21e2-fbc3-4e4a-9993-9ea223f73264",
"size": 1,
"description": "My custom share London",
"status": "creating",
"progress": null,
"share_server_id": null,
"project_id": "16e1ab15c35a457e9c2b2aa189f544e1",
"name": "share_London",
"share_type": "25747776-08e5-494f-ab40-a64b9d20d8f7",
"share_type_name": "default",
"availability_zone": null,
"created_at": "2025-02-18T10:25:24.533287",
"export_location": null,
"links": [
{
"href": "http://172.18.198.54:8786/v1/16e1ab15c35a457e9c2b2aa189f544e1/shares/011d21e2-fbc3-4e4a-9993-9ea223f73264",
"rel": "self"
},
],
"share_network_id": "713df749-aac0-4a54-af52-10f6c991e80c",
"share_group_id": null,
"export_locations": [],
"share_proto": "NFS",
"host": null,
"access_rules_status": "active",
"has_replicas": false,
"replication_type": null,
"task_state": null,
"snapshot_support": true,
"volume_type": "default",
"snapshot_id": null,
"is_public": true,
"metadata": {
},
"encryption_key_ref": "b7460a86-30ea-4c20-901f-6cee1e945286"
}
}
驱动程序影响¶
后端驱动程序需要实现
驱动程序需要将“encryption_support”报告为一种功能。 如果支持加密,则此功能的值可以报告为有效密钥列表,包括“share”和“share_server”。
根据请求的参数,向Manila-share Manager返回有效的共享服务器列表。 今天支持这一点,但是需要更新功能以考虑其他要求,即加密密钥引用。 当Manila的共享管理器提供加密密钥引用时,必须小心地专门排除不匹配该密钥的共享服务器。
指示后端存储系统使用从密钥存储(例如Barbican)发送的密钥数据加密共享
安全影响¶
加密后,共享将更加安全,数据将受到攻击者的保护。
通知影响¶
无
其他最终用户影响¶
用户需要使用Barbican密钥管理器存储加密密钥/有效负载并获取加密密钥引用。
性能影响¶
共享可以在前端或后端加密。 但是对于Manila,我们打算仅支持后端加密,因此Manila服务中的性能损失非常小。
其他部署者影响¶
无。
开发人员影响¶
实现¶
负责人¶
- 主要负责人
kpdev(kinpaa@gmail.com)
工作项¶
在共享创建API中实现“自带密钥”。
更新python-manilaclient中的“openstack share create”命令。
实现tempest支持。
记录有关使用加密创建共享的信息
未来工作项目¶
无
依赖项¶
无
测试¶
单元测试
Tempest 测试
文档影响¶
文档字符串
Devref
用户指南
管理员指南
发布说明
参考资料¶
无