Amazon web services 使用STS凭据通过CloudFront访问S3内容 总结
我有一个运行在AWS中的平台,它通过AWS Lambda支持的REST API公开。该平台在DynamoDB中存储元数据,在S3中存储内容。用户由Cognito进行身份验证,并存储在用户池中。平台管理权限以控制哪些用户可以访问(以及他们是否可以修改)哪些元数据(以及相关内容) 我可以使用STS将用户的JWT令牌交换为STS令牌(使用Cognito标识池),并授予他们读取或写入S3中特定对象的权限。创建STS令牌由平台处理。这在直接访问S3时非常有效,似乎是STS的完美用例 有两个旁白来说明一些评论:Amazon web services 使用STS凭据通过CloudFront访问S3内容 总结,amazon-web-services,amazon-s3,amazon-cloudfront,aws-sts,Amazon Web Services,Amazon S3,Amazon Cloudfront,Aws Sts,我有一个运行在AWS中的平台,它通过AWS Lambda支持的REST API公开。该平台在DynamoDB中存储元数据,在S3中存储内容。用户由Cognito进行身份验证,并存储在用户池中。平台管理权限以控制哪些用户可以访问(以及他们是否可以修改)哪些元数据(以及相关内容) 我可以使用STS将用户的JWT令牌交换为STS令牌(使用Cognito标识池),并授予他们读取或写入S3中特定对象的权限。创建STS令牌由平台处理。这在直接访问S3时非常有效,似乎是STS的完美用例 有两个旁白来说明一些评
- 预签名的S3URL不够安全,因为任何具有链接的人都可以访问内容
- 我必须直接上传到S3,因为我没有运行任何服务器,并且由于Lambda(512MB)中的临时空间限制以及请求可以通过API网关执行的时间(29秒),Lambda不适合流式传输我的内容
s3:ListBucket
和一个有s3:PutObject
的。然后,我使用Postman在我的bucket上执行GET
和PUT
请求,指定来自STS的访问密钥、秘密密钥和会话令牌,并使用web identity
调用承担角色
这两个GET
和PUT
操作都在直接访问S3时起作用,但在使用CloudFront时都不起作用。有趣的是,对于get
和PUT
,我得到了不同的错误
从获取时出错:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>No AWSAccessKey was presented.</Message>
<RequestId><!-- snip --></RequestId>
<HostId><!-- snip --></HostId>
</Error>
来自放置的错误
:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<AWSAccessKeyId><!-- snip --></AWSAccessKeyId>
<StringToSign><!-- snip --></StringToSign>
<SignatureProvided><!-- snip --></SignatureProvided>
<StringToSignBytes><!-- snip --></StringToSignBytes>
<CanonicalRequest><!-- snip --></CanonicalRequest>
<CanonicalRequestBytes><!-- snip --></CanonicalRequestBytes>
<RequestId><!-- snip --></RequestId>
<HostId><!-- snip --></HostId>
</Error>
我已经从响应中删除了一些值,但如果有必要,可以提供它们。这当然是可能的,但您需要在CloudFront中进行大量更改,以将这些参数传递给s3,而不是进行更改,您可以使用CloudFront签名的url,这很容易。这是令人鼓舞的,这是可能的。您是否有配置所需步骤的链接?我认为签名的URL对我的用例不起作用,但我会重新阅读文档来验证这一点。。。如果凭据的权限范围符合您的要求,为什么不将凭据与aws sdk一起使用,并让应用程序直接与bucket一起工作,同时避免使用CloudFront?为什么希望使用STS凭据?你能编辑你的问题来描述你的场景吗?STS凭据通常不会传递给客户端。后端执行敏感操作更安全。在提供私有内容的情况下,后端可以生成签名URL以授予访问权限。John Rotenstein和hephalump:我已经更新了我的问题以解决您的评论,我希望这能增加一些清晰度。这当然是可能的,但您需要在CloudFront中进行大量更改,以将这些参数传递给s3,而不是更改它,您可以改为使用cloudfront签名url,这很容易。这是令人鼓舞的,这是可能的。您是否有配置所需步骤的链接?我认为签名的URL对我的用例不起作用,但我会重新阅读文档来验证这一点。。。如果凭据的权限范围符合您的要求,为什么不将凭据与aws sdk一起使用,并让应用程序直接与bucket一起工作,同时避免使用CloudFront?为什么希望使用STS凭据?你能编辑你的问题来描述你的场景吗?STS凭据通常不会传递给客户端。后端执行敏感操作更安全。在提供私有内容的情况下,后端可以生成签名URL以授予访问权限。约翰·罗滕斯坦和赫普伦普:我已经更新了我的问题以解决您的评论,我希望这能增加一些清晰度。