【发布时间】:2020-07-19 02:10:11
【问题描述】:
我一直在开发环境中实现 AWS S3 与 C# AWS 开发工具包的集成,一切进展顺利。部分要求是 IAM AccessKey 和 SecretKey 轮换,凭证/配置文件存储或缓存,并且在此过程中还需要承担角色。
我有一个方法,它在使用 AccessKey、SecretKey 和 RegionEndpoint 初始化 AmazonSecurityTokenServiceClient 后返回凭据,使用 RoleArn 格式化 AssumeRoleRequest,然后执行请求:
using (var STSClient = new AmazonSecurityTokenServiceClient(accessKey, secretKey, bucketRegion))
{
try
{
var response = STSClient.AssumeRole(new AssumeRoleRequest(roleARN));
if (response.HttpStatusCode == System.Net.HttpStatusCode.OK) return response.Credentials;
}
catch (AmazonSecurityTokenServiceException ex)
{
return null;
}
}
这很简单,因为真正的实现会验证凭证变量等。它与 AWS 开发人员代码示例相匹配(尽管我再也找不到该页面的链接了)。
这在开发中运行得很好。将其移至具有新 AWS 凭证的 QA 环境后,我确信已在与开发凭证相同的过程中设置了该凭证,现在我在 AssumeRole 调用中收到异常。
实际的 AssumeRole 方法不包括它会抛出该异常的文档,它只是它引发的那个。 StatusCode:403 Forbidden,ErrorCode:SignatureDoesNotMatch,ErrorType:Sender,消息“我们计算的请求签名与您提供的签名不匹配......”。
我已经排除的事情:
键正确且不包含转义字符 (/) 或前导/尾随空格
bucket 区域是正确的 us-west-2
sts 身份验证区域是 us-east-1
SignatureVersion 为 4
切换回开发密钥有效,但这不是一个生产友好的解决方案。最终,我不会负责密钥或创建密钥的 Aws 帐户。我已经与创建帐户/密钥/角色的 IT 管理员保持联系,他向我保证,它们的创建方式与我创建开发帐户/密钥/角色的方式相同(这是开发之前商定的流程)。
可以通过 CLI 或 Web 控制台访问提供的帐户/密钥/角色,因此我可以确认它们有效并且处于活动状态。我一直努力不让任何 CLI 创建的凭据或配置文件在 sdk 默认情况下可能访问。
欢迎提出任何想法或建议。
【问题讨论】:
-
您已成功授权,您的密钥是正确的,但它可能缺少访问某些资源所需的范围,这正是 403 的含义。
-
嗯,密钥是正确的,这让人放心。关于范围,我认为 RoleARN 会定义它。在获取假定的角色凭据时,它不知道将请求什么资源(在这种情况下是预签名的 url)。有一个属性可以定义一个策略,但是这个角色有完全的访问权限,所以这有点违反直觉。
标签: amazon-web-services amazon-s3