[英]S3 bucket policy to deny all except a particular AWS service role and IAM role
您能否編寫一個 s3 存儲桶策略來拒絕訪問除特定IAM 角色和AWS 服務角色(例如 billingreports.amazonaws.com)之外的所有委托人。
我曾嘗試將“拒絕”與“ 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>"
]
}
}
}
您當然可以創建僅授予服務角色和 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]"
]
}
}
}
]
}
讓我知道您是否真的需要服務本身來訪問存儲桶,因為我的回復假定只有服務角色需要訪問。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.