如何为S3存储桶设置策略,允许经过身份验证的用户列出存储桶或获取存储桶中的任何文件?

41

我在存储桶上设置了一个权限,允许“已认证的用户”对我创建的存储桶进行列表、上传和删除操作。这似乎允许我将文件上传到存储桶中,但似乎没有覆盖从存储桶中下载文件的权限,我需要为存储桶定义一个策略。我不清楚如何设置这样的策略。我尝试了策略生成器,并根据我所填写的内容做出了最佳猜测,但当我将其作为新策略粘贴到存储桶中时,结果并不是一个有效的策略(它以消息“Action does not apply to any resource(s) in statement - Action "s3:ListBucket" in Statement "Stmt-some-number"”失败)。请问有人可以解释一下以下策略存在什么问题,以及如何正确地设置它以允许经过身份验证的用户检索存储桶中的文件吗?

{
  "Id": "Policy-some-number",
  "Statement": [
    {
      "Sid": "Stmt-some-number",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}
4个回答

93

s3:GetObject适用于存储桶中的对象,因此资源是正确的:"Resource": "arn:aws:s3:::my-bucket/*"

s3:ListBucket适用于存储桶本身,因此资源应为"Resource": "arn:aws:s3:::my-bucket"

您得到的策略应如下所示:

{
  "Id": "Policy-some-number",
  "Statement": [
    {
      "Sid": "Stmt-some-number",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    },
    {
      "Sid": "Stmt-some-other-number",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}

2
这是否意味着您必须为“s3:GetObject”和“s3:ListBucket”使用单独的“Statement”? - Tjunkie
4
是的,因为“资源”不同。 - c4urself
3
事实是不正确的,资源可以被“合并”,只需使用 [ ] 将两者作为列表连接即可。 - mootmoot
6
感谢您的解释和点赞。我很难以置信,在花费了一个多小时并阅读了几份AWS文档后,这个问题仍然不清楚。即使策略生成器也错了。 - SaxDaddy
3
我赞同 @SaxDaddy 的观点——亚马逊自己的政策生成器是错误的。 - Jake Evans
错过了 /,导致在我的情况下出现了 "Action does not apply to any resource(s) in statement (Service: Amazon S3; Status Code: 400; Error Code: MalformedPolicy;" 错误。通过同时使用带有 / 和不带 /* 的两个语句解决。 - Tobi

42

仅对@c4urself的答案进行赞扬。答案也帮助解决了我的问题,但是AWS文档中有一些指示,您可以添加多个资源,只需使用[]将它们组成列表。 http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-endpoints.html#vpc-endpoints-s3-bucket-policies

{
  "Statement": [
    {
      "Sid": "Access-to-specific-bucket-only",
      "Principal": "*",
      "Action": [
        "s3:ListBucket",
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::my_secure_bucket",
                   "arn:aws:s3:::my_secure_bucket/*"]
    }
  ]
}

1
更新存储桶策略如下:
{
"Version": "2012-10-17",
"Id": "Policy1546023103427",
"Statement": [
    {
        "Sid": "Stmt1546023101836",
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "s3:ListBucket",
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::usagereports-atul",
            "arn:aws:s3:::usagereports-atul/*"
        ]
    }
]

}


4
这个回答与过去4年发布的其他回答有何不同?你没有解释,提供的配置也似乎与原始问题无关。 - miken32

0

只需创建资源和资源数组/列表,并向列表添加一个项目,其中/* 适用于 arn:aws:s3:::my_secure_bucket/*。请参见下面的示例:

 "Resource": ["arn:aws:s3:::my_secure_bucket",
               "arn:aws:s3:::my_secure_bucket/*"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接