将组 ID 列表添加到密钥和容器的 ACL¶
Launchpad 蓝图的 URL 在这里
https://blueprints.launchpad.net/barbican/+spec/api-acl-add-group-list
Barbican 当前的访问控制列表 (ACL) 方法仅允许添加用户 ID 以访问给定的密钥或容器。此蓝图建议允许将组 ID 添加到 ACL,以便为指定组内的用户提供访问密钥/容器的权限。将组支持添加到 ACL 将支持基于 LDAP 组的密钥/容器访问。此蓝图依赖于 Keystone 蓝图的批准 [1]。
问题描述¶
拥有大量用户的组织可能会发现通过当前的 ACL 方法在每个用户级别管理对 Barbican 密钥的访问是一项重要的工作。同样,对于希望管理对许多设备密钥访问的工程系统而言。简化访问配置的方法是按照此蓝图的建议,在用户组级别管理密钥和容器访问。
提议的变更¶
建议的方法是在当前的 SecretACL 实体上添加一个新的多对一引用,称为 SecretACLGroup,它将与 SecretACLUser 实体非常相似,只是具有一个 group_id 属性,该属性引用所需的组 ID 以允许密钥访问。同样,将添加一个新的 ContainerACLGroup 实体并通过当前的 ContainerACL 实体进行引用。
在 barbican.api.controllers 的 acls.py 模块中,将为每个 ACL 操作添加一个新的“groups”元素,并以与当前“users”元素类似的方式处理。
备选方案¶
无。
数据模型影响¶
“Proposed Change”(提议的变更)部分要求添加两个新的实体:SecretACLGroup 和 ContainerACLGroup,并分别从现有的 SecretACL 和 ContainerACL 实体添加额外的多对一引用。不需要初始记录或迁移。
REST API 影响¶
API 将被更改为向当前的 ACL JSON 消息添加一个“groups”元素。
因此,从 GET /v1/secrets/{uuid}/acl 的响应将变为
HTTP/1.1 200 OK
{
"read":{
"updated":"2015-05-12T20:08:47.644264",
"created":"2015-05-12T19:23:44.019168",
"users":[
{user_id1},
{user_id2},
.....
],
"groups":[
{group_id1},
{group_id2},
.....
],
"project-access":{project-access-flag}
}
}
建议将以下句子添加到 PUT /v1/secrets/{uuid}/acl 调用的描述中
要从 ACL 定义中删除现有的组,请为 groups 传递一个空列表 []。
此外,建议将以下行添加到“Attributes”(属性)部分
属性名称 |
类型 |
描述 |
默认值 |
|---|---|---|---|
groups |
[string] |
(可选) 组 ID 列表。这需要 Keystone 返回的组 ID。 |
[] |
此外,以下内容应替换“Request/Response”(请求/响应)部分中的“Body”(主体)元素
Body:
{
"read":{
"users":[
{user_id1},
{user_id2},
.....
],
"groups":[
{group_id1},
{group_id2},
.....
],
"project-access":{project-access-flag}
}
}
除了密钥资源 API 的更改之外,从 GET /v1/containers/{uuid}/acl 的响应将变为
HTTP/1.1 200 OK
{
"read":{
"updated":"2015-05-12T20:08:47.644264",
"created":"2015-05-12T19:23:44.019168",
"users":[
{user_id1},
{user_id2},
.....
],
"groups":[
{group_id1},
{group_id2},
.....
],
"project-access":{project-access-flag}
}
}
建议将以下句子添加到 PUT /v1/containers/{uuid}/acl 调用的描述中
要从 ACL 定义中删除现有的组,请为 groups 传递一个空列表 []。
此外,建议将以下行添加到“Attributes”(属性)部分
属性名称 |
类型 |
描述 |
默认值 |
|---|---|---|---|
groups |
[string] |
(可选) 组 ID 列表。这需要 Keystone 返回的组 ID。 |
[] |
此外,以下内容应替换“Request/Response”(请求/响应)部分中的“Body”(主体)元素
Body:
{
"read":{
"users":[
{user_id1},
{user_id2},
.....
],
"groups":[
{group_id1},
{group_id2},
.....
],
"project-access":{project-access-flag}
}
}
安全影响¶
提议的变更提供了另一种可选机制来访问密钥和容器,通过用户的组 ID 信息。
通知与审计影响¶
除了计划用于资源访问的审计之外,不需要额外的审计。
其他最终用户影响¶
还应将组 ID 添加到 Barbican Python 客户端的 ACL 支持。
性能影响¶
对于每次检索密钥或容器,都需要额外的查询来获取组 ACL 信息。
其他部署者影响¶
不需要配置。应按照“Work Items”(工作项)部分提供的顺序应用更改。
开发人员影响¶
无。
实现¶
负责人¶
- 主要负责人
待定
工作项¶
建议以下工作序列用于零停机时间部署
创建一个 CR 来修改 Sphinx 文档,以包含新的“groups”API 信息,并标记为“Work in Progress”(进行中)
创建一个 CR 来添加数据模型实体和关系,如“Data model impact”(数据模型影响)部分所述,确保在应用数据模型更新后,当前状态代码仍然可以正常运行
创建 CR(s) 来添加 SQLAlchemy barbican.model 的 models.py 类和关系,以匹配上述数据模型更改
创建 CR(s) 来添加新的“groups”列表到“acls”控制器模块,如上所述,以及单元测试
添加 CR(s) 来添加功能测试,如详细信息所示
添加 CR(s) 来添加“groups”ACL 支持到 Barbican Python 客户端
依赖项¶
此蓝图依赖于 Keystone 中间件通过 X-Group-Ids HTTP 标头为经过身份验证的令牌提供组 ID 信息。一个用于向 Keystone 添加此功能的蓝图在这里提供 [1]。
测试¶
ACL 的当前功能测试将扩展为也测试新的“groups”列表。
文档影响¶
ACL 的当前文档将扩展为添加“groups”信息,如“API impact”(API 影响)部分所述。