Comment puis-je empêcher les conteneurs d'accéder aux métadonnées d'instance Amazon EC2 dans Amazon ECS ?

Date de la dernière mise à jour : 11/02/2020

Je souhaite empêcher les conteneurs d'accéder aux métadonnées d'instance 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, une bonne pratique de sécurité consiste à éviter d'autoriser vos applications à assurer un rôle d'instance.

Amazon ECS fournit les modes de mise en réseau suivants pour exécuter une tâche avec une connectivité externe :

  • Le mode Bridge (Pont). La tâche utilise le réseau virtuel intégré de Docker.
  • Le mode awsvpc. La tâche alloue une interface réseau Elastic et tous les conteneurs partagent le même espace de noms de mise en réseau.
  • Le mode Host (Hôte). Les conteneurs partagent l'espace de noms de mise en réseau de l'hôte.

La solution suivante vous montre comment empêcher les conteneurs d'accéder aux métadonnées d'instance à l'aide des modes de mise en réseau Bridge et awsvpc.

Remarque : il n'est pas possible d'empêcher l'accès à l'aide du mode de mise en réseau Host, car l'agent Amazon ECS s'exécute sur l'espace de noms de mise en réseau Host et nécessite un accès à celui-ci.

Solution

Pour les tâches utilisant le mode de mise en 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 utilisant le mode de mise en réseau Bridge, utilisez iptables pour bloquer le trafic réseau à partir du 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 les AMI Amazon Linux 2.

Remarque : si vous choisissez les données utilisateur de l'instance Amazon EC2, la configuration suivante doit être écrite avant le démarrage du démon Docker. 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.

#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

Pour inclure cette configuration à vos données utilisateur existantes, utilisez l'archive MIME en plusieurs parties. Reportez-vous à l'exemple suivant :

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==--

Cette page vous a-t-elle été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d’aide ?