【问题标题】:Access Denied upload to s3访问拒绝上传到 s3
【发布时间】:2013-10-25 20:13:50
【问题描述】:

我尝试上传到 s3,当我看到来自 s3 存储桶日志的日志时,这就是它所说的:

mybucket-me [17/Oct/2013:08:18:57 +0000] 120.28.112.39 
arn:aws:sts::778671367984:federated-user/dean@player.com BB3AA9C408C0D26F 
REST.POST.BUCKET avatars/dean%2540player.com/4.png "POST / HTTP/1.1" 403 
AccessDenied 231 - 132 - "http://localhost:8080/ajaxupload/test.html" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17" -

我的访问被拒绝。从它指向的地方,我认为我唯一错过的是添加存储桶策略。所以这里。

使用我的电子邮件,我可以登录我的应用并上传头像。我要放置头像的存储桶名称是 mybucket-me,它有一个名为 avatars 的子存储桶。

-mybucket-me
 -avatars
  -dean@player.com //dynamic based on who are logged in
   -myavatar.png //image uploaded

如何添加存储桶策略,以便我可以授予像我这样的联盟在 s3 中上传我要添加的正确语句是什么在我的存储桶策略上,以便它可以授予我上传到我们的存储桶的权限?

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon policy bucket


    【解决方案1】:

    您可以将以下策略附加到存储桶:

    {
        "Version": "2008-10-17",
        "Id": "Policy1358656005371",
        "Statement": [
            {
                "Sid": "Stmt1354655992561",
                "Effect": "Allow",
                "Principal": {
                    "AWS": [
                        "arn:aws:sts::778671367984:federated-user/dean@player.com"                  
                    ]
                },
                "Action": [
                    "s3:List*",
                    "s3:Get*"
                ],
                "Resource": [
                    "arn:aws:s3:::my.bucket",
                    "arn:aws:s3:::my.bucket/*"
                ]
            }
        ]
    }
    

    授予联合用户 dean@player.com 对“my.bucket”的只读权限。

    这个策略不是很容易维护,因为它特别命名了这个用户。要以更具可扩展性的方式仅向某些联合身份用户授予访问权限,最好在调用 GetFederationToken 时执行此操作。如果您发布您的 STS 代码,我可以帮助您在那里分配策略,但它与上述非常相似。

    【讨论】:

    • 嗨,很抱歉回复晚了。我使用 s3 浏览器上传,我们有一个我们调用的 API,它为我们提供凭据。这是一个链接,其中发布了几乎所有相关代码。 link
    • 只有“列出并获取”的操作可以吗?我想做的是上传或发布方法。另外,我需要的正确方法是可扩展的方式,不同的用户将在存储桶上上传。请帮忙。
    • 您需要将操作更改为您需要的任何内容,只需“s3:*”即可让您访问所有 S3 操作。您使用什么语言?发布您到目前为止的代码
    • 嗨 prestomation,我正在使用 javascript+jquery Ajax。这是我所有相关源代码的链接。请click
    • 请注意 s3:* 访问权限也会授予您 DeleteBucket 权限。将该操作限制在存储桶中的特定键应该可以防止实际删除存储桶,但这仍然是一种不好的做法。
    【解决方案2】:

    要上传到 S3 存储桶,您需要添加/创建 IAM/组策略,例如:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": ["arn:aws:s3:::test"]
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject"
          ],
          "Resource": ["arn:aws:s3:::test/*"]
        }
      ]
    }
    

    arn:aws:s3:::test 是您的 Amazon 资源名称 (ARN)。

    来源:Writing IAM Policies: How to Grant Access to an Amazon S3 Bucket

    相关:

    【讨论】:

    【解决方案3】:

    2019+

    您现在必须:

    • 阻止新的公共 ACL 和上传公共对象设置为 false如果您的项目是公共的(图片中左上角的策略)李>

    • 上传图片时设置acl: 'private'如果你的项目是私有的

    Node.js 中的示例:

    const upload = multer({
        storage: multerS3({
            s3: s3,
            bucket: 'moodboard-img',
            acl: 'private',
            metadata: function (req, file, cb) {
                cb(null, {fieldName: file.fieldname});
            },
            key: function (req, file, cb) {
                cb(null, Date.now().toString())
            }
        })
    })
    

    【讨论】:

    • 我遇到了同样的问题,将 acl 更改为 private 对我有用。谢谢:D
    【解决方案4】:

    如果您在任何服务器上使用凭证或 aws-sdk 进行编程访问,请尝试评论 ACL:public-read 如果 IAM 已经拥有 (crud) 本身的权限,则一切正常,无需任何更改

    享受吧!没有更多的谷歌

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 2021-12-26
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多