向 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_idkeyvalue 列。

这具有以下好处

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