用于将特定 IAM 角色列入白名单的存储桶策略



我有一个存储桶策略,如下所示:

{
"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 角色的方式。

最新更新