您能否编写一个s3存储桶策略,该策略将拒绝对除特定 IAM角色和 AWS服务角色(例如billingreports.amazonaws.com)以外的所有主体的访问。 / p>
我尝试将' 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>"
]
}
}
}
答案 0 :(得分:0)
您当然可以创建仅授予对服务角色和 IAM 角色访问权限的存储桶策略,但要清楚的是,服务角色仍将以“ arn:aws:iam:::role..."。
您是否正在尝试创建一个存储桶策略,以授予对特定服务和服务角色的访问权限?我之所以这么问是因为如果您创建了一个以 billingreports.amazonaws.com 作为其受信任实体的角色,并且如果该角色旨在访问存储桶,则您无需列出该服务单独在您的存储桶策略中(如果场景如我所想)。
另外请注意,您确实可以将通配符与主体结合使用,并结合条件 - 我一直都这样做(请参阅下面的示例策略)。当我想限制对特定角色的存储桶访问时,我只需包含一个 Allow 语句,其 Principal 是我想要允许的角色,然后是 Deny 语句,其 Principal 为“AWS”:“*”,后跟一个条件,像这样:
{
"Version": "2008-10-17",
"Id": "PolicyScopedToSecurity",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[accountID]:role/[roleName]",
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::[bucketName]",
"arn:aws:s3:::[bucketName]/*"
]
},
{
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::[bucketName]",
"arn:aws:s3:::[bucketName]/*"
],
"Condition": {
"StringNotLike": {
"aws:PrincipalArn": [
"arn:aws:iam::[accountID]:role/[roleName]",
"[accountID]"
]
}
}
}
]
}
如果您真的需要服务本身来访问存储桶,请告诉我,因为我的回答假设只有服务角色需要访问权限。 :)