向 Barbican 密钥添加用户元数据¶
蓝图
https://blueprints.launchpad.net/barbican/+spec/add-user-metadata
客户端蓝图
https://blueprints.launchpad.net/python-barbicanclient/+spec/add-user-metadata
目前,用户为 Barbican 密钥生成唯一信息的方式仅有 name。此蓝图将为每个 Barbican 密钥添加一个新字段,允许用户向密钥添加自己的元数据。
问题描述¶
用户可能需要向 Barbican 密钥添加额外数据。用户可能希望添加密钥的描述以及其他必要数据,例如地理位置、速率、允许的时间访问等。这将允许用户应用程序/服务检查用户元数据中的某些字段,以便允许/禁止对 Barbican 的操作。
提议的变更¶
拟议的更改是向 Barbican 密钥添加一个新属性,以便存储用户元数据。还必须创建一个新的 API 端点来操作元数据。
备选方案¶
目前没有替代方案,因为用户除了 name 属性外,无法添加任何唯一信息。
数据模型影响¶
密钥现在将具有一个名为 metadata 的附加参数。metadata 将是一个字典,用户可以在其中添加键和值。
还必须设置用户可以添加到密钥的元数据的数量限制。quota_secret_meta 将被添加到 Barbican 配置中并设置为 -1,这允许无限的元数据。
在数据库级别,metadata 的大小也将受到限制。
将创建一个名为 secret-metadata 的新表,其中包含 secret_id、key 和 value 列。
这具有以下好处
1. 搜索优势:可以使用 value 列进行搜索,并且可以在找到无效字符时停止搜索。还可以对键进行索引,以便更快地搜索具有特定标签的键。
2. 可扩展性:如果我们希望添加新的信息,例如创建时间戳、更新时间戳等,我们可以简单地添加一列。这比添加其他系统更简洁。
3. 数据一致性:可以在数据库级别进行限制,例如键/值字符串的长度。可以通过添加列限制来限制元数据项的数量。这将为数据完整性提供良好的措施,并加强安全性。
注意
所有值都将存储为字符串。
REST API 影响¶
每个当前用于密钥的 API 调用现在将具有 metadata 作为添加的属性。如果未提供 metadata,则将初始化一个空字典。
POST /v1/secrets
Headers:
Content-Type: application/json
X-Project-Id: {project_id}
Content:
{
"name": "AES key",
"expiration": "2015-12-28T19:14:44.180394",
"algorithm": "aes",
"bit_length": 256,
"mode": "cbc",
"payload": "YmVlcg==",
"payload_content_type": "application/octet-stream",
"payload_content_encoding": "base64"
"metadata": {
'description': 'contains the AES key',
'geolocation': '12.3456, -98.7654'
}
}
201 Created
{
"secret_ref": "https://{barbican_host}/v1/secrets/{uuid}"
}
GET /v1/secrets/{uuid}
Headers:
Accept: application/json
X-Project-Id: {project_id}
200 OK
{
"status": "ACTIVE",
"created": "2015-03-23T20:46:51.650515",
"updated": "2015-03-23T20:46:51.654116",
"expiration": "2015-12-28T19:14:44.180394",
"algorithm": "aes",
"bit_length": 256,
"mode": "cbc",
"name": "AES key",
"secret_ref": "https://{barbican_host}/v1/secrets/{secret_uuid}",
"secret_type": "opaque",
"content_types": {
"default": "application/octet-stream"
}
"metadata": {
'description': 'contains the AES key',
'geolocation': '12.3456, -98.7654'
}
}
注意
如果在 POST 请求中未输入 metadata,则不会显示 metadata。
以下内容将添加到 REST API
获取密钥的用户元数据
GET /v1/secrets/{uuid}/metadata
Headers:
Accept: application/json
X-Project-Id: {project_id}
200 OK
{
'metadata': {
'description': 'contains the AES key',
'geolocation': '12.3456, -98.7654'
}
}
创建/更新密钥的用户元数据
PUT /v1/secrets/{uuid}/metadata
Headers:
Accept: application/json
X-Project-Id: {project_id}
Content:
{
'metadata': {
'description': 'contains the AES key',
'geolocation': '12.3456, -98.7654'
}
}
200 OK
{
'metadata': {
'description': 'contains the AES key',
'geolocation': '12.3456, -98.7654'
}
}
注意
仅需要创建/更新用户元数据。要删除元数据,用户可以执行带有空字典的 PUT 请求。如果发送部分模型,则整个元数据将更改为发送的部分模型。数据模型中存在但 PUT 中不存在的值将被删除。
以下内容将添加到 REST API,以处理单个用户元数据项
在密钥中创建一个单独的元数据项
POST /v1/secrets/{uuid}/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}/metadata/access-limit
{
"key": "access-llimit",
"value": 11
}
注意
如果该项已存在,则将返回 409 Conflict 错误代码。
更新密钥中的单个元数据项
PUT /v1/secrets/{uuid}/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 错误代码。
获取密钥中的单个元数据项
GET /v1/secrets/{uuid}/metadata/access-limit
Headers:
Accept: application/json
X-Project-Id: {project_id}
200 OK
{
"key": "access-limit",
"value": 0
}
注意
如果 access-limit 键不存在,则将返回 404 错误代码。
删除密钥中的单个元数据项
DELETE /v1/secrets/{uuid}/metadata/access-limit
Headers:
X-Project-Id: {project_id}
204 No Content
注意
如果 access-limit 键不存在,则将返回 404 错误代码。
安全影响¶
必须为上述新的 API 调用设置 ACL 和策略。
Barbican 的 policy.json 现在将包含以下内容
“secret-meta:get”: “rule:secret_non_private_read or rule:secret_project_creator or rule:secret_project_admin or rule:secret_acl_read”
“secret-meta:post”: “rule:admin_or_creator and rule:secret_project_match”
“secret-meta:put”: “rule:admin_or_creator and rule:secret_project_match”
“secret-meta:delete”: “rule:admin_or_creator and rule:secret_project_match”
通知与审计影响¶
如果支持,添加/修改 secret-metadata 应该作为审计事件。
Python 和命令行客户端影响¶
需要将以下命令添加到 CLI
密钥
Secret Metadata Update
Secret Metadatum Update
其他最终用户影响¶
无
性能影响¶
最小化
将向数据库添加一个新表。它将包括新的 alembic 脚本来创建新表及其关联关系。
其他部署者影响¶
部署者现在需要知道如何设置 quota_secret_meta,如果他们希望用户能够向密钥添加更少的 metadata 键。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
diazjf
- 其他贡献者
无
工作项¶
阶段 1:数据库更改 阶段 2:当前和新的 API 更改和测试 阶段 3:向 CLI 添加功能
依赖项¶
无
测试¶
必须为内部组件测试编写单元测试。必须编写功能测试来全面测试此新功能。
文档影响¶
Barbican API 和 Barbican Client 必须更新以包含这些更改。
参考资料¶
https://blueprints.launchpad.net/barbican/+spec/add-user-metadata https://blueprints.launchpad.net/python-barbicanclient/+spec/add-user-metadata