【问题标题】:IAM AWS S3 to restrict to a specific sub-folderIAM AWS S3 限制到特定的子文件夹
【发布时间】:2016-06-26 22:36:28
【问题描述】:

我正在使用 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": [
                "*"
            ]
        }
    ]
}

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

    以下是适合您的政策:

    {
        "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/ 路径内允许的任何操作。
    • 存储桶根目录和toto3/ 路径中允许ListBucket(检索对象列表)。

    我成功测试了这个解决方案。

    AWS 文档参考:Allow Users to Access a Personal "Home Directory" in Amazon S3

    【讨论】:

    • 所以"s3:prefix": [ "" ] allows ListBucket` 仅在存储桶的根级别,即列出文件夹名称而不是其内容期望以toto3/ 开头的路径?对吗?
    • @W.M.不,这是不正确的,如果您使用 ls --recursive 它将为您提供存储桶中的整个文件列表,这显然不是想要的隔离行为
    【解决方案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*"
                        ]
                    }
                }
            }
        ]
    }
    

    【讨论】:

    • 这可以让您列出整个存储桶中的所有文件,这是想要的行为吗?
    【解决方案3】:

    我只需要授予外部供应商访问文件夹下的子文件夹的权限,即存储桶下的子文件夹 (!!!)。像这样的:

    存储桶/文件夹/子文件夹

    我是这样完成的:

    {
        "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",
                        ]
                    }
                }
            }
        ]
    }
    

    【讨论】:

    • 条件前缀中不需要有bucket。
    【解决方案4】:

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

    自动列出存储桶的根目录(如果用户看到目录名称,我可以)

    【讨论】:

      猜你喜欢
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      相关资源
      最近更新 更多