【发布时间】:2020-09-28 00:20:09
【问题描述】:
我有一个 ECS 任务配置为运行我想用作 S3 存储桶网站的反向代理的 nginx 容器。
出于安全考虑,阻止公共访问已为存储桶打开,因此我正在寻找一种方法,仅授予对 ECS 任务的读取访问权限。
我希望我的 ECS 任务运行一个 nginx 反向代理以拥有S3:GetObjects 访问我的网站存储桶的权限。存储桶不能公开,因此我想将其限制为使用 ecs 任务 IAM 角色作为委托人的 ecs 任务。
IAM 角色: arn:aws:iam:::role/ 配置了一个附加策略,允许存储桶及其对象中的所有 S3 操作:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Action": "S3:*",
"Resource": [
"arn:aws:s3:::<BUCKET>",
"arn:aws:s3:::<BUCKET>/*"
]
}
]
}
在受信任的实体中,我添加了担任 ECS 任务角色的权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
问题在于 EC2 目标组运行状况检查始终向存储桶及其对象返回拒绝访问。
[08/Jun/2020:20:33:19 +0000] “GET / HTTP/1.1” 403 303 “-“ “ELB-HealthChecker/2.0”
我还尝试通过在下面添加存储桶策略来授予它权限,但我认为不需要它,因为 IAM 角色已经可以访问它......
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "allowNginxProxy",
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "*",
"Resource": [
"arn:aws:s3:::<BUCKET>/*",
"arn:aws:s3:::<BUCKET>"
]
}
]
}
我也尝试过使用”AWS": "arn:aws:iam::<ACCOUNT_NUMBER>:role/<ECS_TASK_ROLE>" 作为校长。
有什么建议吗?
【问题讨论】:
-
旁注: 分配
s3:*权限通常不是一个好主意。这包括对存储桶执行任何操作的能力,包括删除存储桶和存储桶中的所有内容。尝试将权限限制为仅应用程序需要的权限(例如GetObject)。 -
“EC2 目标组健康检查”来自负载均衡器,对吗?它指向 nginx 上的路径?如果您手动转到该路径,它会返回 200 响应吗?您的 Reserve Proxy 是否有效(除了健康检查)?如果没有,您可以在日志中看到什么?
-
整个解决方案涉及 Route53 托管区域,该区域指向应用程序负载均衡器侦听 443 来自 ecs 目标组,该目标组具有运行 nginx 容器的健康实例。现在回到 S3,如果我们为现有 ACL 禁用 Block Public Access 选项,将返回 HTTP 200 响应,我可以访问网站 index.html。
-
为什么要在 S3 上运行健康检查?我可以理解在指向 ECS 的负载均衡器上运行它,但在 S3 上确实不需要它。
-
你最后解决了吗?我也有类似的问题。
标签: permissions amazon-iam amazon-ecs policy bucket