提供暂停镜像的功能¶
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/