默认情况下,在 Azure Kubernetes 服务(AKS)群集中运行的所有 Pod 都可以访问 Azure 实例元数据服务(IMDS) 终结点。 现在可以选择限制从 Azure Kubernetes 服务 (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
使用
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
- 群集扩展:Flux (GitOps)、Dapr、Azure 应用程序配置、Azure 机器学习、Azure 容器存储、Azure 备份
- AI 工具链操作器(预览版)
- 应用路由
- HTTP 应用程序路由
- Web 应用程序路由
- Azure 成本分析
此外,Windows 节点池目前不支持 IDMS 限制。
机密存储容器存储接口 (CSI) 驱动程序的 Azure Key Vault 提供程序现在支持工作负载标识身份验证模式,因此可以在启用了 IMDS 限制的情况下工作。
注意
如果为使用不受支持的加载项的群集启用 IMDS 限制,会导致错误。
重要注意事项
启用 IMDS 限制后,AKS 会管理节点上的 iptables 规则。 请记住以下几点,以防止意外移除或篡改 iptables 规则:
- iptables 规则可以使用 SSH 或 node-shell 进行修改,因此我们建议使用 “禁用 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.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。
验证主机网络 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 限制
要对现有群集禁用 IMDS 限制并允许从任何 pod 流向 IMDS 终结点的所有流量,请运行带有az aks update
参数的 --disable-imds-restriction
命令。
az aks update \
--resource-group myResourceGroup \
--name myAKSCluster \
--disable-imds-restriction
更新群集后,必须重镜像集群中的节点,以开始允许所有流量进入集群的 Pod。