为允许存储私有密钥添加每个密钥策略¶
https://blueprints.launchpad.net/barbican/+spec/add-per-secret-policy
问题描述¶
这是添加每个密钥策略(add-per-secret-policy)规范的配套规范。该规范提出了一种机制,允许密钥项目之外的用户访问密钥/容器。这种机制涉及在数据库中存储每个密钥/容器的访问控制数据。
本规范解决了相关问题。目前,具有密钥创建者项目中相关角色的所有用户都可以访问密钥。这意味着同一项目的所有成员都可以访问为该项目存储的所有密钥。
最近,有请求能够指定“私有密钥”。这些密钥只能由密钥创建者(创建密钥的用户)提取。
现在,可以为希望存储私有密钥的每个用户创建一个项目。这似乎是一个非常繁重的解决方案,在管理所有必需的组和角色方面有很大的管理开销。
提议的变更¶
提案是为每个密钥/容器存储额外的访问数据。此数据(“creator_only”,值为 True/False)将作为单独的列存储在 SecretACL 和 ContainerACL 数据表中。详细信息请参阅下面的“数据模型影响”部分。
当访问密钥/容器时,creator_only 信息和任何白名单信息通过 target.* 变量传递给策略层。然后通过评估使用这些参数的策略规则来确定访问权限。建议的策略规则在下面的“策略”部分中指定。
最后,需要增强 REST API,以允许用户指定和更改密钥/容器的 creator_only 状态。
操作¶
当 creator_only = True 时,许多不同的操作受到限制
- 获取:如果 creator_only 为 true,则只有密钥/容器的创建者才能
访问密钥。但限制对容器的访问不会将限制级联到组成密钥。
请注意,这不影响已明确允许获取密钥/容器的白名单用户。
- 删除:如果 creator_only 为 true,则密钥/容器只能由
创建者删除。
- 写入:如果 creator_only 为 true,则密钥/容器只能由
创建者删除。
change-acl:默认情况下,这只能由创建者修改。
- 列表:如果 creator_only 为 true,则只有创建者才能列出密钥。
这意味着如果非创建者访问 GET /secrets,则不会显示密钥的链接
数据模型影响¶
根据每个密钥规范,密钥、容器和订单表将添加一列来存储密钥的创建者。该列将由创建者的 user_id 填充。
需要向 ContainerACL 和 SecretACL 表添加一个布尔列(“creator_only”)。ACL 表的字段如下:
secret_id:指向 Secrets 表的外键 operation:(在本例中为 get, write, delete, list) users:字符串,指定操作的白名单用户列表 creator_only:True/False
当一个密钥被指定为“creator_only”时,将创建/修改几个字段
secret_id : get : users, True
secret_id: write: None, True
secret_id: delete: None, True
secret_id: list: None, True
将密钥取消指定为“仅限创建者”将修改/删除上述条目。
REST API 影响¶
将一个新参数(“creator-only”),其取值为“True”和“False”,添加到 ACL 定义中。它将默认为 False。因此,ACL 定义将如下所示:
{ "get": { "users": ["some_user", "another_user"], }, "creator-only": "true" }
如果 creator-only 设置为 true,将创建上面提到的字段。
如每个密钥规范中所述,ACL 可以作为可选的 acl 参数在使用 POST 请求创建密钥时指定。它也可以通过 GET 或 POST 进行检索或修改。
POST <host>/v1/secrets/<secret-UUID>/acl GET <host>/v1/secrets/<secret-UUID>/acl
策略¶
当访问容器或密钥时,ACL 数据将从数据库中检索,并作为 target.* 属性提供给 RBAC 层。例如,为了读取密钥,我们可以传入 target.user_whitelist 和 target.creator_only。
策略规则将如下所示:
(can_read_shared and user_in_user_whitelist) OR
((current_resource_permissions and not creator_only) OR user_is_creator)
(current_resource_permissions) 部分基本上表示用户在密钥创建者的项目中具有相关角色。
对于删除、修改等操作,规则要简单得多,因为我们不需要考虑白名单。例如,删除可能看起来像这样:
((current_resource_permissions and not creator_only) OR user_is_creator)
备选方案¶
如前所述,对于私有密钥,我们可以为每个用户创建一个组。除了繁琐之外,这还会给系统管理员带来维护负担,以跟踪新增和删除的用户。
安全影响¶
通过允许用户指定私有密钥,这提高了整个堆栈的安全性与可用性。
通知与审计影响¶
无。
其他最终用户影响¶
python-barbicanclient 将需要更新,以提供用于填充额外参数的接口。
性能影响¶
访问密钥/容器将需要两次数据库调用:一次是作为 RBAC 引擎规则执行的一部分获取密钥/容器白名单,另一次是实际获取密钥。
这两个数据库访问在逻辑上是分开的,因为第一个过程由中间件控制,第二个由 Pecan 控制。我们可能能够利用相同的 SQLAlchemy 事务,或者缓存该密钥实体数据供控制器使用,因此这可能没有争议。
其他部署者影响¶
无。
开发人员影响¶
无。
实现¶
负责人
- 主要负责人
alee rm_work
工作项¶
向数据库表添加新字段,并向 REST API 添加新参数/调用。
添加逻辑以解析数据并将数据存储在数据库中。
添加逻辑以从数据库中检索数据,并将其作为 target.* 属性提供给 RBAC 层。
根据这些 target.* 属性修改策略规则。这里可能需要扩展 oslo 策略以考虑新的布尔标志。任何更改都需要清楚地传达给部署者,因为不能保证他们会使用默认策略文件进行部署。
依赖项¶
无
测试¶
当前的单元测试也将被修改以反映此更改。
文档影响¶
Barbican 文档和 API 文档将需要更改。