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

时间:2020-08-06 07:16:22

标签: amazon-web-services amazon-s3 amazon-iam

您能否编写一个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>"
               ]
          }
     }
}

1 个答案:

答案 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]"
                    ]
                }
            }
        }
    ]
}

如果您真的需要服务本身来访问存储桶,请告诉我,因为我的回答假设只有服务角色需要访问权限。 :)