使用服务令牌进行长时间运行的任务

https://blueprints.launchpad.net/nova/+spec/use-service-tokens-pike

利用 Keystone 的新特性,如果随用户令牌发送了服务令牌,则它将忽略用户令牌的过期时间。这可以防止用户令牌在长时间运行的操作期间过期的问题,例如实时迁移。

问题描述

Nova 中的某些操作可能需要很长时间才能完成。在此期间,与此请求关联的用户令牌可能会过期。当 Nova 尝试使用相同的用户令牌与 Cinder、Glance 或 Neutron 通信时,由于令牌过期,Keystone 将无法验证该请求。请参阅 Bug 1571722

用例

大多数失败案例是在实时迁移过程中观察到的,但并不局限于此

  • 用户启动块实时迁移。根据卷的大小,将此卷移动到新实例可能需要很长时间,并且用户令牌将过期。当 Nova 调用 Cinder 通过传递用户令牌来更新此卷的信息时,由于令牌过期,Keystone 将拒绝该请求。

  • 用户启动实时迁移。有时,libvirt 可能需要一段时间才能根据大小和网络带宽将虚拟机移动到新主机。用户令牌可能会过期,并且任何后续调用 Neutron 以更新端口绑定都将因 Keystone 而失败。

  • 用户在 Nova 中启动快照操作。用户令牌在此操作期间过期。Nova 调用 Glance 以更新最终比特,并且由于用户令牌过期,Keystone 拒绝该请求。

注意:周期性任务和管理员令牌的使用将不在本规范中讨论。这些将在后续规范中进行讨论。

提议的变更

Keystone/auth_token 中间件现在支持,如果提交给它的令牌已过期,并且带有服务角色的“X-Service-Token”,它将验证该令牌并忽略用户令牌的过期时间。Nova 需要使用此功能来避免实时迁移等长时间运行操作中的故障。

Keystone 详细信息可以在这里找到:https://specs.openstack.org/openstack/keystone-specs/specs/keystone/ocata/allow-expired.html

  • 将服务令牌传递给 Cinder。

  • 将服务令牌传递给 Neutron,但仅限于非管理员情况。

  • 将服务令牌传递给 Glance

注意:延迟将服务令牌传递给其他服务,直到需要时为止。

OpenStack 服务仅通过公共 REST API 与彼此通信。在进行服务到服务的请求时,Keystone auth_token 中间件提供了一种使用服务令牌包装器将用户令牌和服务令牌都添加到请求中的方法。

服务令牌用于服务到服务通信的添加是可配置的。将有一个名为“service_user”的新配置组,该组使用 keystoneauth1 中的 register_auth_conf_options 注册。

一个配置选项 send_service_user_token,默认值为 False,可用于使用服务令牌验证服务间通信的请求。

服务到服务通信现在将包含一个由 keystoneauth1 单独验证的服务令牌。目前,Keystone 不支持多令牌验证。因此,这将是另一个验证请求,这将导致额外的 API 调用到 Keystone。Rally 基准测试将在启用和禁用“service_user”配置选项的情况下运行,以比较快照或实时迁移等长时间运行任务的结果。

备选方案

  • 一种替代方法是为用户令牌设置更长的过期时间,以便它们不会在长时间运行的操作期间过期。但是,大多数情况下,更喜欢短寿命令牌,因为 Keystone 提供的 bearer 令牌在安全性方面非常薄弱。较短的过期时间限制了攻击者滥用被盗令牌的时间。

  • 或者,我们可以像上面建议的那样实现,为每个服务提供一个单独的服务令牌。这样,如果其中一个令牌被泄露,就不会暴露对所有服务的访问权限。

  • 将来,服务令牌请求验证可以在 neutron、cinder 或 glance 客户端中进行缓存,以减少额外的 API 调用到 Keystone。

数据模型影响

REST API 影响

无。

安全影响

在与 Cinder 和 Neutron 通信时,服务令牌将与用户令牌一起传递,以防实时迁移。

通知影响

其他最终用户影响

无。

性能影响

  • 对于我们发送到外部服务的每个请求,将会有额外的 API 调用到 Keystone 以生成服务令牌。

  • 外部服务的 keystone auth 中间件现在还需要验证用户令牌和服务令牌,从而进一步增加 Keystone 的负载。

其他部署者影响

  • 如果要使用服务令牌验证,则需要升级我们发送令牌到的服务上的 Keystone 中间件。

  • 部署者需要了解添加的新配置值。应在升级部分中记录这些值。

开发人员影响

所有服务都应了解使用服务令牌进行跨服务通信。需要在开发者文档中记录服务令牌的使用,以便其他人了解正在发生的事情。

实现

负责人

主要负责人

Sarafraj Singh (raj_singh)

其他贡献者

Pushkar Umaranikar (pumaranikar) OSIC 团队

工作项

  • 将服务令牌传递给 Cinder(在 Ocata 中实现)。

  • 将服务令牌传递给 Neutron,但仅限于非管理员情况(在 Ocata 中实现)。

  • 将服务令牌传递给 Glance。

  • 取决于 DevStack 的更改以创建服务用户和配置更新。

  • 在 gate-tempest-dsvm-neutron-placement-full-ubuntu-xenial-nv 作业中启用服务令牌。

依赖项

测试

  • 现有的功能测试将涵盖此新的流程。

  • 测试启用和禁用服务令牌验证的服务到服务通信。

文档影响

  • 更新开发者文档

  • 更新管理员指南以配置和使用服务用户组。

参考资料

Keystone 规范

历史

修订版

发布名称

描述

Ocata

引入