基于自定义属性限制用户下载镜像

https://blueprints.launchpad.net/glance/+spec/restrict-downloading-images-protected-properties

此蓝图的目标是使用 download_image 策略,根据核心或自定义属性来限制普通用户下载镜像。

问题描述

目前,与用户共享的公开镜像可以被自由下载,这可能导致盗版。今天,你可以通过配置带有角色约束的 download_image 策略来阻止用户下载镜像,但它会限制具有该特定角色的所有用户下载所有镜像,这不太好。因此,我希望能够根据镜像中存在的特定核心或自定义属性以及具有某些特定角色的用户来限制用户下载镜像。

提议的变更

我们可以通过在 policy.json 中添加新规则并将其应用于 ‘download_image’ 策略来实现这一点。

例如:在 policy.json 中添加如下所示的新规则

‘restricted’: ‘not (ntt_3251:%(x_billing_code_ntt)s and role:member)’ ‘download_image’: ‘role:admin or rule:restricted’

因此,如果强制执行 ‘download_image’ 策略,则在上述情况下,只有管理员或满足 ‘restricted’ 规则的用户才能下载镜像。其他用户将无法下载镜像,并会收到 403 Forbidden 响应。

为了避免通过点符号实现字典检查,并以相同的方式在 v1 和 v2 api 上强制执行策略,我们可以创建镜像核心和自定义属性的类似字典的组合,在 v1 和 v2 api 中,并将其直接作为目标传递给 _enforce() 方法。如果镜像的核心和自定义属性相同,则核心属性值将覆盖自定义属性。

例如:self._enforce(req, ‘download_image’, target=image_meta_mashup)

备选方案

与其直接将镜像核心和自定义属性的类似字典的组合传递给 target,我们可以传递镜像本身,并可以通过点符号实现字典检查。在这种情况下,policy.json 中的新规则需要配置如下:

‘restricted’: ‘not (ntt_3251:%(target.x_billing_code_ntt)s and role:member)’ ‘download_image’: ‘role:admin or rule:restricted’

数据模型影响

REST API 影响

  • GET:/v2/images/{image_id}/file

    • 描述:下载二进制镜像数据。

    • 方法:GET

    • 正常响应代码:200, 204

    • 预期的 HTTP 错误响应代码:403
      • 当下载具有受保护属性的镜像时,用户不满足 ‘download_image’ 策略

    • 资源的 URL:/v2/images/{image_id}/file

    • 可以通过 URL 传递的参数 {image_id},字符串,镜像的 ID。

  • GET:/v1/images/{image_id}

    • 描述:以头部形式返回镜像详细信息,并在响应主体中返回镜像二进制数据。

      在主体中返回镜像二进制数据。

    • 方法:GET

    • 正常响应代码:200

    • 预期的 HTTP 错误响应代码:403

      • 当下载具有受保护属性的镜像时,用户不满足 ‘download_image’ 策略

    • 资源的 URL:/v1/images/{image_id}

    • 可以通过 URL 传递的参数 {image_id},字符串,镜像的 ID。

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

需要在 policy.json 中添加新规则以限制下载镜像。

“restricted”: “not (ntt_3251:%(x_billing_code_ntt)s and role:member)” “download_image”: “role:admin or rule:restricted”

其中 ntt_3251 将是属性 ‘x_billing_code_ntt’ 的值。

在我们的例子中,有必要确保普通用户不能删除添加到镜像的属性(‘x_billing_code_ntt’)。如果普通用户能够删除镜像的属性,那么他可以很容易地下载镜像,因为规则 ‘restricted’ 将不起作用。

因此,我们需要使用属性保护来限制普通用户删除属性。

需要在 glance-api.conf 文件中修改以下选项以启用属性保护

property_protection_file = property-protections-roles.conf property_protection_rule_format = roles

property-protections-roles.conf 中的更改

[^x_billing_code_.*] create = admin,member read = admin,member,_member_ update = admin,member delete = admin,member

需要确保使用此下载限制功能,show_image_direct_url 和 show_multiple_locations 参数未在 glance-api.conf 文件中设置为 True。如果这些选项为 True,则使用此下载限制可能是一种不一致的策略,因为用户可以使用镜像位置(直接 URL)下载镜像。

为了部署上述策略,服务提供商需要部署 2 套 glance api 服务。一套 glance api 服务将暴露给外部 nova 服务(nova-compute),另一套服务将暴露给用户。暴露给用户的服务应该强制执行带有上述 “restricted” 规则的 download_image 策略,并且用于 nova 的 glance-api 需要隔离/保护,例如通过网络隔离,以避免 glance-client/最终用户通过标准 API 连接它。

开发人员影响

实现

负责人

主要负责人

abhishek-kekane

其他贡献者

工作项

  • 在 policy.json 中添加新规则以限制镜像下载。

  • 添加创建镜像属性类似字典组合的方法

  • 修改 v1 和 v2 api 以限制下载

  • 修改缓存逻辑以限制 v1 和 v2 api 的下载

  • 当 oslo-inc 的更改合并时,同步 oslo-inc 的 openstack.common.policy 与 Glance。

依赖项

测试

需要添加 tempest 测试来覆盖下载操作。

文档影响

请参考其他部署者影响。

参考资料