Amazon web services 使用STS凭据通过CloudFront访问S3内容 总结

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的完美用例 有两个旁白来说明一些评

我有一个运行在AWS中的平台,它通过AWS Lambda支持的REST API公开。该平台在DynamoDB中存储元数据,在S3中存储内容。用户由Cognito进行身份验证,并存储在用户池中。平台管理权限以控制哪些用户可以访问(以及他们是否可以修改)哪些元数据(以及相关内容)

我可以使用STS将用户的JWT令牌交换为STS令牌(使用Cognito标识池),并授予他们读取或写入S3中特定对象的权限。创建STS令牌由平台处理。这在直接访问S3时非常有效,似乎是STS的完美用例

有两个旁白来说明一些评论:

  • 预签名的S3URL不够安全,因为任何具有链接的人都可以访问内容
  • 我必须直接上传到S3,因为我没有运行任何服务器,并且由于Lambda(512MB)中的临时空间限制以及请求可以通过API网关执行的时间(29秒),Lambda不适合流式传输我的内容
我想在S3 bucket前面添加CloudFront,以受益于其CDN功能;如果每次都可以从边缘服务内容,而不是从S3检索内容,这将降低数据传输成本。这就是我遇到的问题——我不知道如何将STS令牌发送到CloudFront,以便它将其传递到S3

问题:当S3存储桶由CloudFront前置时,如何使用STS凭据从其读/写?

进一步详情 我创建了两个角色,可以由STS承担。一个有
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以授予访问权限。约翰·罗滕斯坦和赫普伦普:我已经更新了我的问题以解决您的评论,我希望这能增加一些清晰度。