Secrets 的部署者特定元数据

蓝图:https://blueprints.launchpad.net/barbican/+spec/deployer-specific-secret-metadata

问题描述

部署者(服务管理员)可能需要能够向 Barbican Secret 添加额外数据,这些数据用户无法访问/修改。对于用户而言,这些数据必须是不可变的,但部署者应该能够更改它们。Secrets 包含不可变的元数据,例如 创建时间更新时间算法。部署者可能希望添加一些对用户来说也是不可变的数据。例如,部署者可能希望存储诸如 区域 之类的具体信息,以指示 Secret 的位置。

目前只能使用用户元数据,并且用户可以修改它[1]。

提议的变更

拟议的更改是向 Barbican Secrets 添加一个新的属性,以便存储部署者元数据。还必须创建一个新的 API 端点来操作元数据。

备选方案

  • 锁定元数据的用法,并让数据库管理员添加键和值。

数据模型影响

将创建一个名为 secret-deployer-metadata 的新表,其中包含 secret_idkeyvalue 列。

在数据库级别,还将对 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