IAM AWS S3如何限制访问特定子文件夹?

9

我正在使用AWS S3组件来存储文件。

我有一个名为"mybucket"的桶,并且有以下文件夹:

+---Mybucket
\---toto1
\---toto2
+---toto3
|   \--- subfolder
|       \---subsubfolder
\---toto4

我有一些AWS控制台用户,只需要访问“toto3”文件夹。我试图限制对此文件夹的访问,但是用户必须有列出存储桶根目录的权限。如果我添加了访问根文件夹的附加权限,用户可以浏览“toto1”和“toto2”文件夹,而我不想要这样。我想配置如下:
- 授权列出我的S3账户中所有存储桶(listAllBuckets策略) - 授权列出存储桶根目录(如果用户可以看到目录名称,我也可以接受) - 拒绝访问除“toto3”以外的所有前缀存储桶 - 授权用户在“toto3”文件夹中执行所有操作 - 我不想编写包容性规则
我尝试了以下IAM策略,但没有成功:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": ["arn:aws:s3:::mybucket/toto3/*"]
        },
        {
            "Sid": "Stmt1457617383000",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket"
            ],
            "Resource": ["arn:aws:s3:::mybucket"]
        },
        {
            "Sid": "Stmt1457617230000",
            "Effect": "Deny",
            "Action": ["s3:*"],
            "Condition": {
                "StringNotLike": {
                    "s3:prefix": "toto3*"
                }
            },
            "Resource": [
                "arn:aws:s3:::mybucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
4个回答

16

这是一项适合您的政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket/toto3/*"
            ]
        },
        {
            "Sid": "Stmt1457617230000",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "",
                        "toto3/"
                    ]
                }
            },
            "Resource": [
                "arn:aws:s3:::mybucket*"
            ]
        }
    ]
}

详情:

  • ListAllMyBuckets是控制台所需的功能,它显示所有存储桶的列表。
  • toto3/路径下允许执行任何操作。
  • ListBucket(检索对象列表)在存储桶的根目录和toto3/路径中允许执行。

我已成功测试此解决方案。

AWS文档参考:允许用户访问Amazon S3中的个人“主目录”


另请参阅此链接:https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/ - citynorman
所以,"s3:prefix": [ "" ] 只允许在存储桶的根目录下执行 ListBucket 操作,即列出文件夹名称但不包括其内容,除非路径以 toto3/ 开头。这是正确的吗? - W.M.
3
不,这不正确。如果您使用"ls --recursive"命令,它会给出存储桶中所有文件的完整列表,显然这并不是所需的隔离行为。 - thebeancounter

2
我修改了您的代码,加入以下内容,现在它可以正常运行!谢谢!!
 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::mybucket/toto3/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::mybucket",
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "",
                        "toto3/",
                        "toto3*"
                    ]
                }
            }
        }
    ]
}

这允许您列出整个存储桶中的所有文件,这是您想要的行为吗? - thebeancounter

0

我需要授予外部供应商仅对存储桶下的一个子文件夹的访问权限。类似于:

bucket/folder/subfolder

以下是我完成此操作的方法:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::bucket/*",
                "arn:aws:s3:::bucket"
            ]
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "bucket/folder/subfolder/*",
                        "bucket/folder/subfolder/",
                        "bucket/folder/subfolder",
                        "folder/subfolder/*",
                        "folder/subfolder/",
                        "folder/subfolder",
                    ]
                }
            }
        }
    ]
}

您不需要在条件前缀中包含存储桶。 - Luke

-2

是否可以限制以下规则,但给予特定文件夹访问权限?我不希望用户在特定存储桶内看到目录名/文件夹名。

授权列出存储桶的根目录(如果用户看到目录名称,对我来说没问题)


请提出一个单独的问题。 - Brandon

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