如何在 Amazon S3 存储桶策略中对包含 Principal 元素(而非 NotPrincipal 元素)的显式拒绝使用通配符?
上次更新时间:2020 年 9 月 18 日
如何在 Amazon Simple Storage Service (Amazon S3) 存储桶策略中对包含 Principal 元素(而非 NotPrincipal 元素)的显式拒绝使用通配符?
简短描述
您可以通过在使用 NotPrincipal 元素和显式拒绝的存储桶策略中指定权限,来防止特定 AWS Identity and Access Management (IAM) 实体访问您的 Amazon S3 存储桶。有关详细信息,请参阅将 NotPrincipal 与 Deny 结合使用。
但是,由于 NotPrincipal 元素不支持通配符,因此必须使用 Principal 作为每个语句块中的目标实体,其中包括每个 Allow 块的 Condition。
解决方法
不使用 NotPrincipal,而使用 Principal 作为每个语句块中的目标实体,这包括每个 Allow 块的 Condition。
开始之前,您必须具备以下资源:
- 一个 S3 存储桶
- 一个 IAM 角色
- 具有 IAM 角色的 Amazon Elastic Compute Cloud (Amazon EC2) 实例,或者您可以切换到 IAM 角色
- IAM 实体的唯一 ID,或者您可以执行 IAM API 调用以获得唯一 ID
在本示例中,在 aws:userid 中使用通配符,以包含进行调用以获取临时凭证时这一调用过程(例如应用程序、服务或实例 ID)传递的所有名称。有关更多信息,请参阅所有请求中的可用信息。包含根账户以防止锁定。
注意:务必将示例名称替换为您自己的角色 ID 和存储桶名称。
Deny 块中的 StringNotLike:
"Condition": {
"StringNotLike": {
"aws:userid": [
"AROAID2GEXAMPLEROLEID:*",
"444455556666"
]
}
}
以下是完整策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": [
"arn:aws:iam::444455556666:role/cross-account-read-only-role"
],
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::awsexamplebucket1"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": [
"arn:aws:iam::444455556666:role/cross-account-read-only-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"
]
}
}
}
]
}