Protege metadatos del clúster


Google Kubernetes Engine (GKE) usa metadatos de instancia para configurar máquinas virtuales (VM) de nodo. Sin embargo, algunos de estos metadatos pueden ser sensibles y se deben proteger de las cargas de trabajo que se ejecutan en el clúster.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.

Configura una cuenta de servicio de nodo

Las credenciales de la cuenta de servicio de cada nodo continúan expuestas a las cargas de trabajo. De forma predeterminada, tus nodos usan la cuenta de servicio predeterminada de Compute Engine. Debes configurar una cuenta de servicio con privilegios mínimos para que tus nodos la usen, en lugar de la cuenta de servicio predeterminada de Compute Engine. Luego, adjunta esta cuenta de servicio a tus nodos para que un atacante no pueda eludir las protecciones de metadatos de GKE mediante la API de Compute Engine a fin de acceder directamente a las instancias de VM subyacentes.

Para obtener más información, consulta Usa las cuentas de servicio de nodo con privilegios mínimos.

Para crear una cuenta de servicio de nodo con privilegios mínimos, realiza los siguientes pasos:

  1. Crea una cuenta de servicio de administración de identidades y accesos (IAM) nueva y guarda la dirección de correo electrónico en una variable de entorno:

    gcloud iam service-accounts create NODE_SA_NAME \
        --display-name="DISPLAY_NAME"
    export NODE_SA_EMAIL=$(gcloud iam service-accounts list --format='value(email)' \
        --filter='displayName:DISPLAY_NAME')
    

    Reemplaza lo siguiente:

    • NODE_SA_NAME: El nombre de tu cuenta de servicio de nodo nueva.
    • DISPLAY_NAME: Es el nombre visible de la cuenta de servicio nueva.

    La dirección de correo electrónico de la cuenta de servicio de nodo tiene el formato NODE_SA_NAME@PROJECT_ID.iam.gserviceaccount.com.

  2. Configura tu cuenta de servicio con las funciones y permisos mínimos para ejecutar tus nodos de GKE:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/monitoring.metricWriter
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/monitoring.viewer
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/logging.logWriter
    

    Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud.

    Además, si tu clúster extrae imágenes privadas de Artifact Registry, debes agregar la función roles/artifactregistry.reader:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/artifactregistry.reader
    

Ocultamiento de metadatos

El ocultamiento de metadatos de GKE protege algunos metadatos del sistema, que pueden ser sensibles, de las cargas de trabajo de los usuarios que se ejecutan en tu clúster.

Puedes habilitar el ocultamiento de metadatos a fin de evitar que los pods de usuario accedan a ciertos metadatos de VMs de los nodos de tu clúster, como las credenciales de Kubelet y la información de instancias de VM. En particular, el ocultamiento de metadatos protege el acceso a kube-env (que contiene las credenciales de Kubelet) y al token de identidad de instancia de la VM.

Los metadatos ocultan el tráfico del firewall de los pods de usuario (pods que no se ejecutan en HostNetwork) al servidor de metadatos del clúster, lo que solo permite consultas seguras. El firewall evita que los pods de usuario usen las credenciales de Kubelet para los ataques de elevación de privilegios o que usen la identidad de VM para los ataques de elevación de instancia.

Solo puedes habilitar el ocultamiento de metadatos cuando creas un clúster nuevo o agregas un grupo de nodos nuevo a un clúster existente.

Limitaciones

  • El ocultamiento de metadatos solo protege el acceso a kube-env y al token de identidad de la instancia del nodo.
  • El ocultamiento de metadatos no restringe el acceso a la cuenta de servicio del nodo.
  • El ocultamiento de metadatos no restringe el acceso a otros metadatos de instancia relacionados.
  • El ocultamiento de metadatos no restringe el acceso a otras API de metadatos heredados.
  • El ocultamiento de metadatos no restringe el tráfico de los Pods que se ejecutan en la red del host (hostNetwork: true en la especificación del Pod).

Crea un clúster o grupo de nodos nuevo con ocultamiento de metadatos

Después de crear una cuenta de servicio, puedes crear un clúster nuevo o un grupo de nodos con el ocultamiento de metadatos habilitado mediante la Google Cloud CLI.

Crea un clúster nuevo

Para crear un clúster con el ocultamiento de metadatos habilitado, debes ejecutar el comando siguiente:

gcloud beta container clusters create CLUSTER_NAME \
  --workload-metadata-from-node=SECURE \
  --service-account=$NODE_SA_EMAIL

Reemplaza CLUSTER_NAME por el nombre de tu clúster nuevo.

La marca --workload-metadata-from-node toma los siguientes valores:

  • SECURE: habilita el ocultamiento de metadatos.
  • EXPOSED o UNSPECIFIED: inhabilita el ocultamiento de metadatos.

Crea un grupo de nodos nuevo

Para crear un grupo de nodos con el ocultamiento de metadatos habilitado, debes ejecutar el siguiente comando:

gcloud beta container node-pools create NODE_POOL_NAME \
  --cluster=CLUSTER_NAME \
  --workload-metadata-from-node=SECURE \
  --service-account=$NODE_SA_EMAIL

Reemplaza NODE_POOL_NAME por el nombre del grupo de nodos nuevo.

Verifica los metadatos del token de identidad ocultos de la carga de trabajo del clúster

Cuando ocultas metadatos, no debería ser posible solicitar una firma a través del token de identidad de la instancia del nodo. Para verificar que las solicitudes informen de manera explícita a los usuarios de metadatos ocultos, haz lo siguiente:

  1. Abre una sesión de shell en un Pod nuevo:

    kubectl run metadata-concealment -it --image=google/cloud-sdk:slim -- /bin/bash
    
  2. En el Pod, intenta obtener un extremo oculto:

    curl -H "Metadata-Flavor: Google" \
    'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://www.example.com'
    

    El resultado es similar a este:

    This metadata endpoint is concealed.
    

Inhabilita y realiza la transición desde la API de metadatos heredados

Los extremos del servidor de metadatos de Compute Engine v0.1 y v1beta1 quedaron obsoletos y se cerraron el 30 de septiembre de 2020.

Para ver el programa de baja, consulta Baja de los extremos del servidor de metadatos v0.1 y v1beta1.

¿Qué sigue?