【问题标题】:AWS S3 deny access to objects based on user nameAWS S3 根据用户名拒绝访问对象
【发布时间】:2021-11-24 01:01:35
【问题描述】:

aws 账户中有多个 S3 存储桶。所有用户都被分配了一个组策略,该策略为 S3 提供所有访问权限。

但现在的要求是 -> 有一个 S3 存储桶,应该限制所有用户的访问。在此存储桶中,有根据 aws 用户名的文件夹。用户应该只能访问具有她的用户名的文件夹中的对象。该用户应具有该特定文件夹的所有权限,并且该用户不应能够访问具有其他用户名的文件夹。

所有 S3 存储桶:存储桶 1 、存储桶 2 到存储桶 10

特定存储桶:bucket3

特定存储桶中的对象:bucket3/report/user={user_name}
ex : bucket3/report/user=user1 ,bucket3/report/user=user2

要求:

  • user1 里面有list、put、delete 对象-> bucket3/report/user=user1
  • user1 无法访问 bucket3/report/user=user2

以下是我们创建的策略。此政策禁止访问所有 S3 存储桶。

{​​​​
    "Version": "2012-10-17",
    "Statement": [
        {​​​​
            "Sid": "AllowGroupToSeeBucketListInTheConsole",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        }​​​​,
        {​​​​
            "Sid": "AllowRootAndHReportListingOfBucket",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::bucket3"
            ],
            "Condition": {​​​​
                "StringEquals": {​​​​
                    "s3:prefix": [
                        "",
                        "report/"
                    ],
                    "s3:delimiter": [
                        "/"
                    ]
                }​​​​
            }​​​​
        }​​​​,
        {​​​​
            "Sid": "DenyListingOfOtherUserFolder",
            "Action": [
                "s3:*"
            ],
            "Effect": "Deny",
            "Resource": [
                "arn:aws:s3:::bucket3"
            ],
            "Condition": {​​​​
                "StringNotLike": {​​​​
                    "s3:prefix": [
                        "report/user=${​​​​aws:username}​​​​/*",
                        "report/user=${​​​​aws:username}​​​​"
                    ]
                }​​​​
            }​​​​
        }​​​​,
    ]
}​​​​

aws insufficient permission

由于我是 aws 新手,我无法解决问题。我应该如何更新政策才能满足要求?

提前致谢

【问题讨论】:

  • 如果您还没有使用单独的帐户进行隔离,您应该考虑一下。 AWS 现在正在推动这一战略,而且效果很好。

标签: amazon-web-services amazon-s3 amazon-iam aws-policies


【解决方案1】:

没有必要使用“拒绝”。相反,使用 IAM 政策变量

来自IAM policy elements: Variables and tags - AWS Identity and Access Management

考虑编写一个策略,允许每个用户访问他或她自己的 Amazon S3 存储桶中的对象,如前面的示例所示。但不要为每个用户创建单独的策略,明确指定用户名作为资源的一部分。相反,创建一个适用于该组中任何用户的单一组策略。

您可以通过使用策略变量来做到这一点,该功能可让您在策略中指定占位符。评估策略时,策略变量将替换为来自请求本身上下文的值。

以下示例显示了使用策略变量的 Amazon S3 存储桶的策略。

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

【讨论】:

    【解决方案2】:

    幸运的是,您获得的 IAM 权限越精细,您可以拒绝的次数就越多,拒绝是隐式的,而允许是显式的。给定每个 s3 存储桶的一般 s3 管理员权限,假设 IAM 策略具有类似 Resources: [*] 的内容,那么明确拒绝每个人都将覆盖管理员权限明确允许。

    但是,该 s3 存储桶中没有实际的 目录。您在控制台中看到的目录只是一种表示形式,但对于 s3,每个对象都由完整键定义 - 它的所有部分。

    但是您可以使用通配符拒绝对特定资源的操作,并且在 s3 中,您可以将密钥添加到 IAM 策略的资源部分以进行拒绝。

    因此,理论上,您可以编写一个 IAM 策略,拒绝给定存储桶中的所有内容,然后显式允许给定用户访问他们的“目录”作为资源通配符的一部分。

    类似这样的伪代码:

    { 
       Actions: Deny s3:*
       Resources: [arn:of:your:s3:bucket]
    }
    {
       Actions: Allow s3:*
       Principle: [Arn:of:user:account]
       Resources: [arn:of:your:s3:bucket/userdirectory/*]
    }
    

    请记住以上是伪代码,不会按原样工作;) - 另外我还没有直接测试过。然而,我确实知道,即使使用 s3:* 允许对帐户中的所有内容执行操作,我也通过明确拒绝每个人访问 s3 存储桶并忘记给予任何许可来阻止 s3 存储桶:P 获取 aws root 访问权限来修复!

    然而,事实上,这是一个 hack,您最好删除资源的管理员权限:[*] 并根据每个存储桶集的明确需求创建单独的策略,利用组/策略/角色多重结构,可以轻松地向任何给定用户提供对任何给定存储桶(或更多)的访问权限。

    另一种选择是使用 s3 中文件的 ACL 控件。这些控件之一将 s3 中任何给定对象的访问权限限制为上传它的用户,从而阻止所有其他用户访问它。 (包括服务)无法修改对象的 ACL。如果您确实不想关闭对所有 s3 存储桶的广谱访问,则可以隐式拒绝 ACL 修改。

    【讨论】:

      猜你喜欢
      • 2020-08-27
      • 2017-12-24
      • 2021-11-06
      • 2018-03-17
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      相关资源
      最近更新 更多