默认情况下,在 Azure Kubernetes 服务 (AKS) 群集中运行的所有 pod 都可以访问 Azure 实例元数据服务 (IMDS) 终结点。 现在可以选择限制从 Azure Kubernetes 服务 (AKS) 群集对 IMDS 终结点的访问以增强安全性(预览版)。
重要
AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:
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 Workload 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
IMDS 限制不支持某些需要访问 IMDS 终结点的加载项。 如果群集上安装了这些加载项,则无法启用 IMDS 限制。 相反,如果启用了 IMDS 限制,则无法安装这些加载项。 不支持的加载项包括:
- 应用程序网关入口控制器
- 适用于容器的 Azure Monitor(容器见解)
- 虚拟节点
- Azure Policy
- GitOps
- AI 工具链操作器(预览版)
机密存储容器存储接口 (CSI) 驱动程序的 Azure Key Vault 提供程序现在支持工作负载标识身份验证模式,因此可以在启用了 IMDS 限制的情况下工作。
注意
如果为使用不受支持的加载项的群集启用 IMDS 限制,会导致错误。
启用 IMDS 限制后,AKS 会管理节点上的 iptables 规则。 请记住以下几点,以防止意外移除或篡改 iptables 规则:
- 由于可以使用 SSH 或 node-shell 修改 iptables 规则,因此建议使用禁用 SSH 或通过使用策略来禁用特权 pod。
- 当节点重置映像或重启时,会还原限制对 IMDS 的访问的 iptables 规则。
要对新群集启用 IMDS 限制并阻止从非主机网络 pod 到 IMDS 终结点的所有流量,请运行带有 --enable-imds-restriction
参数的 az aks create
命令。
az aks create \
–-resource-group myResourceGroup \
-–name myAKSCluster \
--enable-imds-restriction
要对现有群集启用 IMDS 限制并阻止从非主机网络 pod 到 IMDS 终结点的所有流量,请运行带有 --enable-imds-restriction
参数的 az aks update
命令。
az aks update \
-–resource-group myResourceGroup \
-–name myAKSCluster \
--enable-imds-restriction
更新群集后,必须使用 az aks upgrade --node-image-only
对群集中的节点重置映像,以开始阻止流向群集 pod 的流量。
为了验证 IMDS 限制是否生效,请测试流向非主机和主机网络 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.azk8s.cn/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。
使用
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.azk8s.cn/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 限制并允许从任何 pod 流向 IMDS 终结点的所有流量,请运行带有--disable-imds-restriction
参数的 az aks update
命令。
az aks update \
–-resource-group myResourceGroup \
–-name myAKSCluster \
--disable-imds-restriction
更新群集后,必须使用对群集中的节点重置映像,以开始允许流向群集 pod 的所有流量。