默认情况下,在 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-previewAzure 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在 AKS 群集上启用 OIDC 颁发者。 要创建新群集或更新现有群集,请参阅使用 OIDC 颁发者配置 AKS 群集。
限制
启用 IMDS 限制时,某些需要访问 IMDS 端点的附加组件不受支持。 如果群集上安装了这些加载项,则无法启用 IMDS 限制。 相反,如果启用了 IMDS 限制,则无法安装这些加载项。 不支持的加载项包括:
- 应用程序网关入口控制器
- 适用于容器的 Azure Monitor(Container Insights)
- 虚拟节点
- Azure Policy
- 群集扩展:Flux (GitOps)、Dapr、Azure 应用程序配置、Azure 机器学习、Azure 容器存储、Azure 备份
- AI 工具链操作器(预览版)
- 应用路由
- HTTP 应用程序路由
- Web 应用程序路由
- Azure 成本分析
用于 Secrets Store 容器存储接口 (CSI) 驱动程序的 Azure 密钥保管库 提供程序现已支持工作负载标识身份验证模式,因此可在启用 IMDS 限制的环境中运行。
此外,IMDS 限制目前不支持 Windows 节点池。
注意
如果为使用不受支持的加载项的群集启用 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,可以运行以下命令来创建一个测试 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,可以运行以下命令来创建一个测试 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。