提供暂停镜像的功能

https://blueprints.launchpad.net/glance/+spec/deactivate-image

此蓝图提供了一种临时暂停镜像的方法,以防止下载镜像数据(包括从镜像启动新实例)。还描述了一种重新激活的方法。

问题描述

随着用户从云外部导入镜像的能力变得越来越普遍,一个担忧是用户可能导入恶意或有问题的镜像(例如,包含特洛伊木马的镜像)。如果某个镜像被认为可疑,管理员应该能够将该镜像“置于暂停状态”,阻止使用它构建实例,直到它被正确检查并确定为安全,或者被发现危险并删除。所有镜像属性将仍然可访问和可编辑,但非管理员用户将无法下载该镜像。

提议的变更

为了暴露此功能,将引入一个新的镜像状态“deactivated”(已暂停)。为了进入和退出此状态,将在 REST 接口中添加两个新的功能 API 调用(如下详述)。

当镜像被置于已暂停状态时,非管理员用户将无法下载镜像数据。这将包括所有其他可能需要访问镜像数据操作(例如导出和克隆)。管理员可以继续下载数据,以方便测试和检查镜像。不访问镜像数据的操作(例如更新、删除或镜像列表)对已暂停的镜像将继续像往常一样运行。

只有“active”(活动)镜像可以被暂停。处于“deactivated”(已暂停)状态的镜像只能过渡到“active”(活动)或“deleted”(已删除)状态。暂停一个“deactivated”(已暂停)镜像或重新激活一个“active”(活动)镜像将成功执行,但不会产生任何影响。

可以通过当前策略机制来处理对暂停和重新激活功能的限制,因此责任在于部署者根据其特定需求实施/更新适用的策略。默认情况下,只有管理员具有足够的权限来暂停和重新激活镜像。

备选方案

似乎没有可用的替代方案。曾考虑过策略更改,但这是一个需要对每个镜像执行的操作,无论角色如何(管理员除外),以及跨帐户(在共享镜像的情况下)。

数据模型影响

REST API 影响

下面指定暂停和重新激活调用的设计遵循 Subbu Allamaraju 的《RESTful Web Services Cookbook》(O’Reilly,2010),第 2.6 节中的控制器模式。它在 2015 年 2 月的一系列会议和邮件列表中由 OpenStack API 工作组讨论过。共识是这种设计是一种合适的实用 RESTful 接口。

API WG 讨论了使用 Glance 任务进行暂停/重新激活,但共识是由于 Glance 任务专门设计用于异步操作,因此在这里使用它们是不合适的。建议任何新的异步操作都应在任务 API 中实现,但控制器模式适用于同步操作,例如暂停和重新激活。

API WG 在 2015 年 2 月 19 日的会议上得出结论,该 API 设计提案是可以接受的。

http://eavesdrop.openstack.org/meetings/api_wg/2015/api_wg.2015-02-19-00.00.log.html#l-146

  • POST:/v2/images/{image_id}/actions/deactivate * 描述:暂停镜像 * 方法:POST * 正常响应代码:204 * 预期错误 http 响应代码:403

    • 在对当前不在“active”(活动)或“deactivated”(已暂停)状态的镜像调用 deactivate 时。

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

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

  • POST:/v2/images/{image_id}/actions/reactivate * 描述:重新激活镜像 * 方法:POST * 正常响应代码:204 * 预期错误 http 响应代码:403

    • 在对当前不在“deactivated”(已暂停)或“active”(活动)状态的镜像调用 reactivate 时。

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

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

  • GET:/v2/images/{image_id}/file * 描述:下载二进制镜像数据。 * 方法:GET * 正常响应代码:200, 204 * 预期错误 http 响应代码:403

    • 尝试下载已暂停的镜像时

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

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

  • GET:/v2/images/{image_id} * 描述:检索镜像元数据 * 方法:GET * 正常响应代码:200

    • 检索已暂停镜像的镜像元数据将继续正常运行

    • 预期的错误 http 响应代码:无

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

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

  • GET:/v1/images/{image_id} * 描述:以头部和响应主体中的镜像二进制形式返回镜像详细信息。 * 方法:GET * 正常响应代码:200 * 预期错误 http 响应代码:403

    • 尝试下载已暂停的镜像时

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

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

  • HEAD:/v1/images/{image_id} * 描述:检索镜像元数据 * 方法:HEAD * 正常响应代码:204

    • 检索已暂停镜像的镜像元数据将继续正常运行

    • 预期的错误 http 响应代码:无

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

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

安全影响

此更改通过赋予管理员暂停潜在恶意镜像的使用能力,同时对其进行审计,从而增强了整个系统的安全性。

没有负面的安全影响。

通知影响

其他最终用户影响

应将对新 API 操作的支持添加到 python-glanceclient。

最终用户将无法对已暂停的镜像执行任何需要访问镜像数据的操作。这将包括下载、启动和导出镜像。

性能影响

其他部署者影响

为了限制对这些操作的访问,部署者需要相应地配置“deactivate”(暂停)和“reactivate”(重新激活)策略。

开发人员影响

实现

负责人

主要负责人

eddie-sheffield

其他贡献者

评审人员

核心评审人

nikhil-komawar

其他审核员

hemanth-makkapati

工作项

  • 添加允许的状态转换

  • 将镜像操作控制器添加到 v2 api

  • 将“deactivate”(暂停)操作添加到控制器和路由器

  • 将“activate”(激活)操作添加到控制器和路由器

  • 添加“deactivate”(暂停)和“reactivate”(重新激活)的策略检查

  • 在 v2 api 上添加对已暂停镜像下载的检查

  • 在 v1 api 上添加对已暂停镜像下载的检查

依赖项

测试

需要为新操作添加 Tempest 测试,并验证对已暂停镜像的下载限制。

文档影响

需要为以下内容编写文档

  • 新的 API 函数

  • 新的策略(如“其他部署者影响”中所述)

参考资料

此规范的早期版本来自 wiki:* https://wiki.openstack.org/wiki/Glance-deactivate-image

关于此处使用的“Function API”方法的讨论:* https://etherpad.openstack.org/p/glance-adding-functional-operations-to-api * http://lists.openstack.org/pipermail/openstack-dev/2014-May/036416.html * http://osdir.com/ml/openstack-dev/2015-02/msg01563.html * “RESTful Web Services Cookbook, Section 2.6” - http://it-ebooks.info/book/392/