如何在 Amazon S3 存储桶策略中使用带有 Principal 元素和显式拒绝的通配符?

上次更新日期:2021 年 8 月 16 日

我想要在 Amazon Simple Storage Service (Amazon S3) 策略中使用带有 Principal 元素和显式拒绝的通配符。该如何操作?

简短描述

要防止某些 AWS Identity and Access Management (IAM) 实体访问您的 Amazon S3 存储桶,请在存储桶策略中指定特定权限。存储桶策略必须使用 NotPrincipal 元素和显式拒绝。有关详细信息,请参阅将 NotPrincipal 与 Deny 结合使用。

但是,由于 NotPrincipal 元素不支持通配符,因此必须使用 Principal 作为每个语句数据块中的目标实体。每个语句数据块还必须包含每个允许数据块的条件。

解决方法

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

开始之前,您必须具备以下资源:

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

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

Deny 块中的 StringNotLike

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

以下是完整策略:

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