为可变通用容器资源添加支持

关联的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/barbican/+spec/api-containers-add-put

“通用”容器类型的最初意图是支持收集和引用任意密钥,类似于文件系统文件夹。因此,已经创建的“通用”容器在事后更改此集合是有意义的。此蓝图详细介绍了此 API 的外观。

问题描述

当前 Barbican 允许通过 POST 调用创建“通用”类型的容器,但一旦创建该容器,就无法修改它以更改其包含的密钥。 “通用”容器旨在成为收集相关密钥的一种便捷方式,因此应允许在创建后对其进行修改。

例如,持续集成和部署系统可能希望收集给定环境的所有密钥,例如数据库密码和访问令牌,以便在稍后在环境中创建服务器时由自动化脚本使用。如果每个环境都可以拥有自己的 Barbican 容器,自动化脚本可以引用该容器以检索密钥(通过其固定的密钥名称)作为启动该环境中服务器的一部分,这将非常方便。如果稍后密钥被轮换或更新,则可以在容器中更新给定密钥名称的密钥引用,而无需更新自动化脚本。

尝试更新其他类型的容器将被拒绝。

提议的变更

此蓝图要求为通用容器添加新的子资源。API 影响部分详细介绍了这些调用相对于客户端的外观。实际的服务实现很简单,允许客户端通过向“通用”容器中的子资源发送 POST 或 DELETE 请求来提供额外的密钥或删除单个密钥。

备选方案

先前接受但未实现的此蓝图的版本要求为容器添加 PUT 支持,客户端必须指定要保存在容器中的所有密钥。例如,在向现有容器添加密钥时,PUT 主体必须列出所有现有密钥以及新密钥。但是,在 Newton 周期中,我们讨论了这可能由于潜在的竞争条件而容易出错。

使用 PATCH 调用提供对容器的局部更新。这会增加 API 处理的复杂性,尤其是如果使用 JSONPatch [1]。如果认为此功能是必要的,则应将其作为单独的蓝图提出。

数据模型影响

无。

REST API 影响

以下文档指定了建议的容器子资源调用,用于从现有的“通用”类型容器中添加或删除密钥。

此调用的访问策略类似于容器资源的 POST 调用,因此具有 Barbican “管理员”或“创建者”角色的用户可以修改容器。

POST /v1/containers/{container_uuid}/secrets

将密钥添加到现有容器。仅支持通用容器。

请求属性

名称

类型

描述

name

string

(可选) 用于在容器内标识密钥的可读名称。

secret_ref

uri

(必需) 现有密钥的完整 URI 引用。

请求:
POST /v1/containers/{container_uuid}/secrets
Headers:
    X-Project-Id: {project_id}

Content:
{
    "name": "private_key",
    "secret_ref": "https://{barbican_host}/v1/secrets/{secret_uuid}"
}
响应:
{
    "container_ref": "https://{barbican_host}/v1/containers/{container_uuid}"
}

请注意,请求的“container_uuid”与响应中提供的“container_uuid”相同。

HTTP 状态码

通常,容器 POST 调用产生的错误代码也适用于此处,尤其是在可以提供的密钥引用方面。

代码

描述

201

容器成功更新

400

缺少 secret_ref

401

无效的 X-Auth-Token 或令牌没有对此资源的权限

DELETE /v1/containers/{container_uuid}/secrets

从容器中删除密钥。仅支持通用容器。

请求:
DELETE /v1/containers/{container_uuid}/secrets
Headers:
    X-Project-Id: {project_id}

Content:
{
    "name": "private key",
    "secret_ref": "https://{barbican_host}/v1/secrets/{secret_uuid}"
}
响应:
204 No Content
HTTP 状态码

代码

描述

204

成功从容器中删除密钥。

400

缺少 secret_ref

401

无效的 X-Auth-Token 或令牌没有对此资源的权限

404

指定的 secret_ref 在容器中未找到。

替代方案

或者,我们可以将密钥的删除定义为对包含 secret_uuid 作为 URI 部分的资源的调用,例如

DELETE /v1/containers/{container_uuid}/secrets/{secret_uuid}

但是,这将要求客户端解析密钥 URI 中的 UUID,才能构造正确的删除 URI。由于此原因,应实现上面描述的带有主体的 DELETE。

安全影响

拟议的更改不会带来安全影响,因为 (1) 它不会改变底层密钥或其访问限制,并且 (2) 只有“通用”类型的容器可以被修改,因此敏感的分组密钥,例如“证书”和“非对称”类型的容器仍然是不可变的。请参阅性能影响部分,了解有关限制此类蓝图提出的调用的速率限制的建议,以避免拒绝服务攻击。

通知与审计影响

拟议的新 POST 和 DELETE 容器请求应像任何其他 Barbican REST 调用一样被记录和审计,因此不需要在此蓝图中专门指出。

其他最终用户影响

Barbican Python 客户端也需要进行修改。

性能影响

由于此蓝图不需要任何加密操作,并且仅更改了对密钥的数据库引用,因此该提案对性能的影响应该很小。但是,该调用本身没有配额限制,因此部署者可能希望在其 Barbican API 节点前面使用速率限制应用程序,例如 Repose [2]。

其他部署者影响

不需要任何配置或依赖项更改来使用建议的操作,但如上文性能影响部分所述,如果部署了速率限制,则应限制容器资源上的 PUT 操作,以避免拒绝服务攻击。

开发人员影响

无。

实现

负责人

主要负责人

待定

其他贡献者

待定

工作项

实施此蓝图需要以下工作项

  1. 更新容器控制器以添加新的 POST 和 DELETE 子资源。

  2. etc/policy.json 中添加新的策略条目,用于新的操作

  3. 添加一个正向测试来修改“通用”类型的容器,并添加一个负向测试来证明非“通用”类型的容器无法被修改。

  4. 添加 Barbican Python 客户端对新功能的的支持。

  5. 为新的 POST 和 DELETE 操作添加 sphinx 文档。

依赖项

无。

测试

有关要测试的内容的详细信息,请参阅工作项部分。不需要特殊的第三方系统来测试建议的功能。

文档影响

有关要记录的内容的详细信息,请参阅工作项部分。

参考资料

[1] http://jsonpatch.com/ [2] http://openrepose.org/