新的位置 API 支持

Image Service API 的 2.17 版本引入了新的 Location API 调用,以缓解安全问题 OSSN-0090OSSN-0065

以下是 glance 在 2023.2 周期中引入的 2 个新的位置 API,

添加位置

引入添加位置 API 以将位置添加到镜像。

添加位置操作仅允许服务间交互和镜像所有者执行,且仅当镜像处于 queued 状态时才允许。尝试为其他状态的镜像添加位置将被拒绝。这是为了防止恶意用户反复修改镜像位置,因为 Glance 认为第一次添加的位置是正确的。

旧位置 API 对于消费者(nova 和 cinder)的用途是高效地创建镜像,并采用优化的工作流程。此工作流程避免了 glance 通用镜像创建工作流程中存在的哈希计算步骤,从而导致这些镜像缺少校验和和哈希信息。因此,这些镜像从未被缓存,因为需要校验和来验证镜像是否完全缓存。添加此机制来计算镜像的校验和和哈希不仅解决了此问题,还将改善缓存操作,因为只有在整个镜像下载到缓存后,才会比较原始镜像和缓存镜像的校验和。

由于哈希计算及其验证非常耗时,我们提供了一个配置选项来启用/禁用此操作。新的配置选项 do_secure_hash 已被引入来控制此操作。 do_secure_hash 的值默认为 True。可以通过将此标志设置为 False 来禁用此操作。出于类似的原因,哈希计算将在后台执行,以便消费者或客户端无需等待其完成。如果哈希计算失败,我们将有一个重试机制,该机制将根据 glance-api.conf 文件中 http_retries 配置选项定义的值重试该操作。默认值为 3。即使在达到 http_retries 配置选项定义的最大重试次数后,操作仍将被静默忽略。

与旧位置 API 类似,用户(而不是像 Nova 或 Cinder 这样的消费者)也可以使用 validation_data 作为输入来此新的 API,无论是通过 glance 客户端提供,作为命令行参数,还是在直接 API 请求时提供在请求体中。在这种情况下,如果部署中启用了哈希(即,do_secure_hash 为 True),则它将使用 validation_data 验证计算出的哈希值,如果存在差异,则将操作标记为失败。如果禁用哈希(即,do_secure_hash 为 False),则 validation_data 中提供的值将直接设置到镜像。

如果为此 API 禁用哈希,那么我们将拥有一个活动的镜像,但它仍然无法缓存,因此 Glance 建议像 Nova 和 Cinder 这样的消费者以及普通用户应保持 do_secure_hash 启用状态。

注意

仅当部署中启用了 http 存储时,才允许最终用户使用此 API。

注意

http 存储的情况下,如果将错误的值传递给 validation data 中的 os_hash_value,镜像将保持在 queued 状态,因为 validation_data 的验证失败,这是预期的,但它会存储镜像的位置,而该位置应该被弹出。由于不允许删除 http 存储的位置,因此位置不会被删除。在这种情况下,需要删除镜像,因为它没有用处。

获取位置

获取位置 API 将返回与镜像关联的位置列表。

引入获取位置 API 以获取与镜像关联的位置,从而将位置信息抽象化给最终用户,以便他们无法看到镜像确切的存储位置。

获取位置操作仅允许服务间交互,这意味着只有像 nova、cinder 等消费者才能访问此 API。