【问题标题】:Web app unable to access private s3 file even though IAM policy grants access即使 IAM 策略授予访问权限,Web 应用程序也无法访问私有 s3 文件
【发布时间】: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

标签: amazon-web-services amazon-s3 carrierwave policy amazon-iam


【解决方案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 的内容(用于凭据、区域等)。

我建议您采取以下步骤:

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

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

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

【讨论】:

猜你喜欢
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多