Amazon EKS でのセキュリティのベストプラクティス - Amazon EKS

Amazon EKS でのセキュリティのベストプラクティス

このトピックでは、クラスターにおけるセキュリティのベストプラクティスについて説明します。

IMDS および Amazon EC2 インスタンスプロファイルの認証情報に対するアクセスの制限

デフォルトで、Amazon EC2インスタンスメタデータサービス(IMDS) は、(ノード IAM ロールインスタンスに割り当てられた) 認証情報をインスタンスならびにその上で実行される任意のコンテナに提供します。ユーザーがサービスアカウントの IAM ロールを使用する際には、サービスアカウントトークンに IAM ロールを適用するために、IMDS によりポッドの認証情報チェーンが更新されます。この場合もポッドは、ノードに割り当てられたインスタンスプロファイルの権限を継承できます。以下の場合、コンテナで使用できるアクセス許可を最小限に抑えるために、ポッドから IMDS へのアクセスをブロックすることをお勧めします。

  • サービスアカウントの IAM ロールを実装し、AWS のサービスへのアクセスを必要とするすべてのポッドに対し、必要なアクセス許可を直接割り当てた場合。

  • クラスター内のポッドが、現在のリージョンの取得など、その他の理由で IMDS へのアクセスを必要としない場合。

詳細については、「インスタンスメタデータからのセキュリティ認証情報の取得」を参照してください。次のいずれかのオプションを使用して、インスタンスおよびコンテナからの IMDS へのアクセスを防ぐことができます。

重要

