【发布时间】:2020-11-26 10:08:29
【问题描述】:
您能否编写一个 s3 存储桶策略来拒绝访问除特定 IAM 角色 和 AWS 服务角色 之外的所有委托人(例如 billingreports.amazonaws.com)。
我尝试将“Deny”与“NotPrincipal”一起使用,但以下示例均无效,因为我认为无法拥有多种类型的主体AWS 支持吗?
这允许您保存策略,但锁定存储桶(警告:只有 root 用户可以更新策略以解锁)
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::<account_id>:root",
"arn:aws:iam::<account_id>:role/specialBillingRole"
],
"Service": "billingreports.amazonaws.com"
}
因此,我尝试使用条件,但找不到合适的组合。这是一个示例策略。
{
"Version": "2008-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "billingreports.amazonaws.com"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::my-bucket/*"
},
{
"Sid": "",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket/*",
"arn:aws:s3:::my-bucket"
],
"Condition": {
"StringNotLike": {
"aws:PrincipalArn": [
"arn:aws:iam::<account_id>:role/specialBillingRole",
"billingreports.amazonaws.com",
"<account_id>"
]
}
}
}
]
}
更新根据一些评论建议的问题。
第二次更新还尝试了以下方法,仍然可以访问帐户中的所有角色/用户(不能在Principal 中使用通配符)。
{
"Effect": "Deny",
"Principal": {
"AWS": "arn:aws:iam::<account_id>:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket/*",
"arn:aws:s3:::my-bucket"
],
"Condition": {
"ArnNotEquals": {
"aws:PrincipalArn": [
"arn:aws:iam::<account_id>:role/specialBillingRole",
"<account_id>"
]
}
}
}
【问题讨论】:
-
为什么不能指定角色,角色有信任策略限制哪些服务可以使用
-
当您拥有
NotPrincipal和Deny时,您“还必须指定未被拒绝的主体的帐户ARN。”来自here。我不知道这是否有帮助,但是您在前两次尝试中没有提供帐户原则。 -
@ChrisWilliams 您的意思是将角色指定为
Principal和Allow?这对我不起作用,因为帐户中的其他角色将可以通过其 IAM 策略(即具有 PowerUserAccess、ReadOnly 策略等的角色)访问存储桶。 -
@Marcin 你是正确的关于需要帐户本金。我刚刚尝试使用多种 types 委托人(IAM 角色 + AWS 服务角色)并将存储桶锁定。所以看起来即使我能够保存策略,它实际上是无效的并且使所有其他角色无效,因此它是 Deny all。
-
@playdoz Deny 和 NonPrinciple 策略难以管理。你确定没有其他方法可以做到这一点,比如通过克里斯提到的角色吗?文档(与以前的链接相同)还写道“建议您在决定使用 NotPrincipal 之前探索其他授权选项。”
标签: amazon-web-services amazon-s3 amazon-iam