Je souhaite empêcher les conteneurs d’accéder aux métadonnées des instances Amazon Elastic Compute Cloud (Amazon EC2) dans Amazon Elastic Container Service (Amazon ECS).
Brève description
Si vous exécutez des conteneurs dans une instance Amazon EC2, il est recommandé de bloquer les applications afin qu’elles ne puissent pas assumer un rôle d’instance.
Amazon ECS propose les modes réseau suivants pour exécuter une tâche avec une connectivité externe :
- **Le mode bridge :**La tâche utilise le réseau virtuel intégré de Docker.
- **Le mode awsvpc :**La tâche alloue une interface réseau élastique. Dans cette configuration, tous les conteneurs partagent le même espace de noms réseau.
- **Le mode hôte :**Les conteneurs partagent l’espace de noms réseau de l’hôte.
Vous pouvez utiliser les modes réseau bridge et awsvpc pour bloquer les conteneurs afin qu’ils ne puissent pas accéder aux métadonnées de l’instance.
**Remarque :**L’agent Amazon ECS s’exécute sur l’espace de noms du réseau hôte et doit y accéder. Vous ne pouvez pas empêcher l’accès en mode réseau hôte.
Résolution
Pour les tâches qui utilisent le mode réseau awsvpc, ajoutez le paramètre suivant au fichier de configuration Amazon ECS /etc/ecs/ecs.config :
ECS_AWSVPC_BLOCK_IMDS=true
Pour les tâches qui utilisent le mode réseau bridge, utilisez iptables pour bloquer le trafic réseau depuis le pont docker0.
Vous pouvez spécifier la configuration d’iptables dans votre Amazon Machine Image (AMI) personnalisée ou lors du lancement dans les données utilisateur de l’instance Amazon EC2. Consultez l’exemple suivant pour Amazon Linux
Remarque : si vous choisissez les données utilisateur de l’instance Amazon EC2, vous devez écrire la configuration avant que le démon Docker ne démarre. Le format de données utilisateur cloud-boothook s’exécute plus tôt dans le processus de démarrage que la plupart des services.
Pour inclure cette configuration dans vos données utilisateur existantes, utilisez l’archive MIME en plusieurs parties sur le site web cloud-init. Reportez-vous à l’exemple suivant :
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==--