如何在 Amazon S3 存储桶策略中对包含 Principal 元素(而非 NotPrincipal 元素)的显式拒绝使用通配符?

上次更新日期:2019 年 5 月 8 日

如何在 Amazon Simple Storage Service (Amazon S3) 存储桶策略中对包含 Principal 元素(而非 NotPrincipal 元素)的显式拒绝使用通配符?

简短描述

您可以通过在使用 NotPrincipal 元素和显式拒绝的存储桶策略中指定权限,来防止 AWS Identity and Access Management (IAM) 实体访问您的 Amazon S3 存储桶。但是,NotPrincipal 不支持通配符。

在下列策略示例中,您必须列出每个用户的角色会话名称以及将要担任该角色的每个实例 ID:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "NotPrincipal": {
        "AWS": [
          "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/cross-account-audit-app",
          "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/instanceID",
          "arn:aws:iam::444455556666:role/cross-account-read-only-role",
          "arn:aws:iam::444455556666:root"
        ]
      }
    }
  ]
}

要涵盖所有这些用户和实例,您需要在语句中使用一个通配符来表示担任的角色:

"arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/*"

但是,NotPrincipal 元素不支持通配符。

解决方法

使用 Principal(而非 NotPrincipal)作为每个语句块中的目标实体,包括每个 Allow 块的 Condition。

开始之前,您必须拥有以下资源:

在本示例中,在 aws:userid 中使用通配符,以包含进行调用以获取临时凭证时调用进程(例如应用程序、服务或实例 ID)传递的所有名称。有关更多信息,请参阅在所有请求中可用的信息。包含根账户以防止锁定:

注意:务必将示例名称替换为您自己的角色 ID 和存储桶名称。

"Condition": {
                "StringLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }

Deny 块中的 StringNotLike

"Condition": {
                "StringNotLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }

以下是完整策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::myExampleBucket",
            "Condition": {
                "StringLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::myExampleBucket/*",
            "Condition": {
                "StringLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }
        },
        {
            "Sid": "",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::myExampleBucket/*",
                "arn:aws:s3:::myExampleBucket"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }
        }
    ]
}