Amazon web services S3 bucket策略拒绝除特定AWS服务角色和IAM角色之外的所有

Amazon web services S3 bucket策略拒绝除特定AWS服务角色和IAM角色之外的所有,amazon-web-services,amazon-s3,amazon-iam,Amazon Web Services,Amazon S3,Amazon Iam,您是否可以编写一个s3 bucket策略,该策略将拒绝访问除特定IAM角色和AWS服务角色(例如billingreports.amazonaws.com)之外的所有主体 我曾尝试将“Deny”与“NotPrincipal”一起使用,但以下示例都不起作用,因为我认为AWS不支持使用多种类型的主体 这允许您保存策略,但会锁定存储桶(警告:只有root用户才能更新策略以解锁) 当然,您可以创建一个只授予服务角色和IAM角色访问权限的bucket策略,但需要明确的是,服务角色仍然以“arn:aws:IA

您是否可以编写一个s3 bucket策略,该策略将拒绝访问除特定IAM角色和AWS服务角色(例如billingreports.amazonaws.com)之外的所有主体

我曾尝试将“Deny”与“NotPrincipal”一起使用,但以下示例都不起作用,因为我认为AWS不支持使用多种类型的主体

这允许您保存策略,但会锁定存储桶(警告:只有root用户才能更新策略以解锁)


当然,您可以创建一个只授予服务角色和IAM角色访问权限的bucket策略,但需要明确的是,服务角色仍然以“arn:aws:IAM:::role…”开头

您是否正在尝试创建一个bucket策略,授予对特定服务和服务角色的访问权限?我这样问是因为,如果您创建了一个角色,并将billingreports.amazonaws.com作为其受信任的实体,并且该角色是用于访问bucket的,那么您不需要在bucket策略中单独列出该服务(如果该场景与我想象的一样)

还请注意,您确实可以将通配符与主体一起使用,并结合一个条件-我一直都这样做(请参见下面的示例策略)。当我想限制对特定角色的bucket访问时,我只需包含一个主体为我想要允许的角色的Allow语句,然后是一个主体为“AWS”:“*”的Deny语句,后面跟着一个条件,如:

{
    "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]"
                    ]
                }
            }
        }
    ]
}

如果您确实需要服务本身来访问bucket,请告诉我,因为我的回答假设服务角色需要访问。:)

为什么不能指定角色,角色有一个信任策略,该策略限制了哪些服务可以使用它当您使用
NotPrincipal
Deny
时,您“还必须指定not denied principal的帐户ARN。”来自。我不知道这是否有帮助,但您在头两次尝试中没有提供帐户原则。@ChrisWilliams您的意思是用
允许
指定一个角色作为
主体
?这对我不起作用,因为帐户中的其他角色将通过其IAM策略(即具有PowerUserAccess、ReadOnly策略等的角色)访问bucket。@Marcin您需要帐户主体的权限是正确的。我只是尝试了多种类型的主体(IAM角色+AWS服务角色),它锁定了bucket。因此,看起来即使我能够保存策略,但实际上它是无效的,并使所有其他角色无效,因此它是Deny all。@playdoz Deny和非原则策略很难管理。你确定没有其他方法可以做到这一点,比如通过克里斯提到的角色?文档(与前面的链接相同)还写道“建议您在决定使用NotPrincipal之前探索其他授权选项。”
{
    "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>"
                    ]
                }
            }
        }
    ]
}
{
     "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>"
               ]
          }
     }
}
{
    "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]"
                    ]
                }
            }
        }
    ]
}