コンテナが Amazon Elastic Container Service (Amazon ECS) の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスメタデータにアクセスするのを防ぎたいと考えています。
簡単な説明
Amazon EC2 インスタンスでコンテナを実行する場合、アプリケーションをブロックしてインスタンスロールの引き受けができないようにするのがベストプラクティスです。
Amazon ECS には、外部接続でタスクを実行するための次のネットワーキングモードが用意されています。
- ブリッジモード: タスクで Docker の組み込み仮想ネットワークを使用します。
- awsvpc モード: タスクで Elastic Network Interface を割り当てます。この設定では、すべてのコンテナが同じネットワーク名前空間を共有します。
- ホストモード: コンテナはホストのネットワーク名前空間を共有します。
ブリッジおよび awsvpc のネットワーキングモードを使用してコンテナをブロックし、コンテナがインスタンスメタデータにアクセスできないようにすることができます。
注: Amazon ECS エージェントは、ホストネットワーク名前空間で実行され、それにアクセスする必要があります。ホストネットワーキングモードでのアクセスを防ぐことはできません。
解決策
awsvpc ネットワーキングモードを使用するタスクの場合は、Amazon ECS 設定ファイル /etc/ecs/ecs.config に次のパラメータを追加します。
ECS_AWSVPC_BLOCK_IMDS=true
ブリッジネットワークモードを使用するタスクの場合は、iptables を使用して docker0 ブリッジからのネットワークトラフィックをブロックします。
iptables の設定は、カスタム Amazon マシンイメージ (AMI) で指定することも、起動時に Amazon EC2 インスタンスのユーザーデータで指定することもできます。Amazon Linux については、次の例を参照してください
注: Amazon EC2 インスタンスのユーザーデータを選択した場合は、Docker デーモンが起動する前に設定を書き込む必要があります。cloud-boothook ユーザーデータ形式は、ブートプロセスでほとんどのサービスよりも前に実行されます。
この設定を既存のユーザーデータに含めるには、cloud-init ウェブサイトの MIME multi part archive を使用します。以下の例を参照してください:
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==--