Quiero evitar que los contenedores accedan a los metadatos de las instancias de Amazon Elastic Compute Cloud (Amazon EC2) en Amazon Elastic Container Service (Amazon ECS).
Breve descripción
Si ejecuta contenedores en una instancia de Amazon EC2, se recomienda, por motivos de seguridad, evitar que las aplicaciones asuman un rol de instancia.
Amazon ECS proporciona los siguientes modos de red para ejecutar una tarea con conectividad externa:
- El modo bridge. La tarea utiliza la red virtual integrada de Docker.
- El modo awsvpc. La tarea asigna una interfaz de red elástica y todos los contenedores comparten el mismo espacio de nombres de red.
- El modo host. Los contenedores comparten el espacio de nombres de red del host.
La siguiente solución muestra cómo evitar que los contenedores accedan a los metadatos de la instancia mediante los modos de red bridge y awsvpc.
Nota: No es posible impedir el acceso con el modo de red host, porque el agente de Amazon ECS se ejecuta en el espacio de nombres de red del host y debe poder acceder a él.
Solución
En el caso de las tareas que utilizan el modo de red awsvpc, añada el siguiente parámetro al archivo de configuración de Amazon ECS /etc/ecs/ecs.config:
ECS_AWSVPC_BLOCK_IMDS=true
En el caso de las tareas que utilizan el modo de red bridge, utilice iptables para bloquear el tráfico de red desde el puente docker0.
Puede especificar la configuración de iptables en su imagen de máquina de Amazon (AMI) personalizada o, en el momento del lanzamiento, en los datos de usuario de la instancia de Amazon EC2. Consulte el siguiente ejemplo en el caso de las AMI de Amazon Linux 2.
Nota: Si elige los datos de usuario de la instancia de Amazon EC2, debe escribir la siguiente configuración antes de que se inicie el daemon de Docker. El formato de datos de usuario cloud-boothook se ejecuta antes que la mayoría de los servicios en el proceso de arranque.
#cloud-boothook
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
Para incluir esta configuración con sus datos de usuario existentes, utilice el archivo multiparte MIME. Fíjese en el siguiente ejemplo:
Content-Type: multipart/mixed; boundary="==BOUNDARY=="
MIME-Version: 1.0
--==BOUNDARY==
Content-Type: text/cloud-boothook; charset="us-ascii"
# 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==--