Barbican Spec - Barbican Consumer Registration¶
包含您的 Launchpad 蓝图的 URL
https://blueprints.launchpad.net/barbican/+spec/api-add-container-registration
允许消费者在 Barbican 容器和密钥上注册为“感兴趣方”。这些信息将在检索容器时可用,客户端进程可以使用这些信息来在执行删除操作之前发出有关这些感兴趣方的警告,或者在需要替换旧容器时确定需要更新哪些方。
问题描述¶
在某些工作流中,多个客户端将访问 Barbican 中的相同容器/密钥信息。此工作流可能涉及客户端更新或删除此“共享”信息。如果此客户端可以检查哪些实体对该信息感兴趣,他们可能能够执行后续操作(例如更新或通知受影响的实体),或者警告用户操作可能会影响其他实体(例如在执行删除之前)。
一个示例工作流是,当客户端在 Barbican 中创建证书信息(这会创建一个具有唯一 UUID 的容器),然后将该容器 UUID 与 LBaaS 一起共享作为创建负载均衡器实例的一部分。LBaaS 可以通过 UUID 检索容器以获取要安装的证书,也可以将自身注册为该容器的感兴趣消费者。现在,如果客户端希望稍后删除相同的容器,他们可以首先检查是否有或多个消费者对容器感兴趣。他们可以选择(例如)先删除负载均衡器,或者完全中止删除过程。
提议的变更¶
允许消费者注册他们对 Barbican 容器或密钥的兴趣。
这将需要在“容器”和“密钥”资源下创建一个新的 REST Pecan API 子资源,以便消费者可以 POST 以使用 JSON 主体中的消费者数据进行注册,并 DELETE 以取消注册。以下是 API 影响部分中的详细说明。
我们还需要在数据模型中创建两个新的表来存储此消费者数据。以下是数据模型影响部分中的详细说明。
备选方案¶
也可以不使用新资源,而使用现有容器 GET 调用的查询参数(如“register”和“deregister”),但这不符合真正的 RESTful 方案,并将副作用行为添加到简单的 GET 调用中。
我们可以避免使用 admin-api,而是将功能添加到标准 user-api,并使用 keystone 角色来限制访问。
我们可以使用单个通用表来表示数据模型,而不是为每种实体类型使用一个表,但似乎达成共识的是,为了保持清晰的外键关系,值得使用额外的表。
- 整个服务注册概念的替代方案包括以下内容
1) 使 Barbican 保持简单,并强制客户端处理从一个容器 UUID 切换到新的 UUID,包括 LBaaS 等所有依赖消费者。诸如 Heat 之类的编排系统可能能够处理此转换。但是,LBaaS 社区担心由于客户端仍然可以访问容器,因此他们可能会从这些编排系统中删除它们。如果需要,LBaaS 尝试故障转移到新的负载均衡器实例将失败,因为原始容器 UUID 将不再可用。
2) 允许容器是可变的,以便证书(例如)可以在不更改容器 UUID 的情况下更新。Barbican 然后可以向感兴趣方(如 LBaaS)发送事件,以便他们在负载均衡器实例中更新证书。但是,如果新的证书存在缺陷,LBaaS 需要能够恢复到证书的先前版本。为 Barbican 添加版本控制将是一项付出巨大努力但收益甚微的工作。
数据模型影响¶
将创建一个新的模型和存储库,用于 ContainerConsumerMetadatum,其中包含以下内容
container_id(对 Container.id 的外键引用)
name(字符串,由消费者指定的自由格式数据,例如:“LBaaS”、“VPNaaS”)
URL(字符串,依赖于此实体的对象的资源定位符,例如:“https://lbaas.myurl.net/loadbalancer/<lbid>”)
将在“container_id”、“name”和“URL”的组合上放置唯一约束。将在“container_id”和“name”上创建索引。
对于 SecretConsumerMetadatum,将执行相同的操作,并相应地更新列名。
由于这是一种可选的从容器/密钥到多对一的关系,因此不应需要数据迁移。
REST API 影响¶
此 BP 影响 admin API 和 user API。
影响 admin API 的更改
需要在 admin-api 中添加一个名为“consumers”的新资源,支持 GET、POST 和 DELETE。这将是“containers”和“secrets”的子资源,因此我们还需要在 admin-api 上为“containers”和“secrets”创建一个存根资源。示例:http://admin-api/v1/containers/{container-uuid}/consumers
使用 POST 方法的简单注册 JSON 主体结构如下
{
"name": "LBaaS",
"URL": "https: //lbaas.myurl.net/loadbalancer/4124/"
}
此注册 POST 的响应将是可从 GET 调用获得的当前实体响应。因此,在客户端创建容器并将该 UUID 传递给 LBaaS(例如)以创建负载均衡器实例后,LBaaS 将对该容器 UUID 的“consumers”子资源进行上述 POST 调用。LBaaS 然后将同步接收容器的信息,就好像他们执行了 GET 调用一样,然后可以在负载均衡器上安装证书。
取消注册将使用与注册相同的资源和 JSON 主体,但使用 DELETE 方法。因此,删除将通过值而不是对消费者实体的特定 UUID 引用来执行(因为注册 UUID 从未暴露给消费者)。
影响 user API 的更改
容器/密钥的 GET 响应的 JSON 主体将包括该实体的当前 GET 响应,以及一个新的“consumers”元素,该元素将结构如下
{
<current GET response data>,
"consumers": [
{
"name": "LBaaS",
"URL": "https://lbaas.myurl.net/loadbalancer/4124/"
},
{
"name": "LBaaS",
"URL": "https://lbaas.myurl.net/loadbalancer/4125/"
},
{
"name": "VPNaaS",
"URL": "https://vpn.myurl.net/vpn/345634/"
}
]
}
如果在测试中观察到显着的性能下降,则当前的 Container/Secret API 可以在未来的 CR 中如下更改
1) 可以修改根(列表)调用的 GET 以不返回“consumers”属性,以减少整体响应消息的大小。
安全影响¶
此蓝图不需要更改加密资源。我们可能需要对每个容器/密钥可以注册的消费者数量施加上限,以防止拒绝服务攻击。
人们也担心存储在 Barbican 实体上的任何元数据都应为了安全起见进行加密,但该问题适用于比此功能更多的内容,可能应作为单独的蓝图处理。
通知影响¶
无。
其他最终用户影响¶
无。
性能影响¶
最初,由于返回的数据量增加,可能会对 /containers/ 和 /secrets/(列表,而不是单个实体)的 GET 产生性能影响。如果影响很大,则仅在对特定容器/密钥的 GET 调用上检索消费者注册信息,而不是在所有容器/密钥的 GET 列表中检索。
其他部署者影响¶
无。
开发人员影响¶
消费 Barbican 容器/密钥的服务的开发人员将使用 admin-api 消费者服务,而不是在他们希望注册对实体感兴趣时使用标准 api GET 资源。但是,此功能是可选的,并且不会影响当前的工作流程。
实现¶
负责人¶
- 主要负责人
adam-harwell
vivek-jain
工作项¶
- 初始实现将由两个 CR 组成
将为容器的初始实现创建一个 CR。
后续 CR 将用于将此功能添加到密钥。
可能还有针对上述性能更改的额外 CR。
可能还有针对此(和其他)元数据加密的额外 BP/CR。
依赖项¶
无。
测试¶
添加新功能的单元和集成测试。
文档影响¶
更新此处 API 指南:https://github.com/cloudkeep/barbican/wiki/Application-Programming-Interface
参考资料¶
https://wiki.openstack.org/wiki/Neutron/LBaaS/SSL#TLS_Certificates_Management(撰写本文时,此 wiki 仍然假定可变容器,这很快将得到纠正。)