我想防止容器在 Amazon Elastic Container Service (Amazon ECS) 中存取 Amazon Elastic Compute Cloud (Amazon EC2) 的執行個體中繼資料。
簡短說明
如果您在 Amazon EC2 執行個體中執行容器,則最佳做法是封鎖應用程式,以免它們擔任執行個體角色。
Amazon ECS 提供下列聯網模式來執行具有外部連線能力的任務:
- **橋接模式:**該任務使用 Docker 的內建虛擬網路。
- **awsvpc 模式:**該任務分配彈性網路介面。在此設定中,所有容器都共用相同的網路命名空間。
- **主機模式:**容器共用主機的網路命名空間。
您可以使用橋接和 awsvpc 網路模式來封鎖容器,使它們無法存取執行個體中繼資料。
注意:Amazon ECS 代理程式會在主機網路命名空間上執行,且需要存取該命名空間。您無法使用主機網路模式阻止存取。
解決方法
對於使用 awsvpc 網路模式的任務,請將下列參數新增至 Amazon ECS 組態檔案 /etc/ecs/ecs.config 中:
ECS_AWSVPC_BLOCK_IMDS=true
對於使用橋接網路模式的任務,請使用 iptables 封鎖來自 docker0 橋接器的網路流量。
您可以在自訂 Amazon Machine Image (AMI) 或 Amazon EC2 執行個體使用者資料啟動時指定 iptables 的組態。請參閱下列用於 Amazon Linux 的範例
**注意:**如果您選擇 Amazon EC2 執行個體使用者資料,則必須在 Docker 常駐程式啟動之前寫入組態。與大多數服務相比,cloud-boothook 使用者資料格式在開機程序中執行得更早。
若要將此組態包含在您現有的使用者資料中,請在 cloud-init 網站上使用 MIME 多部分歸檔。請參閱下列範例:
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==--