プロファイル適用性: レベル 1 - クラスター / コントロールプレーン
クラスターを作成する際には、KubernetesAPIのセキュリティを強化するために、プライベートエンドポイントを有効にし、パブリックアクセスを無効にしてください。プライベートクラスターでは、マスターノードはプライベートエンドポイントとパブリックエンドポイントの両方を備えています。プライベートエンドポイントは、VPCネットワークの内部ロードバランサーの背後にある内部IPアドレスで、ノードからマスターへの通信を容易にします。一方、パブリックエンドポイントは、マスターのVPCネットワーク外からKubernetesAPIへの外部アクセスを可能にします。KubernetesAPIは機密操作に認証トークンを必要としますが、脆弱性により公開される可能性があり、攻撃者がクラスターとそのAPIバージョンを特定して既知の脆弱性を悪用する可能性があります。パブリックエンドポイントを無効にすることで、そのようなリスクを制限し、攻撃者が攻撃を開始するためにはマスターのVPCネットワーク内にいる必要があります。パブリックアクセスが必要な場合は、指定されたホワイトリスト化されたCIDRブロックのみを許可するように設定し、クラスターのVPC内でkubeletとKubernetesAPI間のすべての内部トラフィックを安全にプロビジョニングされたクロスアカウントENIを通じて維持しながら、制御されたアクセスを提供します。
影響
EKSクラスターエンドポイントをプライベートに設定します。
-
クラスターエンドポイントをパブリックのままにし、どのCIDRブロックがクラスターエンドポイントと通信できるかを指定します。これらのブロックは、クラスターエンドポイントにアクセスを許可されたパブリックIPアドレスのホワイトリストセットです。
-
ホワイトリストに登録されたCIDRブロックのセットでパブリックアクセスを構成し、プライベートエンドポイントアクセスを有効に設定します。これにより、特定の範囲のパブリックIPからのパブリックアクセスが可能になり、制御プレーンがプロビジョニングされるときにクラスターVPCにプロビジョニングされるクロスアカウントENIを介して、kubelet (ワーカー) とKubernetes API間のすべてのネットワークトラフィックを強制します。
監査
KubernetesAPIサーバへのプライベートエンドポイントアクセスを確認してください。以下がenabled: falseであることを確認してください
export CLUSTER_NAME=<your cluster name>
aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.resourcesVpcConfig.endpointPublicAccess"
以下がenabled: trueになっていることを確認してください
export CLUSTER_NAME=<your cluster name>
aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.resourcesVpcConfig.endpointPrivateAccess"
修復
Kubernetes APIサーバへのプライベートエンドポイントアクセスを有効にすることで、ノードとAPIサーバ間のすべての通信がVPC内に留まります。これを考慮して、AWS
CLIを使用してプライベートエンドポイントアクセスが有効になっていることを確認し、クラスターを適切に更新できます。
例えば、次のコマンドはKubernetes APIへのプライベートアクセスを有効にし、パブリックアクセスが許可されないことを保証します。
aws eks update-cluster-config --region $AWS_REGION --name $CLUSTER_NAME --resources-vpc-config endpointPrivateAccess=true,endpointPublicAccess=false
