Ich möchte verhindern, dass Container auf Amazon Elastic Compute Cloud (Amazon EC2)-Instance-Metadaten in Amazon Elastic Container Service (Amazon ECS) zugreifen.
Kurzbeschreibung
Wenn Sie Container in einer Amazon EC2-Instance ausführen, empfiehlt es sich, Anwendungen zu blockieren, damit sie keine Instance-Rolle übernehmen können.
Amazon ECS bietet die folgenden Netzwerkmodi, um eine Aufgabe mit externer Konnektivität auszuführen:
- Der Bridge-Modus: Die Aufgabe verwendet das integrierte virtuelle Netzwerk von Docker.
- Der awsvpc-Modus: Die Aufgabe weist eine elastische Netzwerkschnittstelle zu. In diesem Setup teilen sich alle Container denselben Netzwerk-Namespace.
- Der Host-Modus: Die Container teilen sich den Netzwerk-Namensbereich des Hosts.
Sie können die Netzwerkmodi bridge und awsvpc verwenden, um Container zu blockieren, sodass sie nicht auf die Instance-Metadaten zugreifen können.
Hinweis: Der Amazon ECS-Agent wird im Host-Namespace des Netzwerks ausgeführt und benötigt Zugriff darauf. Mit dem Host-Netzwerkmodus können Sie den Zugriff nicht verhindern.
Behebung
Für Aufgaben, die den awsvpc-Netzwerkmodus verwenden, fügen Sie der Amazon ECS-Konfigurationsdatei /etc/ecs/ecs.config den folgenden Parameter hinzu:
ECS_AWSVPC_BLOCK_IMDS=true
Verwenden Sie für Aufgaben, die den bridge-Netzwerkmodus verwenden, iptables, um den Netzwerkverkehr von der Docker0-Bridge zu blockieren.
Sie können die Konfiguration von iptables in Ihrem benutzerdefinierten Amazon Machine Image (AMI) oder beim Start in den Benutzerdaten der Amazon EC2-Instance angeben. Sehen Sie sich das folgende Beispiel für Amazon Linux an
Hinweis: Wenn Sie Amazon EC2-Instance-Benutzerdaten wählen, müssen Sie die Konfiguration schreiben, bevor der Docker-Daemon gestartet wird. Das cloud-boothook-Benutzerdatenformat wird früher im Startvorgang ausgeführt als die meisten Dienste.
Um diese Konfiguration in Ihre vorhandenen Benutzerdaten aufzunehmen, verwenden Sie das mehrteilige MIME-Archiv auf der Cloud-Init-Website. Siehe folgendes Beispiel:
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==--