既定では、Azure Kubernetes Service (AKS) クラスター内で実行されているすべてのポッドが Azure Instance Metadata Service (IMDS) エンドポイントにアクセスできます。 必要に応じて Azure Kubernetes Service (AKS) クラスターから IMDS エンドポイントへのアクセスを制限することで、セキュリティを強化できるようになりました (プレビュー)。
重要
AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。 詳細については、次のサポート記事を参照してください。
AKS クラスターの IMDS 制限について
Azure IMDS は、現在実行中の仮想マシン インスタンスに関する情報を提供する REST API です。 この情報には、SKU、ストレージ、ネットワークの構成、今後のメンテナンス イベントなどがあります。
IMDS REST API は、よく知られたルーティング不可能な IP アドレス (169.254.169.254) で利用可能で、既定では AKS クラスターで実行されているすべてのポッドがこれにアクセスすることができます。 この既定のアクセスは、以下に示すような AKS クラスターにとってのセキュリティ リスクを生じさせます。
- 悪意のあるユーザーがサービスを悪用して、トークンやその他のプラットフォーム情報などの機密情報を取得し、情報漏えいが発生する可能性があります。
- その後、認証の脆弱性があらわとなる可能性があります。これは、アプリケーションがこれらの資格情報を誤用する可能性があるためです。
クラスター内で実行されているホスト以外のネットワーク ポッドの IMDS エンドポイントへのアクセスを制限できるようになりました。 ホスト以外のネットワーク ポッドの hostNetwork
は、仕様上 false に設定されています。 IMDS 制限を有効にすると、ホスト以外のネットワーク ポッドは、IMDS エンドポイントにアクセスすることも、マネージド ID による認可のための OAuth 2.0 トークンを取得することもできなくなります。 IMDS 制限が有効になった後、ホスト以外のネットワーク ポッドは、Microsoft Entra ワークロード ID を利用する必要があります。
ホスト ネットワーク ポッドの hostNetwork
は、仕様上 true に設定されています。 ホスト ネットワーク ポッドは、ホスト プロセスと同じネットワーク名前空間を共有するため、IMDS 制限が有効になった後も、引き続き IMDS エンドポイントにアクセスできます。 ノード内のローカル プロセスは、IMDS エンドポイントを使用してインスタンス メタデータを取得できるため、IMDS 制限が有効になった後も、エンドポイントへのアクセスが許可されています。
開始する前に
Azure CLI バージョン 2.61.0 以降がインストールされていることを確認します。 バージョンを確認するには、
az --version
を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。aks-preview
Azure CLI 拡張機能バージョン 7.0.0b2 以降をインストールします。aks-preview
拡張機能がまだない場合は、az extension add
コマンドを使ってインストールします。az extension add --name aks-preview
aks-preview
拡張機能が既にある場合は、az extension update
コマンドを使って更新し、確実に最新バージョンを使うようにします。az extension update --name aks-preview
IMDSRestrictionPreview
コマンドを使って、 機能フラグを登録します。az feature register --namespace Microsoft.ContainerService --name IMDSRestrictionPreview
登録の状態は、az feature show コマンドを使って確認します。 状態が "登録済み" と表示されるまでに数分かかります。
az feature show --namespace Microsoft.ContainerService --name IMDSRestrictionPreview
状態が Registered と表示されたら、az provider register コマンドを使用して Microsoft.ContainerService リソース プロバイダーの登録を最新の情報に更新します。
az provider register --namespace Microsoft.ContainerService
AKS クラスターで OIDC 発行者を有効にします。 新しいクラスターを作成するか、既存のクラスターを更新するには、OIDC Issuer を使用して AKS クラスターを構成する方法に関する記事を参照してください。
制限事項
IMDS エンドポイントにアクセスする必要があるいくつかのアドオンは、IMDS 制限ではサポートされていません。 これらのアドオンがクラスターにインストールされている場合は、IMDS 制限を有効にできません。 逆に、IMDS 制限が有効になっている場合は、これらのアドオンをインストールできません。 サポートされていないアドオンには以下が含まれます。
- アプリケーション ゲートウェイ イングレス コントローラー
- コンテナー用 Azure Monitor (コンテナーの分析情報)
- 仮想ノード
- Azure Policy
- クラスター拡張機能: Flux (GitOps)、Dapr、Azure App Configuration、Azure Machine Learning、Azure コンテナー ストレージ、Azure Backup
- AI ツールチェーン オペレーター (プレビュー)
- 申請ルート指定
- HTTP アプリケーション ルーティング
- Web アプリケーションのルーティング
- Azure のコスト分析
Secrets Store Container Storage Interface (CSI) ドライバー用の Azure Key Vault プロバイダーでは、ワークロード ID 認証モードがサポートされるようになったため、IMDS 制限が有効な状態で機能させることができます。
さらに、Windows ノード プールは現在、IMDS 制限ではサポートされていません。
注意事項
サポートされていないアドオンを使用するクラスターの IMDS 制限を有効にすると、エラーが発生します。
重要な考慮事項
IMDS 制限が有効になっている場合、AKS はノード上の iptables ルールを管理します。 iptables ルールが誤って削除されたり、改ざんされることを防ぐために、以下の点に注意してください。
- iptables ルールは SSH または node-shell で変更できるため、 SSH を無効に するか、ポリシーを使用して特権ポッドを無効にすることをお勧めします。
- IMDS へのアクセスを制限する iptables ルールは、ノードの再イメージ化または再起動時に復元されます。
新しいクラスターで IMDS 制限を有効にする
新しいクラスターで IMDS 制限を有効にし、ホスト以外のネットワーク ポッドから IMDS エンドポイントへのすべてのトラフィックをブロックするには、az aks create
パラメーターを指定して --enable-imds-restriction
コマンドを実行します。
az aks create \
--resource-group myResourceGroup \
--name myAKSCluster \
--enable-imds-restriction
既存のクラスターで IMDS 制限を有効にする
既存のクラスターで IMDS 制限を有効にし、ホスト以外のネットワーク ポッドから IMDS エンドポイントへのすべてのトラフィックをブロックするには、az aks update
パラメーターを指定して --enable-imds-restriction
コマンドを実行します。
az aks update \
--resource-group myResourceGroup \
--name myAKSCluster \
--enable-imds-restriction
クラスターを更新したら、クラスターのポッドへのトラフィックのブロックを開始するために、 を使用してクラスター内のノードのaz aks upgrade --node-image-only
を行う必要があります。
IMDS 制限が有効になっているクラスター上のトラフィックを確認する
IMDS 制限が有効であることを確認するには、ホスト以外のネットワーク ポッドとホスト ネットワーク ポッドの両方へのトラフィックをテストします。
ホスト以外のネットワーク ポッド上のトラフィックを確認する
hostNetwork: false
でポッドを作成します。hostNetwork: false
のテスト ポッドがない場合は、次のコマンドを実行することで作成できます。cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: non-host-nw spec: hostNetwork: false containers: - name: non-host-nw image: mcr.microsoft.com/azurelinux/base/nginx:1 command: ["sleep", "infinity"] EOF
kubectl exec
を使用してポッド内のシェルに接続します。kubectl exec -it non-host-nw -- /bin/bash
ポッドから IMDS エンドポイントへのトラフィックをテストします。
curl -s -H Metadata:true --connect-timeout 10 --noproxy "*" "http://169.254.169.254/metadata/instance?api-version=2023-11-15"
約 10 秒待ってから、コマンドが何も返さないことを確認します。これは、接続がタイムアウトしており、ポッドが IMDS エンドポイントにアクセスできないことを意味します。
その後、kubectl delete pod non-host-nw
を使用してポッドをクリーンアップします。
ホスト ネットワーク ポッド上のトラフィックを確認する
hostNetwork: true
でポッドを作成します。hostNetwork: true
のテスト ポッドがない場合は、次のコマンドを実行することで作成できます。cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: host-nw spec: hostNetwork: true containers: - name: host-nw image: mcr.microsoft.com/azurelinux/base/nginx:1 command: ["sleep", "infinity"] EOF
kubectl exec
を使用してポッド内のシェルに接続します。kubectl exec -it host-nw -- /bin/bash
ポッドから IMDS エンドポイントへのトラフィックをテストします
curl -s -H Metadata:true --noproxy "*" "http://169.254.169.254/metadata/instance?api-version=2023-11-15"
コマンドが結果を返すことを確認します。これは、ポッドが想定どおりに IMDS エンドポイントにアクセスできていることを意味します。
その後、kubectl delete pod host-nw
を使用してポッドをクリーンアップします。
クラスターの IMDS 制限を無効にする
既存のクラスターで IMDS 制限を無効にし、任意のポッドから IMDS エンドポイントへのすべてのトラフィックを許可するには、az aks update
パラメーターを指定して --disable-imds-restriction
コマンドを実行します。
az aks update \
--resource-group myResourceGroup \
--name myAKSCluster \
--disable-imds-restriction
クラスターを更新したら、クラスターのポッドへのすべてのトラフィックの許可を開始するために、クラスター内のノードの再イメージ化を行う必要があります。
関連項目
Azure Kubernetes Service