阻止 pod 访问 Azure 实例元数据服务 (IMDS) 终结点(预览版)

默认情况下,在 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 Workload ID

主机网络 pod 在其规范中将 hostNetwork 设置为“true”。 启用 IMDS 限制后,主机网络 pod 可以继续访问 IMDS 终结点,因为它们与主机进程共享相同的网络命名空间。 节点中的本地进程可以使用 IMDS 终结点来检索实例元数据,因此在启用 IMDS 限制后,它们可以访问终结点。

开始之前

  1. 确保已安装 Azure CLI 版本 2.61.0 或更高版本。 要查找版本,请运行 az --version。 如果需要进行安装或升级,请参阅安装 Azure CLI

  2. 安装 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
      
  3. 使用 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 限制

要对新群集启用 IMDS 限制并阻止从非主机网络 pod 到 IMDS 终结点的所有流量,请运行带有 --enable-imds-restriction 参数的 az aks create 命令。

az aks create \
    –-resource-group myResourceGroup \
    -–name myAKSCluster \
    --enable-imds-restriction

对现有群集启用 IMDS 限制

要对现有群集启用 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 限制的群集上的流量

为了验证 IMDS 限制是否生效,请测试流向非主机和主机网络 pod 的流量。

验证非主机网络 pod 上的流量

  1. 使用 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
    
  2. 使用 kubectl exec 连接到 pod 中的 shell。

    kubectl exec -it non-host-nw -- /bin/bash
    
  3. 测试从 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 上的流量

  1. 使用 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
    
  2. 使用 kubectl exec 连接到 pod 中的 shell。

    kubectl exec -it host-nw -- /bin/bash
    
  3. 测试从 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 终结点的所有流量,请运行带有--disable-imds-restriction 参数的 az aks update 命令。

az aks update \
    –-resource-group myResourceGroup \
    –-name myAKSCluster \
    --disable-imds-restriction

更新群集后,必须使用对群集中的节点重置映像,以开始允许流向群集 pod 的所有流量。

另请参阅

适用于虚拟机的 Azure 实例元数据服务