クラスターで AWS Load Balancer コントローラーを使用する場合は、ロードバランサーの設定に変更が必要な場合があります。詳細については、「AWS Load Balancer Controller を Amazon EKS クラスターにデプロイするには」を参照してください。

  • ノードおよびすべてのコンテナからの IMDSv1 へのアクセスをブロックし、ホストネットワークを使用しないすべてのコンテナで IMDSv2 へのアクセスをブロックする – インスタンス、および (仕様の中に hostNetwork: true が含まれる) ポッドは、ホストネットワークを使用します。このオプションを実装するには、行と列に対しシチュエーションに応じた手順を実行します。

    デプロイ方法 新しいノードグループ 既存のノードタイプ
    カスタム起動テンプレートがないマネージド型ノード eksctl 以外のデプロイ方法を使用することはできません。eksctl を使用してデプロイする場合には、--disable-pod-imds オプションで eksctl create nodegroup を指定します。eksctl により、指定したオプションに基づいて起動テンプレートが作成されるので、その起動テンプレートを使用してノードグループをデプロイさせることができます。 カスタム起動テンプレートを使用して、新しいノードグループを作成することをお勧めします。このテンプレートには、このテーブルの次の行の New node group 列にある設定内容を含めます。
    カスタム起動テンプレートを使用するマネージド型ノード 以下の項目を、起動テンプレートの [Advanced details (詳細設定)] に設定します。
    • [Metadata accessible (アクセス可能なメタデータ)] – Enabled

    • [Metadata version (メタデータのバージョン)] – V2 only (token required)

    • [Metadata response hop limit (メタデータレスポンスのホップリミット)] – 1

    起動テンプレートを [New (新規)] 列の設定内容で更新し、次に、更新した起動テンプレートバージョンを使用してノードグループを更新します。
    セルフマネージド型
    • AWS Management Console を使用しながらノードグループを作成する場合

      1. リージョンおよびオペレーティングシステムに対応した、セルフマネージド型ノードグループの AWS CloudFormation テンプレートをダウンロードします。

        • Linux – 中国 (北京) および中国 (寧夏) 以外のすべてのリージョン

          https://amazon-eks.s3.us-west-2.amazonaws.com/cloudformation/2020-10-29/amazon-eks-nodegroup.yaml
        • Linux – 中国 (北京) および中国 (寧夏)

          https://amazon-eks.s3.cn-north-1.amazonaws.com.cncloudformation/2020-10-29/amazon-eks-nodegroup.yaml
        • Windows – 中国 (北京) および中国 (寧夏) 以外のすべての地域

          https://amazon-eks.s3.us-west-2.amazonaws.com/cloudformation/2020-10-29/amazon-eks-windows-nodegroup.yaml
        • Windows – 中国 (北京) および中国 (寧夏)

          https://amazon-eks.s3.cn-north-1.amazonaws.com.cncloudformation/2020-10-29/amazon-eks-windows-nodegroup.yaml
      2. ファイルを編集します。HttpPutResponseHopLimit : 2 と記述された行を HttpPutResponseHopLimit : 1 に変更し、ファイルを保存します。

      3. セルフマネージド型の Amazon Linux ノードの起動 もしくは セルフマネージド型の Windows ノードの起動の手順に従ってノードグループをデプロイします。AWS CloudFormation テンプレートを定義する手順については、Amazon S3 URL を選択せずに、[Upload a template file (テンプレートファイルのアップロード)]、[Choose file (ファイルを選択)] の順に選択した上で、編集したファイルを選択して手順を続行します。また、[DisableIMDSv1] の値を true に設定します。

    • eksctl を使用しながらノードグループを作成する場合には、--disable-pod-imds オプションで eksctl create nodegroup を指定します。

    • AWS Management Console マネジメントコンソールを使用してノードグループを更新または移行する場合

      1. リージョンおよびオペレーティングシステムに対応した、セルフマネージド型ノードグループの AWS CloudFormation テンプレートをダウンロードします。

        • Linux – 中国 (北京) および中国 (寧夏) 以外のすべてのリージョン

          https://amazon-eks.s3.us-west-2.amazonaws.com/cloudformation/2020-10-29/amazon-eks-nodegroup.yaml
        • Linux – 中国 (北京) および中国 (寧夏)

          https://amazon-eks.s3.cn-north-1.amazonaws.com.cncloudformation/2020-10-29/amazon-eks-nodegroup.yaml
        • Windows – 中国 (北京) および中国 (寧夏) 以外のすべての地域

          https://amazon-eks.s3.us-west-2.amazonaws.com/cloudformation/2020-10-29/amazon-eks-windows-nodegroup.yaml
        • Windows – 中国 (北京) および中国 (寧夏)

          https://amazon-eks.s3.cn-north-1.amazonaws.com.cncloudformation/2020-10-29/amazon-eks-windows-nodegroup.yaml
      2. ファイルを編集します。HttpPutResponseHopLimit : 2 と記述された行を HttpPutResponseHopLimit : 1 に変更し、ファイルを保存します。

      3. 既存のセルフマネージド型ノードグループの更新 で説明される手順により、セルフマネージド型ノードグループを更新します。AWS CloudFormation テンプレートを定義する手順については、Amazon S3 URLを選択せずに、[Upload a template file (テンプレートファイルのアップロード)]、[Choose file (ファイルを選択)] の順に選択した上で、編集したファイルを選択して手順を続行します。また、[DisableIMDSv1] の値を true に設定します。

      重要

      新しい AMI や Kubernetes のバージョンを使用するなど、何らかの理由でノードグループを更新するたびに、テンプレートの以前の設定を繰り返し変更する必要が生じます。

    • eksctl を使用してノードグループを移行する際に、新しいノードグループを作成する場合には、--disable-pod-imds オプションで eksctl create nodegroup を指定します。

      重要

      新しい AMI や Kubernetes のバージョンの使用など、何らかの理由でノードグループを更新する際に新しいノードグループを作成する場合には、必ず前出のオプションを使用してください。

  • ホストネットワークを使用しないすべてのコンテナからの IMDSv1 および IMDSv2 へのアクセスをブロックする – これは、インスタンス、および仕様に hostNetwork: true が含まれるポッドがホストネットワークを使用しているものの、従来からの理由により IMDSv1 へのアクセスも必要な場合です。次の iptables コマンドを、各 Amazon Linux ノードで (root として) 実行するか、これをインスタンスのブートストラップ用ユーザーデータスクリプトに含めます。

    yum install -y iptables-services iptables --insert FORWARD 1 --in-interface eni+ --destination 169.254.169.254/32 --jump DROP iptables-save | tee /etc/sysconfig/iptables systemctl enable --now iptables
    重要
    • 前のルールは、(名前が eni で始まる)ノード内のネットワークインターフェースにのみ適用されます。これは、CNI プラグインがホストネットワークを使用しないポッドに対して作成する、すべてのネットワークインターフェイスを指します。IMDS へのトラフィックでは、kube-proxy や CNI プラグインなど、ノードまたはホストネットワークを使用するポッドを使用します。

    • ネットワークポリシーを (Calico などのツールを使用して) 実装する場合は、以前のルールが上書きされる可能性があります。ネットワークポリシーを実装する際には、これによりルールが上書きされないか、ポリシーにこのルールが含まれているかを確認してください。

    • ブランチネットワークインターフェイスがある状態で、セキュリティグループをポッドに適用した場合は、前のコマンドに加えて次のコマンドも実行します。

      iptables -t mangle -A POSTROUTING -o vlan+ --destination 169.254.169.254/32 --jump DROP

      ブランチネットワークインターフェイスの詳細については、「ポッドのセキュリティグループ」を参照してください。