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

1 分钟阅读
0

我想在 Amazon Simple Storage Service (Amazon S3) 桶策略中使用包含 Principal 元素和显式拒绝的通配符。

简述

要防止 AWS Identity and Access Management(AWS IAM)实体访问您的 Amazon S3 桶,请在桶策略中指定具体权限。桶策略必须使用 NotPrincipal 元素和显式拒绝。有关更多信息,请参阅使用 Deny 语句指定 NotPrincipal

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

解决方法

首先,请确保您有以下资源:

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

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

以下是完整的示例策略。请注意拒绝块中的 StringNotLike 条件:

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

相关信息

How to restrict Amazon S3 bucket access to a specific IAM role

AWS JSON 策略元素: NotPrincipal

AWS 官方
AWS 官方已更新 6 个月前