将组 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.controllersacls.py 模块中,将为每个 ACL 操作添加一个新的“groups”元素,并以与当前“users”元素类似的方式处理。

备选方案

无。

数据模型影响

“Proposed Change”(提议的变更)部分要求添加两个新的实体:SecretACLGroupContainerACLGroup,并分别从现有的 SecretACLContainerACL 实体添加额外的多对一引用。不需要初始记录或迁移。

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”(工作项)部分提供的顺序应用更改。

开发人员影响

无。

实现

负责人

主要负责人

待定

工作项

建议以下工作序列用于零停机时间部署

  1. 创建一个 CR 来修改 Sphinx 文档,以包含新的“groups”API 信息,并标记为“Work in Progress”(进行中)

  2. 创建一个 CR 来添加数据模型实体和关系,如“Data model impact”(数据模型影响)部分所述,确保在应用数据模型更新后,当前状态代码仍然可以正常运行

  3. 创建 CR(s) 来添加 SQLAlchemy barbican.modelmodels.py 类和关系,以匹配上述数据模型更改

  4. 创建 CR(s) 来添加新的“groups”列表到“acls”控制器模块,如上所述,以及单元测试

  5. 添加 CR(s) 来添加功能测试,如详细信息所示

  6. 添加 CR(s) 来添加“groups”ACL 支持到 Barbican Python 客户端

依赖项

此蓝图依赖于 Keystone 中间件通过 X-Group-Ids HTTP 标头为经过身份验证的令牌提供组 ID 信息。一个用于向 Keystone 添加此功能的蓝图在这里提供 [1]。

测试

ACL 的当前功能测试将扩展为也测试新的“groups”列表。

文档影响

ACL 的当前文档将扩展为添加“groups”信息,如“API impact”(API 影响)部分所述。

参考资料

[1] https://review.openstack.org/#/c/188564/