根據預設,在 Azure Kubernetes Service (AKS) 叢集中執行的所有 Pod 都可以存取 Azure 實例元數據服務 (IMDS) 端點。 您現在可以選擇性地限制從 Azure Kubernetes Service (AKS) 叢集存取 IMDS 端點,以增強安全性(預覽)。
重要
AKS 預覽功能以自助方式提供,並採選擇加入制。 預覽內容係依「現狀」及「可用狀態」提供,且不適用於服務等級協議和有限保固。 AKS 預覽版的部分功能由客戶支援部門盡力提供部分支援。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:
關於 AKS 叢集的 IMDS 限制
Azure IMDS 是 REST API,可提供目前執行中虛擬機實例的相關信息。 此資訊包括 SKU、儲存體、網路組態及近期維護事件。
IMDS REST API 位於已知的不可路由IP位址(169.254.169.254),預設可從AKS叢集中執行的所有 Pod 存取。 此預設存取會為 AKS 叢集帶來某些安全性風險:
- 惡意使用者可能會利用服務來取得令牌和其他平台資訊的敏感性資訊,導致資訊外洩。
- 然後會公開潛在的驗證弱點,因為應用程式可能會誤用這些認證。
您現在可以針對叢集中執行的非主機網路 Pod,選擇限制對 IMDS 端點的存取。 非主機網路的 Pod 將其規格中的hostNetwork設為 false。 啟用 IMDS 限制時,非主機網路 Pod 無法存取 IMDS 端點,或取得受控識別的授權 OAuth 2.0 令牌。 啟用 IMDS 限制後,未使用主機網路的 Pod 應該使用 Microsoft Entra 工作負載 ID。
主機網路的 Pod 將其規格中的hostNetwork設為 true。 啟用 IMDS 限制後,主機網路 Pod 可以繼續存取 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
使用 az feature register 命令註冊
IMDSRestrictionPreview功能旗標。az feature register --namespace Microsoft.ContainerService --name IMDSRestrictionPreview使用 az feature show 命令以驗證註冊狀態。 狀態需要幾分鐘的時間才會顯示「已註冊」:
az feature show --namespace Microsoft.ContainerService --name IMDSRestrictionPreview當狀態顯示為 [已註冊] 時,請使用 az provider register 命令重新整理 Microsoft.ContainerService 資源提供者的註冊:
az provider register --namespace Microsoft.ContainerService在您的 AKS 叢集上啟用 OIDC 發行者。 若要建立新的叢集或更新現有的叢集,請參閱使用 OIDC 簽發者設定 AKS 叢集。
限制
IMDS 限制不支援需要存取 IMDS 端點的特定附加元件。 如果您在叢集上安裝這些附加元件,則無法啟用 IMDS 限制。 相反地,如果已啟用 IMDS 限制,則您無法安裝這些附加元件。 不支援的附加元件包括:
- 應用程式閘道輸入控制器
- 適用於容器的 Azure 監視器 (容器深入解析)
- 虛擬節點
- Azure 原則
- 叢集擴充功能:Flux (GitOps)、Dapr、Azure 應用程式組態、Azure 機器學習、Azure Container Storage、Azure 備份
- AI 工具鏈操作員 (預覽)
- 應用程式路由
- HTTP 應用程式路由
- Web 應用程式路由
- Azure 成本分析
適用於 Secrets Store Container Storage Interface (CSI) 驅動程式的 Azure Key Vault 提供者現在支援工作負載身分識別驗證模式,因此可在啟用 IMDS 限制的情況下運作。
此外,IMDS 限制目前不支援 Windows 節點集區。
警告
針對使用不支援附加元件之叢集啟用 IMDS 限制會導致錯誤。
重要考量
啟用 IMDS 限制時,AKS 會管理節點上的 iptables 規則。 請記住下列幾點,以防止iptables規則意外移除或竄改:
- iptables 規則可以使用 SSH 或節點命令行來修改,因此我們建議使用 停用 SSH 或使用策略來停用具高權限的 Pod。
- 當節點 重新建立映像 或重新啟動時,限制對 IMDS 存取的 iptables 規則會恢復。
在新叢集上啟用 IMDS 限制
若要啟用新叢集的 IMDS 限制,並封鎖從非主機網路 Pod 到 IMDS 端點的所有流量,請使用 az aks create 參數執行 --enable-imds-restriction 命令。
az aks create \
--resource-group myResourceGroup \
--name myAKSCluster \
--enable-imds-restriction
在現有叢集上啟用 IMDS 限制
若要對現有叢集啟用 IMDS 限制,並封鎖來自非主機網路 Pod 到 IMDS 端點的所有流量,請使用 az aks update 參數執行 --enable-imds-restriction 命令。
az aks update \
--resource-group myResourceGroup \
--name myAKSCluster \
--enable-imds-restriction
更新叢集後,您必須使用az aks upgrade --node-image-only在叢集中重新安裝映像節點,才能開始封鎖流到叢集 Pod 的流量。
確認已啟用 IMDS 限制的叢集流量
若要確認 IMDS 限制有效,請測試非主機和主機網路 Pod 的流量。
確認非主機網路 Pod 上的流量
使用
hostNetwork: false建立 Pod。 如果您沒有包含hostNetwork: false的測試 Pod,您可以執行下列命令來建立。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連線到 Pod 中的 Shell。kubectl exec -it non-host-nw -- /bin/bash測試從 Pod 到 IMDS 端點的流量。
curl -s -H Metadata:true --connect-timeout 10 --noproxy "*" "http://169.254.169.254/metadata/instance?api-version=2023-11-15"
等待約 10 秒,並觀察命令不會傳回任何內容,這表示連線已逾時,且 Pod 無法存取 IMDS 端點。
之後,請使用kubectl delete pod non-host-nw來清理該 Pod。
驗證主機網路 Pod 上的流量
使用
hostNetwork: true建立 Pod。 如果您沒有含有hostNetwork: true的測試 pod,您可以執行下列命令來建立一個。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連線至 Pod 內的 Shell。kubectl exec -it host-nw -- /bin/bash測試從 Pod 到 IMDS 端點的流量
curl -s -H Metadata:true --noproxy "*" "http://169.254.169.254/metadata/instance?api-version=2023-11-15"
觀察命令傳回結果,這表示 Pod 可以如預期般存取 IMDS 端點。
之後,請使用kubectl delete pod host-nw來清理該 Pod。
停用叢集的 IMDS 存取限制
若要停用現有叢集的 IMDS 限制,並允許所有從任何 Pod 到 IMDS 端點的流量,請使用 az aks update 參數執行 --disable-imds-restriction 命令。
az aks update \
--resource-group myResourceGroup \
--name myAKSCluster \
--disable-imds-restriction
更新叢集後,您必須在叢集中重新安裝映像節點,才能開始允許所有流量流到叢集的 Pod。