即使 IAM 策略授予访问权限,Web 应用程序也无法访问私有 s3 文件

Posted

技术标签:

【中文标题】即使 IAM 策略授予访问权限,Web 应用程序也无法访问私有 s3 文件【英文标题】:Web app unable to access private s3 file even though IAM policy grants access 【发布时间】:2015-05-02 18:00:22 【问题描述】:

我正在使用 CarrierWaveDirect 将高分辨率图像上传到 s3。然后,我使用该图像来处理通过 Cloudfront url 公开的多个版本。

上传的高分辨率文件需要对匿名用户保密,但网络应用程序需要访问该私有文件才能对其他版本进行处理。

我目前正在通过 CarrierWave 初始化程序将所有上传的文件设置为私有

config.fog_public = false

我有一个允许完全管理员访问权限的 Web 应用程序的 IAM 策略。我还在应用程序中为该 IAM 用户设置了 ACCESSKEY 和 SECRETKEY。鉴于这两个标准,我认为 Web 应用程序可以访问私有文件并继续处理,但它被拒绝访问私有文件。

*当我登录到与 Web 应用关联的用户帐户时,我可以访问私有文件,因为在 URL 上添加了一个令牌。

我无法弄清楚为什么应用程序无法访问给定 ACCESSKEY 和 SECRRETKEY 的私人文件

【问题讨论】:

您看到的确切错误消息是什么? @messages=:image=>["无法下载文件:403 Forbidden"]> 如原帖所述,当我以与 Web 应用凭证对应的用户身份登录时,我可以在 AWS 控制台中查看私有文件 我想我的答案可能在于添加查询参数以验证请求docs.aws.amazon.com/AmazonS3/latest/API/… 这个要点是正确的,但与当前的 AWS 查询要求已经过时gist.github.com/iwasrobbed/1032395 【参考方案1】:

我很难解决您的问题。我很确定你的问题不是

即使 IAM 策略授予访问权限,也无法访问私有 s3 文件

而是

如何手工制作预签名 URL 以在 S3 上获取私有文件

要点表明您正在尝试自己为 GET 创建预签名 URL。虽然这很好,但它也非常容易出错。

请使用适用于 Ruby 的 AWS 开发工具包验证您正在尝试执行的操作是否有效(我仅在此处发布了已知可与版本 1 一起使用的代码,但如果您没有被遗留代码阻碍,请从第 2 版):

s3 = AWS::S3.new
bucket = s3.buckets["your-bucket-name"]
obj = bucket.objects["your-object-path"]
obj.url_for(:read, expires: 10*60) # generate a URL that expires in 10 minutes

有关详细信息,请参阅 AWS::S3::S3Object#url_forAws::S3::Object#presigned_url 的文档。

您可能需要阅读有关将 args 传递给 AWS::S3.new here 的内容(用于凭据、区域等)。

我建议您采取以下步骤:

    使用access_key_idsecret_access_key 使其在本地工作 让它在你的员工身上发挥作用 如果可行,您可以将 SDK 返回的查询字符串与您自己手工制作的查询字符串进行比较。也许您可以发现错误。

但无论如何,我建议您使用更高级别的 SDK 为您做类似的事情。

如果这对您没有任何帮助,请发表评论并附上您的新发现。

【讨论】:

我得到了你提到的使用签名 URL 的东西。 ***.com/questions/30011035/… @jeff_horsch 如果对您有帮助,请接受此答案。谢谢!

以上是关于即使 IAM 策略授予访问权限,Web 应用程序也无法访问私有 s3 文件的主要内容,如果未能解决你的问题,请参考以下文章

S3 存储桶策略授予/限制对特定联合用户的访问权限

AWS-IAM:授予对单个存储桶的访问权限

IAM 权限策略是不是可以用于允许访问跨账户资源?

Amazon Web Service S3 Access Denied with 看似不错的 IAM 策略

授予用户对所有外部存储桶的访问权限,但排除我们自己的帐户存储桶

如何授予 IAM 组访问除创建新用户之外的所有内容的权限?