首页 > 解决方案 > 仅允许向特定用户列出 S3 存储桶顶级列表

问题描述

设想:

我有一个 S3 存储桶,其中包含“目录”。

my-bucket/xxx
my-bucket/yyy
my-bucket/zzz
etc

我有 2 组用户:管理员和用户。

管理员应该能够列出/查看存储桶内的所有内容,即在顶层,例如aws s3 ls s3://my-bucket.

用户无法查看顶级,但可以列出/查看存储桶中的每个目录。

我不确定如何定义这样的策略以及将其附加到何处 - 在 S3 存储桶或 IAM 用户端。我已经尝试了这两种选择。不工作。

用户端:

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

S3 存储桶侧:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::my-bucket/*",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::123456789012:user/User"
                ]
            }
        }
    ]
}

标签: amazon-web-servicesamazon-s3amazon-iam

解决方案


首先,不要使用 Bucket Policy。当授予“每个人”访问权限时,通常使用存储桶策略。

如果您希望向特定用户授予访问权限,请将策略放在IAM User上。

如果您希望授予一组用户访问权限,请将他们放在 IAM Group 中,并将策略放在IAM Group上。

这是一个允许列出特定存储桶的策略,但顶级(根)目录除外:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::BUCKET-NAME",
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "*/*"
                    ]
                }
            }
        }
    ]
}

只要Prefix(路径)包含斜杠(/),它基本上就允许他们列出存储桶。

请注意,如果您要列出存储桶,则必须在目录名称后包含斜杠:

aws s3 ls s3://BUCKET-NAME/folder/

不起作用,因为它不包含斜杠:

aws s3 ls s3://BUCKET-NAME/folder

推荐阅读