ACL API 用户指南

默认情况下,barbican 管理对其资源(密钥、容器)的访问权限,按项目级别进行,用户对项目资源的访问权限基于用户在该项目中的角色。

某些 barbican 用例更喜欢对密钥和容器进行更细粒度的访问控制,例如在用户级别。访问控制列表 (ACL) 功能支持这种更严格的访问控制。

本指南假定您将使用正在本地运行的 barbican 开发环境。如果您需要设置方面的帮助,请参考 开发指南

警告

此 ACL 文档仍在进行中,未来可能会发生变化。

ACL 定义

ACL 定义一组属性,这些属性用于基于策略的授权,以确定对目标资源的访问权限。ACL 定义是特定于操作的,并且是针对每个密钥或每个容器定义的。

当前仅定义了“读取”操作。这支持允许 ACL 中的用户检索密钥的元数据或解密其有效负载。这也允许 ACL 中的用户检索容器的密钥引用列表。

ACL 允许将密钥或容器标记为私有。私有密钥/容器意味着只有创建密钥/容器的用户才能提取密钥。具有密钥/容器项目上必要角色的用户将没有访问权限。要允许其他用户访问,需要在相关的 ACL 用户列表中添加他们的用户 ID。

特定于操作的 ACL 定义具有以下属性
  • users: 允许访问目标资源的用户的白名单。在这种情况下,用户是指 Keystone 用户 ID。

  • project-access: 标记密钥或容器为私有的标志。传递 false 以标记为私有。

为了实现上述密钥/容器资源的行为,仅填充 ACL 数据是不够的。

定义了以下 ACL 规则,并在资源访问策略中使用 OR 逻辑
  • 当令牌用户存在于密钥/容器操作特定的 ACL 用户列表中时,允许基于 ACL 的访问,例如令牌用户存在于 read 用户列表中。

  • 当密钥/容器资源标记为私有时,则不允许项目级别的 RBAC 用户访问。例如,当密钥标记为私有时,只有创建它的用户或具有项目上“admin”角色的用户才能删除它。

注意

目前 barbican 默认策略仅使用 read ACL 数据。因此,只有对密钥和容器资源的 GET 调用才会使用 ACL 数据。密钥和容器资源上的其他请求方法仍然使用项目级别的 RBAC 检查策略。

根据默认策略规则,具有密钥/容器项目上 admin 角色的用户或创建密钥/容器的用户可以管理该密钥/容器的 ACL。

默认 ACL

默认情况下,如果未在密钥或容器上显式设置 ACL,则具有密钥项目或容器项目上必要角色的客户端可以访问它。此默认访问模式转换为 project-access 为 true 且 ACL 设置中没有 users。这就是为什么每个密钥和容器默认情况下都具有以下隐式 ACL。

{
  "read":{
    "project-access": true
  }
}

在未显式设置 ACL 时,在密钥/容器 acl 资源上执行 GET 操作时,也会返回上述默认 ACL。

如何设置/替换 ACL

可以通过对 acl 资源执行 PUT 操作来修改现有密钥或容器的 ACL。此更新将完全替换该密钥或容器的现有 ACL 设置。

要为密钥设置/替换 ACL

Request:

curl -X PUT -H 'content-type:application/json' \
-H 'X-Auth-Token:b06183778aa64b17beb6215e60686a60' \
-d '
{
  "read":{
    "users":[
      "2d0ee7c681cc4549b6d76769c320d91f",
      "721e27b8505b499e8ab3b38154705b9e",
      "c1d20e4b7e7d4917aee6f0832152269b"
    ],
    "project-access":false
  }
}' \
https://:9311/v1/secrets/15621a1b-efdf-41d8-92dc-356cec8e9da9/acl

Response (includes secret ACL reference):

HTTP/1.1 201 Created
{"acl_ref": "https://:9311/v1/secrets/15621a1b-efdf-41d8-92dc-356cec8e9da9/acl"}

要为容器设置/替换 ACL

Request:

curl -X PUT -H 'content-type:application/json' \
-H 'X-Auth-Token:b06183778aa64b17beb6215e60686a60' \
-d '
{
  "read":{
    "users":[
      "2d0ee7c681cc4549b6d76769c320d91f",
      "721e27b8505b499e8ab3b38154705b9e",
      "c1d20e4b7e7d4917aee6f0832152269b"
    ],
    "project-access":false
  }
}' \
https://:9311/v1/containers/8c077991-d524-4e15-8eaf-bc0c3bb225f2/acl

Response (includes container ACL reference):

HTTP/1.1 201 Created
{"acl_ref": "https://:9311/v1/containers/8c077991-d524-4e15-8eaf-bc0c3bb225f2/acl"}

要了解有关创建 API 的更多详细信息,您可以参考 设置密钥 ACL设置容器 ACL 文档。

如何更新 ACL

可以通过对给定密钥/容器上的 PUTPATCH 方法来更新现有的 ACL。PUT 操作使用提供的 ACL 数据替换现有的 ACL,而 PATCH 操作将提供的更改应用于密钥或容器的现有 ACL。

要替换容器的现有 ACL

Request:

