消费 Keystone 项目删除事件

https://blueprints.launchpad.net/barbican/+spec/consume-keystone-events

在大多数 OpenStack 部署中,Barbican 预计将与 Keystone 集成以满足其资源授权需求。Keystone 和 Barbican 共享 Keystone 项目作为共同的实体引用。这意味着,在向 Barbican 添加资源(例如密钥和容器)之前,项目需要在 Keystone 中存在。但是,当项目在 Keystone 中被删除时,Barbican 没有采取任何行动来反映此更改,并继续维护该项目悬挂的资源引用。此蓝图解决了该领域的相关问题。

问题描述

Barbican 资源在 Keystone 项目级别进行管理。作为 Barbican 资源创建的一部分,Barbican 租户(也称为项目)被映射到 Keystone 项目,并且资源与租户关联。随着时间的推移,越来越多的资源被添加到租户。现在,当项目从 Keystone 中删除时,Barbican 当前不知道此更改并保持其资源不变。这些项目资源现在无效,并且是某种悬挂引用,指向一个不存在的项目。

  • 随着 Barbican 功能集的扩展,此类租户资源的数量会随着时间的推移而增加,这可能会对数据库操作的性能产生负面影响。

  • 硬件安全模块 (HSM) 可以存储的密钥加密密钥数量有限制。这些数字与 Barbican 中的项目数量相关。如果没有项目状态感知,无法执行相关的无效密钥清理以回收 HSM 中的空间以供新密钥使用。

  • 在 PKI 令牌服务使用的特定情况下,在很短的时间内,未过期的 PKI 令牌可以访问已删除的项目资源,因为它尚未从 Keystone 获取和处理相关的撤销事件。通过使 Barbican 了解已删除的项目,即使这些 PKI 令牌也无法访问 Barbican 资源。需要明确的是,如果撤销事件被频繁获取,PKI 令牌通常不会出现此问题。

提议的变更

Keystone 在创建、更新和删除项目时发布通知。建议在 Barbican 中添加通知侦听器以消费 Keystone 公共事件。

Keystone 事件有效负载具有项目 ID 作为 resource_info,Barbican 事件侦听器逻辑将传播它以对与该项目关联的资源进行更改。

以下是 Keystone 关于项目删除的示例通知

Message: ctxt = [{}], metadata = [{'timestamp': u'2014-06-12 00:20:03.584997', 'message_id': u'1ade0b2b-1584-48b9-a026-64bd06659baf'}]
Message: severity = [info], publisher_id = [identity.arunkant-uws], event_type = [identity.project.deleted]
Message: payload = [{u'resource_info': u'00ac7ea2a1a3486284c8e2af27b7bc9e'}]

