Secrets 的部署者特定元数据¶
蓝图:https://blueprints.launchpad.net/barbican/+spec/deployer-specific-secret-metadata
问题描述¶
部署者(服务管理员)可能需要能够向 Barbican Secret 添加额外数据,这些数据用户无法访问/修改。对于用户而言,这些数据必须是不可变的,但部署者应该能够更改它们。Secrets 包含不可变的元数据,例如 创建时间、更新时间、算法、等。部署者可能希望添加一些对用户来说也是不可变的数据。例如,部署者可能希望存储诸如 区域 之类的具体信息,以指示 Secret 的位置。
目前只能使用用户元数据,并且用户可以修改它[1]。
提议的变更¶
拟议的更改是向 Barbican Secrets 添加一个新的属性,以便存储部署者元数据。还必须创建一个新的 API 端点来操作元数据。
备选方案¶
锁定元数据的用法,并让数据库管理员添加键和值。
数据模型影响¶
将创建一个名为 secret-deployer-metadata 的新表,其中包含 secret_id、key 和 value 列。
在数据库级别,还将对 metadata 的大小进行限制。
注意
所有值都将存储为字符串。
REST API 影响¶
Secrets 的每个当前 API 调用现在都将添加 deployer-metadata 属性。如果未提供 deployer-metadata,则将初始化一个空字典。
以下内容将添加到 REST API
从 Secret 获取部署者元数据
GET /v1/secrets/{uuid}/deployer-metadata
Headers:
Accept: application/json
X-Project-Id: {project_id}
200 OK
{
'deployer-metadata': {
'description': 'contains the AES key',
'geolocation': '12.3456, -98.7654'
}
}
创建/更新 Secret 的部署者元数据
PUT /v1/secrets/{uuid}/deployer-metadata
Headers:
Accept: application/json
X-Project-Id: {project_id}
Content:
{
'deployer-metadata': {
'description': 'contains the AES key',
'geolocation': '12.3456, -98.7654'
}
}
200 OK
{
'deployer-metadata': {
'description': 'contains the AES key',
'geolocation': '12.3456, -98.7654'
}
}
注意
仅需要创建/更新部署者元数据。要删除元数据,用户可以使用带有空字典的 PUT 方法。如果发送了部分模型,则整个元数据将被更改为发送的部分模型。数据模型中存在但 PUT 中不存在的值将被删除。
以下内容将添加到 REST API,以处理单个用户元数据项
在 Secret 中创建一个单独的元数据项
POST /v1/secrets/{uuid}/deployer-metadata
Headers:
Accept: application/json
X-Project-Id: {project_id}
Content:
{
"key": "access-limit",
"value": 11
}
201 Created
Secret Metadata Location: http://example.com:9311/v1/secrets/{uuid}/deployer-metadata/access-limit
{
"key": "access-limit",
"value": 11
}
注意
如果该项已存在,则将返回 409 Conflict 错误代码。
更新 Secret 中的单个元数据项
PUT /v1/secrets/{uuid}/deployer-metadata/access-limit
Headers:
Accept: application/json
X-Project-Id: {project_id}
Content:
{
"key": "access-limit",
"value": 11
}
200 OK
{
"key": "access-limit",
"value": 11
}
注意
如果尚未创建 access-limit,则将返回 404 错误代码。
获取 Secret 中的单个元数据项
GET /v1/secrets/{uuid}/deployer-metadata/access-limit
Headers:
Accept: application/json
X-Project-Id: {project_id}
200 OK
{
"key": "access-limit",
"value": 0
}
注意
如果 access-limit 键不存在,则将返回 404 错误代码。
删除 Secret 中的单个元数据项
DELETE /v1/secrets/{uuid}/deployer-metadata/access-limit
Headers:
X-Project-Id: {project_id}
204 No Content
注意
如果 access-limit 键不存在,则将返回 404 错误代码。
安全影响¶
必须为上述新的 API 调用设置 ACL 和策略。
Barbican 的 policy.json 现在将包含以下内容
“secret-deployer-meta:get”: “rule:service_admin”
“secret-deployer-meta:post”: “rule:service_admin”
“secret-deployer-meta:put”: “rule:service_admin”
“secret-deployer-meta:delete”: “rule:service_admin”
通知与审计影响¶
如果支持,添加/修改 secret-deployer-metadata 应该记录审计事件。
其他最终用户影响¶
无
性能影响¶
最小化
将在数据库中添加一个新表。它将包括新的 alembic 脚本来创建新表及其关联关系。
其他部署者影响¶
部署者现在将能够存储特定于 Secret 的元数据,这些元数据可能被应用程序使用。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
diazjf
- 其他贡献者
无
工作项¶
阶段 1:数据库更改 阶段 2:当前和新 API 更改和测试 阶段 3:文档
依赖项¶
无
测试¶
必须为内部组件测试编写单元测试。必须为整体测试此新功能编写功能测试。
文档影响¶
Barbican API 必须更新以包含这些更改。
参考资料¶
[1] https://github.com/openstack/barbican-specs/blob/master/specs/mitaka/add-user-metadata.rst