为 Glance 实现信任

https://blueprints.launchpad.net/glance/+spec/trust-authentication

此变更提案引入了一种方式,让 Glance 使用 Keystone 信任授权。

问题描述

Keystone 令牌具有有限的生命周期。在用户令牌过期后,Glance 发起的任何需要有效用户令牌的请求都将失败。这会导致原始用户的请求也失败,即使令牌在传递给 Glance 时最初是有效的。

本规范旨在解决图像上传过程中令牌过期导致向注册表更改图像状态为“active”的调用失败的特定情况。

  1. 用户请求图像上传。

  2. Keystone 中间件接受请求并将其传递给 Glance。

  3. Glance 将所有必需的数据传递给 glance_store。

  4. glance_store 上传图像,但这需要很长时间(超过令牌过期时间)。

  5. Glance 向注册表发送请求以更改图像状态。

  6. Keystone 中间件拒绝该请求,因为用户令牌已过期。

因此,图像永远不会过渡到“active”状态,因此无法使用。

增加令牌过期时间似乎不是一个好的长期解决方案。

注意

glance_store 中信任的实现不在此规范的范围内。当前的规范与 Glance 相关,它定义了 Glance 与 Glance 注册表通信的信任实现。

注意

Nova 快照也存在令牌过期问题。Nova 首先创建一个排队中的图像,然后再将实例状态保存到本地磁盘。然后上传图像字节。令牌可能在将实例状态保存到磁盘时过期。本规范不会解决这种情况。

提议的变更

该提案更改了 Glance 在启用注册表服务器的情况下,在 Glance v2 api 中上传图像时的 Glance 行为,即当 data_api = glance.db.registry.api 时。

步骤 1. Glance 接收图像上传请求。

步骤 2. 在上传开始之前,Glance 尝试使用以下参数创建一个信任:

  • token:用户令牌

  • project:用户项目

  • roles:所有用户角色

  • trustee_user:在 CONF.keystone_authtoken 配置组中指定的系统用户

  • trustor_user:发起请求的用户。

Glance 在请求处理完成之前保留 trust_id。如果由于某种原因无法创建信任,则 Glance 将使用用户令牌进行后续步骤。

步骤 3. Glance 发起并完成图像上传(此部分由 glance_store 执行)。

在开始步骤 4 之前,Glance 已将图像上传到存储,并且需要更新数据库中的图像记录。如果 data_api 是 Glance 注册表,则这需要用户令牌对于 V2 API 仍然有效。

步骤 4. 如果需要身份验证(请参见上面的文本),则 Glance 使用 trust_id(请参见步骤 2)请求新的令牌。Glance 使用新的令牌更新请求上下文。

步骤 5. Glance 更新数据库中的图像记录。如果使用注册表,则它会收到新的令牌。

备选方案

至少有一个解决方法可用于整个功能:延长令牌过期时间以允许 Glance 上传图像。此解决方案会影响所有服务,而且看起来不是一个长期的解决方案。

已经有一些讨论关于更新 Keystone 中间件如何解释有效服务令牌和过期用户令牌的组合——但这处于讨论/预设计阶段,并且不能保证实现。因此,我们目前无法基于它来构建我们的解决方案,建议使用信任。将来,这可能会被服务令牌的使用所取代,但需要在当时进行讨论。

之前有一个配置选项,称为“use_user_token”。如果禁用它,glance 会从上下文中提取用户令牌并将其更改为管理员的令牌。不幸的是,该选项被认为是有害的,不适合实际部署,因为它允许使用管理员权限在注册表中执行任何操作。这就是为什么这种行为在 Mitaka 中被弃用的原因。

数据模型影响

无。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

应支持 Keystone V3 以正确使用信任机制。

性能影响

无。

其他部署者影响

要使用信任部署 Glance,应定义以下配置:* trustee 用户授权应在 CONF.keystone_authtoken 组中指定:用户名、密码、auth_uri、ssl 选项。

在 devstack 中,所有参数默认情况下都已定义。

开发人员影响

无。

实现

负责人

主要负责人

mfedosin

其他贡献者

kkushaev

评审人员

flaper87 stuart-mclaren

工作项

  • 向 Glance 添加信任授权模块。

  • 为 V2 API 实现 Glance 与 Glance 注册表之间的信任授权。

依赖项

  • 要使用信任,Glance 需要支持 Keystone V3。如果不支持 V3,Glance 将使用旧的用户令牌完成上传操作。

测试

应实现单元测试和功能测试。

在 devstack 上进行手动测试

  1. 准备:将“file”设置为 glance-api 的“default_store”,将 keystone.conf 中的“expiration”选项设置为“40”(秒),将 glance-registry.conf 中的“token_cache_time”设置为“-1”以禁用它,将 glance-api.conf 中的“data_api”设置为“registry”。

  2. 尝试使用 v2 API 上传大图像(上传时间至少为 1 分钟)。确保上传失败并出现 Unauthorized 错误。

  3. 应用信任补丁。

  4. 再次尝试上传图像。确保上传已成功完成。

文档影响

参考资料