如何阻止容器访问 Amazon ECS 中的 Amazon EC2 实例元数据?

1 分钟阅读
0

我想阻止容器访问 Amazon Elastic Container Service(Amazon ECS)中的 Amazon Elastic Compute Cloud(Amazon EC2)实例元数据。

简短描述

如果在 Amazon EC2 实例中运行容器,则最佳做法是阻止应用程序,使它们无法代入实例角色。

Amazon ECS 提供了以下联网模式来通过外部连接运行任务:

  • **桥接模式:**任务使用 Docker 的内置虚拟网络。
  • **awsvpc 模式:**任务分配一个弹性网络接口。在此设置中,所有容器都共享相同的网络命名空间。
  • **主机模式:**容器会共享主机的网络命名空间。

可以使用桥接awsvpc 网络模式来阻止容器,使它们无法访问实例元数据。

注意:Amazon ECS 代理在主机网络命名空间上运行并需要访问它。您无法使用主机网络模式来阻止访问。

解决方法

对于使用 awsvpc 联网模式的任务,请在 Amazon ECS 配置文件 /etc/ecs/ecs.config 中添加以下参数:

ECS_AWSVPC_BLOCK_IMDS=true

对于使用桥接联网模式的任务,请使用 iptables 阻止来自 docker0 网桥的网络流量。

您可以在自定义亚马逊机器映像(AMI)中指定 iptables 的配置,也可以在启动时在 Amazon EC2 实例用户数据中指定 iptables 的配置。请参阅以下 Amazon Linux 示例

**注意:**如果选择 Amazon EC2 实例用户数据,则必须在 Docker 进程守护程序启动之前编写配置。cloud-boothook 用户数据格式在启动过程中比大多数服务运行得更早。

要在现有用户数据中包括此配置,请使用 cloud-init 网站上的 MIME 多部分存档。请参阅下面的示例:

Content-Type: multipart/mixed; boundary="==BOUNDARY=="MIME-Version: 1.0

--==BOUNDARY==
Content-Type: text/cloud-boothook; charset="us-ascii"

#!/bin/sh
# Set iptables configuration

yum install iptables-services -y

cat <<EOF > /etc/sysconfig/iptables
*filter
:DOCKER-USER - [0:0]
-A DOCKER-USER -d 169.254.169.254/32 -j DROP
COMMIT
EOF

systemctl enable iptables && systemctl start iptables

--==BOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
# Set any ECS agent configuration options
echo "ECS_CLUSTER=my-ecs-cluster" >> /etc/ecs/ecs.config

--==BOUNDARY==--
AWS 官方
AWS 官方已更新 9 个月前