Quero impedir que os contêineres acessem os metadados da instância do Amazon Elastic Compute Cloud (Amazon EC2) no Amazon Elastic Container Service (Amazon ECS).
Breve descrição
Se você executar contêineres em uma instância do Amazon EC2, é uma prática recomendada bloquear as aplicações para que elas não possam assumir uma função de instância.
O Amazon ECS fornece os seguintes modos de rede para executar uma tarefa com conectividade externa:
- O modo de ponte: A tarefa usa a rede virtual integrada do Docker.
- O modo awsvpc: A tarefa aloca uma interface de rede elástica. Nessa configuração, todos os contêineres compartilham o mesmo namespace de rede.
- O modo de host: Os contêineres compartilham o namespace de rede do host.
Você pode usar os modos de rede de ponte e awsvpc para bloquear contêineres para que eles não possam acessar os metadados da instância.
Observação: o agente do Amazon ECS é executado no namespace de rede do host e requer acesso a ele. Você não pode impedir o acesso com o modo de rede de host.
Resolução
Para tarefas que usam o modo de rede awsvpc, adicione o seguinte parâmetro ao arquivo de configuração /etc/ecs/ecs.config do Amazon ECS:
ECS_AWSVPC_BLOCK_IMDS=true
Para tarefas que usam o modo de rede de ponte, use iptables para bloquear o tráfego de rede da ponte docker0.
Você pode especificar a configuração de iptables na sua Imagem de máquina da Amazon (AMI) personalizada ou na inicialização nos dados do usuário da instância do Amazon EC2. Veja o exemplo a seguir para o Amazon Linux
Observação: se você escolher os dados de usuário da instância do Amazon EC2, deverá gravar a configuração antes de iniciar o daemon do Docker. O formato de dados do usuário cloud-boothook é executado mais cedo no processo de inicialização do que a maioria dos serviços.
Para incluir essa configuração nos dados de usuário existentes, use o arquivo multipartes MIME no site cloud-init. Veja o exemplo a seguir:
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==--