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"}
如何更新 ACL¶
可以通过对给定密钥/容器上的 PUT 或 PATCH 方法来更新现有的 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¶
可以使用各自的 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