IBM Cloud:通过 API 为存储桶创建与 S3 兼容的凭证
IBM Cloud: creating S3-compatible creds for a bucket via API
TL;DR 我们如何使用 S3 兼容层自动创建每用户凭据以访问 COS 存储桶?
AFAIK 唯一记录的方式是 CLI;但是在 Web 服务中嵌入命令行执行并不是很吸引人!
COS 的 IBM 在线文档 (云对象存储) 显示了为给定存储桶和给定角色创建“具有 HMAC 凭证的服务密钥”的 2 种方法 [reference]
- 来自管理员UI
- 使用 CLI >>
ibmcloud resource service-key-create ****** --parameters '{"HMAC":true}'
这些“HMAC 凭据”的要点是访问存储桶,就好像它存储在 S3 中一样(或与 S3 兼容的任何其他设备 API)。
现在,我假设 UI 和 CLI 都在幕后使用 某种 API。也许他们必须兼顾 IAM API 和 COS API 以将特定于 COS 的功能公开为“通用”安全功能。
但我在 IAM API 的在线文档中找不到任何相关内容——唯一指定“资源”和“授权策略”的 API 调用是关于创建一个临时令牌,不是永久密钥 [reference]
我在 COS API 中也找不到任何相关内容。那里没有安全问题。
如果它是开源的,我会尝试深入研究 CLI 的源代码,但遗憾的是,它不是。
我想我唯一的希望是从实际开发 CLI 的 IBM 人那里获得“内部信息”...因此有下面的标签。
因此,当您使用 HMAC 密钥创建服务凭证时,实质上发生的事情是这些持久密钥由 COS(而非 IAM)生成并绑定到 IAM 服务 ID(即 non-human 用户)。当您通过使用这些密钥创建签名来发送 S3 API 请求时,COS 计算出关联的服务 ID 并与 IAM 检查该身份是否具有足够的权限来执行所请求的操作。这允许您使用持久的 HMAC 密钥,但需要浪费一些 CPU 计算每个请求的所有 HMAC 签名内容。因此,虽然 IAM 在策略执行级别的幕后参与,但身份验证由 COS 直接处理。
现在,如果您想以编程方式创建服务凭证,有一个 REST API,但没有已发布的库,(尽管我想您可以尝试从 OpenAPI 规范生成一个).本质上,您只需调用 API 并在 "Parameters"
对象中提供 {"HMAC":true}
位。在响应中,您会找到带有 HMAC 密钥的凭据。
综上所述,您不想为应用程序的最终用户使用 IAM 令牌或 HMAC 签名。将您绑定到 HMAC 凭证的服务 ID 视为正在执行的操作的执行者。尝试隔离用户身份验证部分,然后当允许某些最终用户执行某些操作时,让服务 ID 执行操作。显然,所有的应用程序都会有所不同,并有自己的挑战。我们已经看到使用的一种模式(我一直想为之编写教程)是让应用程序生成 pre-signed URL,并将其传递给客户端,避免任何需要传递应用程序外部的凭据 space.
基本上,IAM 旨在供管理员、开发人员和其他云服务在 IBM Cloud 中验证和授权操作(因此不打算扩展到超过几千个访问策略),但您应该看看end-user authz 作品的 App ID 之类的东西。
你在用什么language/framework?您使用的是 COS SDK 吗?如果您更愿意使用 API 密钥,他们会为您抽象出令牌管理内容。
TL;DR 我们如何使用 S3 兼容层自动创建每用户凭据以访问 COS 存储桶?
AFAIK 唯一记录的方式是 CLI;但是在 Web 服务中嵌入命令行执行并不是很吸引人!
COS 的 IBM 在线文档 (云对象存储) 显示了为给定存储桶和给定角色创建“具有 HMAC 凭证的服务密钥”的 2 种方法 [reference]
- 来自管理员UI
- 使用 CLI >>
ibmcloud resource service-key-create ****** --parameters '{"HMAC":true}'
这些“HMAC 凭据”的要点是访问存储桶,就好像它存储在 S3 中一样(或与 S3 兼容的任何其他设备 API)。
现在,我假设 UI 和 CLI 都在幕后使用 某种 API。也许他们必须兼顾 IAM API 和 COS API 以将特定于 COS 的功能公开为“通用”安全功能。
但我在 IAM API 的在线文档中找不到任何相关内容——唯一指定“资源”和“授权策略”的 API 调用是关于创建一个临时令牌,不是永久密钥 [reference]
我在 COS API 中也找不到任何相关内容。那里没有安全问题。
如果它是开源的,我会尝试深入研究 CLI 的源代码,但遗憾的是,它不是。
我想我唯一的希望是从实际开发 CLI 的 IBM 人那里获得“内部信息”...因此有下面的标签。
因此,当您使用 HMAC 密钥创建服务凭证时,实质上发生的事情是这些持久密钥由 COS(而非 IAM)生成并绑定到 IAM 服务 ID(即 non-human 用户)。当您通过使用这些密钥创建签名来发送 S3 API 请求时,COS 计算出关联的服务 ID 并与 IAM 检查该身份是否具有足够的权限来执行所请求的操作。这允许您使用持久的 HMAC 密钥,但需要浪费一些 CPU 计算每个请求的所有 HMAC 签名内容。因此,虽然 IAM 在策略执行级别的幕后参与,但身份验证由 COS 直接处理。
现在,如果您想以编程方式创建服务凭证,有一个 REST API,但没有已发布的库,(尽管我想您可以尝试从 OpenAPI 规范生成一个).本质上,您只需调用 API 并在 "Parameters"
对象中提供 {"HMAC":true}
位。在响应中,您会找到带有 HMAC 密钥的凭据。
综上所述,您不想为应用程序的最终用户使用 IAM 令牌或 HMAC 签名。将您绑定到 HMAC 凭证的服务 ID 视为正在执行的操作的执行者。尝试隔离用户身份验证部分,然后当允许某些最终用户执行某些操作时,让服务 ID 执行操作。显然,所有的应用程序都会有所不同,并有自己的挑战。我们已经看到使用的一种模式(我一直想为之编写教程)是让应用程序生成 pre-signed URL,并将其传递给客户端,避免任何需要传递应用程序外部的凭据 space.
基本上,IAM 旨在供管理员、开发人员和其他云服务在 IBM Cloud 中验证和授权操作(因此不打算扩展到超过几千个访问策略),但您应该看看end-user authz 作品的 App ID 之类的东西。
你在用什么language/framework?您使用的是 COS SDK 吗?如果您更愿意使用 API 密钥,他们会为您抽象出令牌管理内容。