问题描述
TL; DR 如何使用S3兼容性层自动创建每用户凭据以访问COS存储桶?
唯一记录的AFAIK方式是CLI。但是将命令行执行嵌入到Web服务中并不是很吸引人!
针对COS (云对象存储)的IBM在线文档显示了两种为给定存储桶和给定角色 [reference]创建“具有HMAC凭证的服务密钥”的方法。
- 通过管理界面
- 使用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(即非人类用户)。当您通过使用这些密钥创建签名来发送S3 API请求时,COS会找出关联的服务ID并与IAM一起检查以查看该身份是否具有足够的特权来执行所请求的操作。这使您可以使用持久性HMAC密钥,但需要浪费一些CPU为每个请求计算所有HMAC签名内容。因此,虽然IAM在策略执行级别处于幕后工作,但身份验证直接由COS处理。
现在,如果您要以编程方式创建服务凭证,则有一个REST API,但没有已发布的库(尽管我想您可以尝试从OpenAPI规范中生成一个)。本质上,您只需调用该API并在{"HMAC":true}
对象内提供"Parameters"
位。在响应中,您将找到带有HMAC密钥的凭据。
所有这些,您不想为应用程序的最终用户使用IAM令牌或HMAC签名。考虑一下您作为执行操作的执行者已绑定到HMAC凭证的服务ID。尝试使用户身份验证部分保持隔离,然后在允许某些最终用户执行某项操作时,让服务ID进行操作。显然,所有应用程序都将有所不同并面临各自的挑战。我们已经看到使用的一种模式(我一直打算为之编写教程)是让应用程序生成一个预签名的URL,并将其传递给客户端,从而避免了在应用程序空间之外传递凭据的任何需要。
IAM基本上是供管理员,开发人员和其他云服务用来对IBM Cloud中的操作进行身份验证和授权的(因此不打算扩展成千上万个访问策略),但是您应该寻找一些东西像App ID这样的最终用户身份验证片。
您使用的是哪种语言/框架?您是否在使用COS SDK?如果您想使用API密钥,它们会为您抽象化令牌管理内容。