是否可以让 "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
授予)。
我有一个结构如下的 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
授予)。