S3存储桶策略,拒绝除特定AWS服务角色和IAM角色之外的所有访问

5
你能否编写一个S3存储桶策略,拒绝除了特定IAM角色和AWS服务角色(例如billingreports.amazonaws.com)之外的所有主体访问?
我尝试使用“Deny”和“NotPrincipal”,但以下示例均无效,因为AWS不支持具有多个类型的主体。
这样可以保存策略,但会锁定存储桶(警告:只有根用户才能更新策略以解锁)。
"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>"
               ]
          }
     }
}

为什么您不能指定角色?该角色具有信任策略,限制哪些服务可以使用它。 - Chris Williams
1
当您使用NotPrincipalDeny时,"必须同时指定未被拒绝的主体的账户ARN。" 参见此处。我不知道这是否有帮助,但是在您的前两次尝试中没有提供账户原则。 - Marcin
@ChrisWilliams 你的意思是指定一个Principal角色并允许访问吗?这对我来说行不通,因为帐户中的其他角色将通过其IAM策略(即具有PowerUserAccess、ReadOnly策略等的角色)访问存储桶。 - playdoz
@Marcin,你说得对,需要使用账户主体。我尝试了多种主体类型(IAM角色+AWS服务角色),结果锁住了存储桶。看起来即使我能够保存策略,实际上它是无效的,使所有其他角色都失效,因此全部拒绝 - playdoz
@playdoz 拒绝和非原则策略很难管理。你确定没有其他方法可以通过像Chris提到的角色来实现吗?文档(与之前相同的链接)还写道:“在决定使用NotPrincipal之前,建议您探索其他授权选项。” - Marcin
@Marcin 你有什么建议可以通过角色来完成吗?我的要求是我只想让一个特定的角色和一个AWS服务角色(billingreports.amazonaws.com)能够访问这个特定的存储桶。账户中的其他角色/用户都不应该有任何访问这个存储桶的权限。 - playdoz
1个回答

2
你可以创建一个存储桶策略,只授予服务角色和IAM角色访问权限,但是需要明确的是,服务角色仍然以"arn:aws:iam:::role..."开头。
你是否要创建一个存储桶策略,同时授予特定服务和服务角色访问权限?我这么问是因为如果你创建了一个以billingreports.amazonaws.com为受信任实体的角色,并且该角色旨在访问存储桶,则不需要在存储桶策略中单独列出该服务(如果情况如我所想)。
请注意,你确实可以使用主体的通配符,结合条件 - 我经常这样做(请参见我的示例策略)。当我想将存储桶访问限制为特定角色时,我只需包括一个允许语句,其主体仅为我想允许的角色,然后是一个拒绝语句,其主体为"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]"
                    ]
                }
            }
        }
    ]
}

如果您确实需要服务本身访问存储桶,则解决方案将略有不同。我的回答假设服务角色需要访问权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接