我有一个ID为11111的AWS账户,我想拒绝访问存储桶所属的同一账户的s3存储桶的某些部分,即使访问该对象的角色具有完全的s3访问权限。
据我了解,在s3存储桶策略上设置DENY规则应该这样做,所以我尝试了下面的s3策略
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Deny",
"Principal": {
"AWS": "arn:aws:iam::111111:root"
},
"Action": [
"s3:PutObject",
"s3:GetObjectVersion",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::mybucket/production/*"
]
}
]
}
然而,与s3存储桶位于同一帐户的ec2计算机具有允许完全访问存储桶(s3:*)的iam角色,仍可以写入/读取mybucket/production/*
我错过了什么吗? DENY桶规则不应该优先吗?如何处理这种情况?我想避免必须从ec2角色中删除完整访问权限,而是能够否认这一点。
答案 0 :(得分:1)
我相信以下内容正在进行中:
1>帐户111111拥有S3桶和IAM实体(在这种情况下是IAM角色)。
2 - ;由于请求来自同一帐户(存储桶拥有者)中的IAM角色,因此S3只会检查“User Context”。
3>在评估“用户上下文”时,S3会考虑: *附加到IAM角色的政策 *铲斗政策 *存储桶和对象ACL(如果有)
4>通过IAM角色的权限策略允许该请求,并且IAM角色没有明确的拒绝,因为存储桶策略中的Principal实际上是"Root User"而不是覆盖111111帐户中的IAM实体,因为两个帐户(存储桶)所有者和111111)是一样的。
我测试了这个并使用类似的策略,我的Root用户无法删除或将对象上传到存储桶中。但是,root可以通过删除存储桶策略来获取访问权限。
正如@John Hanley所提到的,您可以使用IAM角色作为委托人来拒绝生产“文件夹”中的访问权限,但由于该角色具有S3fullaccess,它可以删除存储桶策略,因此我建议拒绝该功能
答案 1 :(得分:0)
我实际上没有测试过这个。
您的S3策略限制了IAM用户的访问权限。您的目标是限制服务和/或服务所承担的角色的访问权限。
要拒绝访问所有EC2实例,请添加其他规则并将主体指定为(或添加到现有的Principal
条目中):
"Principal": {"Service": "ec2.amazonaws.com"}
限制对EC2假定的特定角色的访问:
"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:role/role-name" }
答案 2 :(得分:0)
看看这是否有效。由于您提供完全访问权限,因此您需要明确拒绝访问权限。如果不允许用户使用用户或不允许角色,则以下策略表示拒绝访问。这还应该防止未授权的用户/角色删除存储桶策略。我还没有测试过它。
{
"Id": "DenyAllAllowOnlyOne",
"Statement": [
{
"Action": "s3:*",
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::111111:user/alloweduser",
"arn:aws:iam::111111:role/allowedrole"
]
},
"Resource": [
"arn:aws:s3:::mybucket/production",
"arn:aws:s3:::mybucket/production/*"
]
}
],
"Version": "2012-10-17"
}
答案 3 :(得分:0)
我遇到了同样的问题,还没有确定为什么,只是拒绝根主体是行不通的。但是,我找到了一个解决方案,该解决方案是在语句中添加一个条件,以与本知识中心指南https://aws.amazon.com/premiumsupport/knowledge-center/explicit-deny-principal-elements-s3/
中的userid字段进行比较您首先必须确定IAM用户的神奇unique id。
然后将一条语句添加到指定通配符主体*
的策略中,并添加一个条件以按请求的"aws:userid"
字段进行过滤,例如(用确定的唯一ID替换AROAID2GEXAMPLEROLEID):
{
"Sid": "",
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:GetObjectVersion",
"s3:GetObject",
"s3:DeleteObject"
]
"Resource": [
"arn:aws:s3:::mybucket/production/*"
],
"Condition": {
"StringLike": {
"aws:userid": [
"AROAID2GEXAMPLEROLEID:*",
"111111"
]
}
}
}
Amazon在资源字段中为操作和警告支持部分通配符。我不知道为什么亚马逊会如此复杂,而不是仅仅在principal字段中添加对部分通配符的支持以允许简单直接的配置,例如
"Principal": {
"AWS": "arn:aws:iam::111111:*"
},