事件侦听器将使用 Oslo Messaging 库,该库提供了一种抽象,允许使用不同类型的消息传递传输。

  • 删除 Keystone 项目将调用相关的密钥、容器和租户实体的删除操作。当前实体删除是一种软删除,因为特定字段被标记为已删除,但记录仍然保留在数据存储中。如果项目被禁用,Keystone 将使该项目的令牌失效,并且该项目拥有的密钥将无法访问。Barbican 拥有的密钥不会被软删除,但它们将无法访问。此外,Keystone 删除项目和 Barbican 删除项目都应生成 CADF 审计事件,并且理想情况下应在这两个事件之间使用相关标识符。审计记录中还应使用扩展字段来声明删除类型(软删除或硬删除)。

  • Keystone 根据其自身资源类型(例如用户、项目、角色等)和操作类型(例如创建、更新、删除等)发送各种通知事件。此提案的范围仅限于对 Keystone 项目删除事件采取行动仅限

  • Barbican 将添加一个队列到交换机以侦听 Keystone 通知。队列特定属性,例如交换机名称和类型、队列名称、绑定模式等,将在 Barbican 配置中进行配置。其中一些属性值需要与 Keystone 通知配置对齐。

  • Keystone 当前仅以 info 严重性发布通知。绑定模式 notifications.* 将处理此问题。

  • Barbican 队列将是持久的,以在代理重启后存活。

  • 此功能将是可配置的,默认情况下未启用,类似于通过管道配置进行的 Keystone 身份验证。

  • 仅当 Barbican 侦听器已处理事件信息时,才会确认通知。自动确认将被设置为 false

  • Barbican 连接到消息队列使用用户名和密码进行身份验证。这些凭据将在 Barbican 配置中定义。

  • 根据 Oslo Messaging 为特定传输提供程序提供的 SSL 支持,相关的配置将被添加到 Barbican 配置中。

  • 在初始版本中,消息队列和 Barbican 实例之间没有建立信任关系。KDS(密钥分发服务,Kite)可以在未来帮助解决此问题,一旦其他服务开始将其用于此功能。

  • 资源侧的更改仅在完成事件处理后才会提交,否则更改将被回滚。

  • 一旦 Barbican 中提供此类事件支持,如果这有意义,可以将这些事件传播到 Barbican 的外部子组件。此类子组件的一个示例是在 HSM 中清理密钥加密密钥(当将来添加此功能时)。

备选方案

获取 Keystone 项目信息的其他方法包括轮询模型或直接访问 Keystone 数据存储,但这些方法不可扩展并且可能会在服务之间引入紧密耦合。基于事件的异步方法更好,因为 Keystone 通知主要用于其他 OpenStack 服务根据事件采取行动,例如清理其资源。

数据模型影响

没有数据模型影响,因为我们将利用现有的实体软删除功能。

REST API 影响

安全影响

Keystone 公共事件本身不包含敏感数据。事件数据具有关于操作和资源 ID 的信息。

  • 由于这些事件的影响将导致删除 Barbican 资源,因此需要清晰地记录事件和采取的行动。

  • 一旦 Barbican 中添加了审计支持,项目删除事件将是一种审计活动类型。

  • 消息队列连接信息需要像其他外部资源连接(例如数据库)一样受到保护。

通知与审计影响

添加了一个新的通知侦听器。相关的审计信息将被添加到系统中。

其他最终用户影响

性能影响

除了在同一主机系统上添加新的消息处理服务器外,不应有性能影响。

  • 由于此更改,Barbican 连接到数据库系统的数量可能会增加,具体取决于可操作事件的负载。通常,考虑到 Keystone 项目不太可能定期删除,此类事件的数量会非常少。

  • 根据 Keystone 事件活动,部署者可以选择在一些 Barbican 实例上启用通知侦听器,假设设置中有一个 Barbican 实例池。

其他部署者影响

  • 此功能需要启用,因为默认配置将禁用它。

  • 相关的通知侦听器配置需要根据部署者的现有消息传递基础设施设置进行配置。

  • 添加了一个消息处理服务器,作为新进程,用于将队列中的通知事件传输到 Barbican。

开发人员影响

实现

负责人

主要负责人

Arun Kant <arun.kant@hp.com>

其他贡献者

??

工作项

  • 需要添加通知侦听器配置

  • 使用 Oslo Messaging 包实现通知侦听器和消息处理服务器。

  • 识别可操作事件并处理以对 Barbican 资源进行更改。

  • 将这些操作作为一个单元实现,并在处理错误时回滚。一个选项,需要调查,是在 SQLAlchemy 会话中完成所有操作。

  • 如果缺少,请在 order 和其他资源 API 中添加检查,以防止对已删除的租户(也称为 Keystone 项目)创建和更新资源

依赖项

测试

如果需要消息传递支持,请添加任何集成测试。

文档影响

将添加有关通知侦听器配置的额外文档。可能是一个新的选项,类似于以下链接

https://github.com/cloudkeep/barbican/wiki/Barbican-Options:-authentication-with-Keystone

参考资料