是否可以让 "Allow" 效果覆盖 "Deny"?

Is it possible to have an "Allow" effect override a "Deny"?

我有一个结构如下的 S3 存储桶:

top_level_name
  sub_level_1
  sub_level_2
  sub_level_3

我想全面拒绝 top_level_name 上的所有操作(以排除本来可以访问此存储桶的 IAM 策略),并有选择地允许特定用户访问他们各自的 sub_levels。最初我认为该政策可能类似于:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyTopLevel",
            "Action": [
                "s3:*"
            ],
            "Effect": "Deny",
            "Resource": "arn:aws:s3:::test-bucket/top_level_name/*",
            "Principal": "*"
        },
        {
            "Sid": "AllowSubLevel1",
            "Action": [
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::test-bucket/top_level_name/sub_level_1/*",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::12345:user/my_user_account"
                ]
            }
        }
    ]
}

在执行过程中,Allow 似乎无法取代 Deny。有什么方法可以重写我的存储桶策略来实现这种模式?

没有。 Deny 总是覆盖 Allow.

但是,如果您只是删除第一个 Deny 部分,就可以满足您的用例。这是因为默认情况下,用户没有权限。因此,除非策略明确允许,否则他们无权 PutObject 在顶层。

策略的第二部分授予较低级别的权限,这正是您想要的。

如果您有其他策略授予对顶级的访问权限(例如通过 * 策略),那么您将需要重新考虑您的其他策略(例如将此存储桶从他们的存储桶中排除) Allow 授予)。