我有一个存储桶策略,如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::test-bucket/*"
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::test-bucket/*",
"Condition": {
"StringEquals": {
"s3:ExistingObjectTag/status": "INFECTED"
},
"StringNotLike": {
"aws:SourceArn": "arn:aws:sts::1234567890:assumed-role/ecs_task_role/*"
}
}
}
]
}
我想要的是这样的东西:
如果 s3 对象具有键值status=INFECTED
的标签,则限制对公有的访问,除非您使用此 iam 角色arn:aws:iam::1234567890:role/ecs_task_role
。因此,任何承担此 iam 角色的系统(此处的容器(都应该能够访问存储桶内容,无论其中的对象具有什么标签。
我已经看到我的 ecs 任务承担了这个角色,它的角色 arn 看起来像这样:arn:aws:sts::1234567890:assumed-role/ecs_task_role/e7f2364b-c93d-4228-9259-1a59bdf2d201
.
因此,我使用通配符StringNotLike
运算符将来自 ecs 任务的请求列入白名单。
但由于某种原因,这不起作用。我的 ecs 任务在尝试从带有标签status: INFECTED
的存储桶下载对象时收到 403 访问被拒绝。我在这里错过了什么?更重要的是,我需要更改什么才能使此访问控制逻辑正常工作?
提前感谢!
不使用Deny
的生活要简单得多。
您似乎有两个要求:
- 阻止"受感染"对象的公共访问
- 授予对 IAM 角色的访问权限
这可以分为两个组件:
- 授予对非受感染对象的访问权限的存储桶策略
- IAM 角色上的策略,授予对存储桶的访问权限(无论元数据如何(
在存储桶策略中,您应使用NotStringEquals
检查标签(即,在找不到该标签时授予权限(。这限制了Allow
,而不必使用Deny
。
{
"Version": "2012-10-17",
"Id": "AllowNonInfected",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::stack-woodstock/*",
"Condition": {
"StringNotEquals": {
"s3:ExistingObjectTag/status": "INFECTED"
}
}
}
]
}
将 NotSourceArn 替换为 NotPrincipal
这就是您在存储桶策略中引用 IAM 角色的方式。