使用回形针和 IAM 策略将文件上传到亚马逊时访问被拒绝



我无法使用 S3 IAM 策略上传回形针。我什至在直接jQuery上传时遇到问题(没有回形针(。我的方案如下,我有一个将具有许多站点的应用程序。每个站点都有自己的存储桶,并且只能访问自己的存储桶,而无法访问其他人的存储桶。IAM 示例策略文档在"示例:允许每个 IAM 用户访问存储桶中的文件夹"下准确解释了我想执行的操作。我为应用程序设置了一个 IAM 组,并且该组中的每个站点都有一个用户。这些 IAM 用户属于该组。该组的策略如下:

{
   "Version":"2012-10-17",
   "Statement":[{
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource":"arn:aws:s3:::my-app/${aws:username}/*"
      }
   ]
}

这是我在存储桶上的 CORS 配置,当然对于 dev,它稍后会被锁定:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

以下是我的回形针设置:

has_attached_file :background_image,
                  storage: :s3,
                  s3_credentials: {
                    access_key_id: "xxx",
                    secret_access_key: "xxx"
                  },
                  bucket: "my-app",
                  s3_permissions: "public-read",
                  path: "/background_images/:id/:filename"

我以前直接在存储桶上使用策略,这确实有效,但当我移动到具有许多"站点"的生产环境时,它并不像我需要的那样灵活。据我所知,我已经完全遵循了文档,但我所做的任何事情都会导致"访问被拒绝"。在这一点上,我什至不确定我的问题是否与我的 IAM 策略或回形针配置有关。

编辑:澄清。

编辑2:最终解决方案

以下是我基于本文的最终 IAM 策略:

{
 "Version":"2012-10-17",
 "Statement": [
   {
     "Sid": "AllowUserToSeeBucketListInTheConsole",
     "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::*"]
   },
  {
     "Sid": "AllowRootAndHomeListingOfCompanyBucket",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::my-app"],
     "Condition":{"StringEquals":{"s3:prefix":["","home/"],"s3:delimiter":["/"]}}
    },
   {
     "Sid": "AllowListingOfUserFolder",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::estimator-app"],
     "Condition":{"StringLike":{"s3:prefix":["home/${aws:username}/*"]}}
   },
   {
     "Sid": "AllowAllS3ActionsInUserFolder",
     "Effect": "Allow",
     "Action": ["s3:*"],
     "Resource": ["arn:aws:s3:::my-app/home/${aws:username}/*"]
   }
 ]
}

以及我更新的回形针设置:

has_attached_file :background_image,
                    storage: :s3,
                    s3_credentials: {
                      access_key_id: "xxx",
                      secret_access_key: "xxx"
                    },
                    bucket: "estimator-app",
                    s3_permissions: "public-read",
                    path: "/home/my_s3_username/background_images/:id/:filename"

回形针路径中包含用户名非常重要。我假设亚马逊会从凭据中推断出这一点,但事实并非如此。

由于您尝试对上传的对象设置权限,因此还需要向 IAM 用户授予s3:PutObjectAcl权限。

相关内容

  • 没有找到相关文章

最新更新