Bloquear el acceso de los pods al punto final de Instance Metadata Service (IMDS) de Azure (versión preliminar)

De forma predeterminada, todos los pods que se ejecutan en un clúster de Azure Kubernetes Service (AKS) pueden acceder al punto de conexión de Azure Instance Metadata Service (IMDS). Ahora puede restringir opcionalmente el acceso al punto de conexión de IMDS desde los clústeres de Azure Kubernetes Service (AKS) para mejorar la seguridad (versión preliminar).

Importante

Las características en versión preliminar de AKS están disponibles en régimen de autoservicio y previa suscripción. Las versiones preliminares se proporcionan "tal cual" y "como están disponibles", y están excluidas de los Acuerdos de nivel de servicio y garantía limitada. Las versiones preliminares de AKS reciben cobertura parcial del soporte al cliente en la medida de lo posible. Por lo tanto, estas características no están diseñadas para su uso en producción. Para más información, consulte los siguientes artículos de soporte:

Información sobre la restricción de IMDS para clústeres de AKS

Azure IMDS es una API de REST que proporciona información sobre las instancias de máquina virtual que se ejecutan actualmente. Esta información incluye las SKU, almacenamiento, configuraciones de red y próximos eventos de mantenimiento.

La API de REST de IMDS está disponible en una dirección IP conocida y no enrutable (169.254.169.254) a la que se puede acceder de forma predeterminada desde todos los pods que se ejecutan en un clúster de AKS. Este acceso predeterminado presenta ciertos riesgos de seguridad para un clúster de AKS:

  • Los usuarios malintencionados podrían aprovechar el servicio para obtener información confidencial, como tokens y otra información de plataforma, lo que provoca la pérdida de información.
  • A continuación, se exponen posibles vulnerabilidades de autenticación, ya que las aplicaciones podrían usar estas credenciales de forma incorrecta.

Ahora puede optar por restringir el acceso al punto final de IMDS para los pods que no pertenecen a la red del host y que se ejecutan en su clúster. Los pods que no usan la red del host tienen hostNetwork establecido en false en sus especificaciones. Cuando la restricción IMDS está habilitada, los pods de red que no son host no pueden acceder al punto de conexión de IMDS ni adquirir tokens de OAuth 2.0 para la autorización por parte de una identidad administrada. Los pods de red que no son host deben depender del Id. de carga de trabajo de Microsoft Entra después de habilitar la restricción IMDS.

Los pods de red host tienen hostNetwork establecido en true en sus especificaciones. Los pods con red del host pueden seguir accediendo al punto de conexión de IMDS después de habilitar la restricción de IMDS, ya que comparten el mismo espacio de nombres de red que los procesos del host. Los procesos locales de los nodos pueden utilizar el punto final de IMDS para recuperar metadatos de instancia, por lo que se les permite acceder al punto final una vez activada la restricción de IMDS.

Antes de empezar

  1. Asegúrese de que ha instalado la CLI de Azure versión 2.61.0. Para encontrar la versión, ejecute az --version. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.

  2. Instale la aks-preview extensión de la CLI de Azure versión 7.0.0b2 o posterior.

    • Si aún no tiene la aks-preview extensión, instálela mediante el az extension add comando.

      az extension add --name aks-preview
      
    • Si ya tiene la aks-preview extensión, actualícela para asegurarse de que tiene la versión más reciente mediante el az extension update comando.

      az extension update --name aks-preview
      
  3. Registre el indicador de característica IMDSRestrictionPreview mediante el comando az feature register.

    az feature register --namespace Microsoft.ContainerService --name IMDSRestrictionPreview
    

    Para comprobar el estado de registro se usa el comandoaz feature show. Tarda unos minutos en que el estado muestre Registrado:

    az feature show --namespace Microsoft.ContainerService --name IMDSRestrictionPreview
    

    Cuando aparezca el estado Registrado, actualice el registro del proveedor de recursos Microsoft.ContainerService mediante el comando az provider register:

    az provider register --namespace Microsoft.ContainerService
    
  4. Habilite el emisor de OIDC en el clúster de AKS. Para crear un nuevo clúster o actualizar un clúster existente, consulte Configuración de un clúster de AKS con emisor de OIDC.

Limitaciones

