18

我尝试上传到 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 中上传,或者我将在我的存储桶策略中添加的正确语句是什么,以便它可以授予我上传到我们的存储桶的权限?

4

4 回答 4

24

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())
        }
    })
})
于 2019-04-30T12:44:11.910 回答
9

要上传到 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)在哪里。

来源:编写 IAM 策略:如何授予对 Amazon S3 存储桶的访问权限

有关的:

于 2017-09-29T13:27:55.000 回答
8

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

{
    "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 代码,我可以帮助您在那里分配策略,但它与上述非常相似。

于 2013-10-17T11:30:21.547 回答
1

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

请享用 !没有更多的谷歌

于 2021-04-16T18:30:54.497 回答