我想防止容器在 Amazon Elastic Container Service (Amazon ECS) 中存取 Amazon Elastic Compute Cloud (Amazon EC2) 的執行個體中繼資料。
簡短說明
如果您在 Amazon EC2 執行個體中執行容器,基於安全理由,最佳做法是避免允許應用程式擔任執行個體角色。
Amazon ECS 提供下列聯網模式來執行具有外部連線能力的任務:
- **橋接模式。**該任務使用 Docker 的內建虛擬網路。
- **提示模式。**任務分配一個彈性網路介面,並且所有容器共享相同的網路命名空間。
- **主機模式。**容器共用主機的網路命名空間。
下列解決方案說明如何防止容器使用橋接器和 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 2 AMI。
注意事項: 如果您選擇 Amazon EC2 執行個體使用者資料,則必須先寫入下列組態,才能啟動 Docker 精靈。與大多數服務相比,Cloud boothook 使用者資料格式在開機程序中執行得更早。
#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
若要將此組態包含在您現有的使用者資料中,請使用 MIME 多部分歸檔。請參閱以下範例:
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==--