Algunos complementos que necesitan acceder al punto de conexión de IMDS no se admiten con la restricción IMDS. Si tiene estos complementos instalados en el clúster, no puede habilitar la restricción IMDS. Por el contrario, si la restricción IMDS está habilitada, no puede instalar estos complementos. Entre los complementos no admitidos se incluyen:

  • Controlador de entrada de Application Gateway
  • Azure Monitor para contenedores (Container Insights)
  • Nodos virtuales
  • Azure Policy
  • Extensiones de clúster: Flux (GitOps), Dapr, Azure App Configuration, Azure Machine Learning, Azure Container Storage, Azure Backup
  • Operador de cadena de herramientas de IA (versión preliminar)
  • Enrutamiento de solicitudes
  • Enrutamiento de solicitudes HTTP
  • Enrutamiento de aplicaciones web
  • Análisis de costos de Azure

El controlador del proveedor de Azure Key Vault para la interfaz Secrets Store Container Storage Interface (CSI) es ahora compatible con el modo de autenticación de identidad de la carga de trabajo y, por lo tanto, puede funcionar con la restricción IMDS activada.

Además, actualmente los grupos de nodos de Windows no son compatibles con la restricción IMDS.

Precaución

La habilitación de restricciones IMDS para un clúster que usa complementos no admitidos produce un error.

Consideraciones importantes

Cuando se habilita la restricción IMDS, AKS administra las reglas de iptables en el nodo. Tenga en cuenta los siguientes puntos para evitar que las reglas de iptables se quiten o manipulen accidentalmente:

  • Las reglas de iptables se pueden modificar con SSH o node-shell, por lo que se recomienda usar Deshabilitar SSH o usar una directiva para deshabilitar pods con privilegios.
  • Las reglas de iptables que restringen el acceso a IMDS se restauran cuando se restablece la imagen o reinicia el nodo.

Habilitar la restricción IMDS en un nuevo clúster

Para habilitar la restricción de IMDS en un clúster nuevo y bloquear todo el tráfico de los pods que no usan la red del host hacia el extremo de IMDS, ejecute el comando az aks create con el parámetro --enable-imds-restriction.

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

Habilitar la restricción IMDS en un clúster existente

Para habilitar la restricción de IMDS en un clúster existente y bloquear todo el tráfico de los pods de red que no sean host al punto final de IMDS, ejecute el comando az aks update con el parámetro --enable-imds-restriction.

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

Después de actualizar el clúster, debe restablecer la imagen de los nodos del clúster con az aks upgrade --node-image-only para empezar a bloquear el tráfico a los pods del clúster.

Comprobación del tráfico en un clúster con la restricción IMDS habilitada

Para comprobar que la restricción de IMDS está activa, realice pruebas de tráfico tanto hacia los pods de red que no son de host como hacia los de host.

Verificar el tráfico en un pod sin red de host

  1. Cree un pod con hostNetwork: false. Si no tiene un pod de prueba con hostNetwork: false, puede ejecutar el siguiente comando para crear uno.

    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
    
  2. Conéctese al intérprete de comandos del pod con kubectl exec.

    kubectl exec -it non-host-nw -- /bin/bash
    
  3. Pruebe el tráfico del pod al punto de conexión de IMDS.

    curl -s -H Metadata:true --connect-timeout 10 --noproxy "*" "http://169.254.169.254/metadata/instance?api-version=2023-11-15" 
    

Espere unos 10 segundos y compruebe que el comando no devuelve nada, lo que significa que la conexión ha expirado y el pod no puede acceder al punto final de IMDS.

Después de eso, limpie el pod con kubectl delete pod non-host-nw.

Comprobación del tráfico en un pod de red host

  1. Cree un pod con hostNetwork: true. Si no tiene un pod de prueba con hostNetwork: true, puede ejecutar el siguiente comando para crear uno.

    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
    
  2. Conéctese al intérprete de comandos del pod con kubectl exec.

    kubectl exec -it host-nw -- /bin/bash
    
  3. Pruebe el tráfico del pod al punto de conexión de IMDS

    curl -s -H Metadata:true --noproxy "*" "http://169.254.169.254/metadata/instance?api-version=2023-11-15" 
    

Observe que el comando devuelve los resultados, lo que significa que el pod puede acceder a los puntos de conexión de IMDS según lo previsto.

Después, limpia la cápsula con kubectl delete pod host-nw.

Deshabilitar la restricción de IMDS para un clúster

Para desactivar la restricción de IMDS en un clúster existente y permitir que todo el tráfico de cualquier pod se dirija al punto final de IMDS, ejecute el az aks update comando con el --disable-imds-restriction parámetro.

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

Después de actualizar el clúster, debe restablecer la imagen de los nodos del clúster para empezar a bloquear el tráfico a los pods del clúster.

Consulte también

Azure Instance Metadata Service para máquinas virtuales