curl -X PUT -H 'content-type:application/json' \
-H 'X-Auth-Token:e1f540bc6def456dbb0f8c11f21a74ae' \
-d '
{
  "read":{
    "users":[
      "2d0ee7c681cc4549b6d76769c320d91f",
      "721e27b8505b499e8ab3b38154705b9e"
    ],
    "project-access":true
  }
}' \
 https://:9311/v1/containers/8c077991-d524-4e15-8eaf-bc0c3bb225f2/acl

Response (includes container ACL reference):

HTTP/1.1 200 OK
{"acl_ref": "https://:9311/v1/containers/8c077991-d524-4e15-8eaf-bc0c3bb225f2/acl"}

要从容器的现有 ACL 中删除所有用户(在 users 中传递一个空列表)

Request:

curl -X PUT -H 'content-type:application/json' \
-H 'X-Auth-Token:e1f540bc6def456dbb0f8c11f21a74ae' \
-d '
{
  "read":{
    "users":[],
    "project-access":true
  }
}' \
 https://:9311/v1/containers/8c077991-d524-4e15-8eaf-bc0c3bb225f2/acl

Response (includes container ACL reference):

HTTP/1.1 200 OK
{"acl_ref": "https://:9311/v1/containers/8c077991-d524-4e15-8eaf-bc0c3bb225f2/acl"}

要仅使用 PATCH 更新容器 ACL 的 project-access 标志

Request:

curl -X PATCH -H 'content-type:application/json' \
-H 'X-Auth-Token:e1f540bc6def456dbb0f8c11f21a74ae' \
-d '
{
  "read":{
    "project-access":false
  }
}' \
 https://:9311/v1/containers/8c077991-d524-4e15-8eaf-bc0c3bb225f2/acl

Response:

HTTP/1.1 200 OK
{"acl_ref": "https://:9311/v1/containers/8c077991-d524-4e15-8eaf-bc0c3bb225f2/acl"}

要仅使用 PATCH 更新密钥 ACL 的用户列表

Request:

curl -X PATCH -H 'content-type:application/json' \
-H 'X-Auth-Token:e1f540bc6def456dbb0f8c11f21a74ae' \
-d '
{
  "read":{
    "users":[
      "2d0ee7c681cc4549b6d76769c320d91f",
      "c1d20e4b7e7d4917aee6f0832152269b"
    ],
  }
}' \
 https://:9311/v1/secrets/15621a1b-efdf-41d8-92dc-356cec8e9da9/acl

Response:

HTTP/1.1 200 OK
{"acl_ref": "https://:9311/v1/secrets/15621a1b-efdf-41d8-92dc-356cec8e9da9/acl"}

容器和密钥 ACL 的更新操作类似,除了 URI 中使用 containers 资源代替 secrets 资源。要了解有关 ACL 更新 API 的更多详细信息,您可以参考 更新密钥 ACL更新容器 ACL部分更新密钥 ACL部分更新容器 ACL 文档。

如何检索 ACL

可以使用对各自 acl 资源执行 GET 操作来检索为密钥或容器定义的 ACL。返回的响应包含 ACL 数据。

要获取密钥 ACL 数据

Request:

curl -X GET -H 'X-Auth-Token:b44636bff48c41bbb80f459df69c11aa' \
https://:9311/v1/secrets/15621a1b-efdf-41d8-92dc-356cec8e9da9/acl

Response:

HTTP/1.1 200 OK
{
  "read":{
    "updated":"2015-05-12T20:08:47.644264",
    "created":"2015-05-12T19:23:44.019168",
    "users":[
      "c1d20e4b7e7d4917aee6f0832152269b",
      "2d0ee7c681cc4549b6d76769c320d91f"
    ],
    "project-access":false
  }
}

要获取容器 ACL 数据

Request:

curl -X GET -H 'X-Auth-Token:b44636bff48c41bbb80f459df69c11aa' \
https://:9311/v1/containers/8c077991-d524-4e15-8eaf-bc0c3bb225f2/acl

Response:

HTTP/1.1 200 OK
{
  "read":{
    "updated":"2015-05-12T20:05:17.214948",
    "created":"2015-05-12T19:47:20.018657",
    "users":[
      "721e27b8505b499e8ab3b38154705b9e",
      "c1d20e4b7e7d4917aee6f0832152269b",
      "2d0ee7c681cc4549b6d76769c320d91f"
    ],
    "project-access":false
  }
}

要了解有关 ACL 查找 API 的更多详细信息,您可以参考 获取密钥 ACL获取容器 ACL 文档。

如何删除 ACL

可以使用各自的 acl 资源上的 DELETE 操作来删除密钥或容器的 ACL。成功删除后,不会返回响应内容。

删除操作会删除密钥或容器上的现有 ACL(如果有)。它可以被视为将密钥或容器重置为 默认 ACL 设置。因此,多次在此资源上调用删除操作不会导致错误。

Request:

curl -X DELETE -H 'X-Auth-Token:b06183778aa64b17beb6215e60686a60' \
https://:9311/v1/secrets/50f5ed8e-004e-433a-939c-fa73c7fc81fd/acl

Response:

200 OK

要了解有关 ACL 删除 API 的更多详细信息,您可以参考 删除密钥 ACL删除容器 ACL 文档。