Protege metadatos del clúster

Descripción general

GKE usa metadatos de instancia para configurar 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

Sigue estos pasos a fin de prepararte para esta tarea:

  • Asegúrate de que habilitaste la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Asegúrate de que instalaste el SDK de Cloud.
  • Establece tu ID del proyecto predeterminado:
    gcloud config set project [PROJECT_ID]
  • Si trabajas con clústeres zonales, establece tu zona de procesamiento predeterminada:
    gcloud config set compute/zone [COMPUTE_ZONE]
  • Si trabajas con clústeres regionales, establece tu región de procesamiento predeterminada:
    gcloud config set compute/region [COMPUTE_REGION]
  • Actualiza gcloud a la versión más reciente:
    gcloud components update

Configura una cuenta de servicio de nodo

Debido a que las credenciales de la cuenta de servicio de cada nodo continuarán expuestas a las cargas de trabajo, debes asegurarte de haber configurado una cuenta de servicio con los permisos mínimos que necesita. 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 con la intención de acceder directo a las instancias de los nodos.

No uses una cuenta de servicio que tenga permiso compute.instances.get, la función de administrador de instancia de procesamiento ni otros permisos similares, ya que permiten a los atacantes potenciales obtener metadatos de instancia a través de la API de Compute Engine. La práctica recomendada es restringir los permisos de una VM de nodo mediante los permisos de la cuenta de servicio, y no con niveles de acceso. Para obtener más información, consulta la documentación de las cuentas de servicio de Compute Engine.

Si no tienes una cuenta de servicio de nodo, puedes crear una con los comandos siguientes:

export NODE_SA_NAME=gke-node-sa
gcloud iam service-accounts create $NODE_SA_NAME \
  --display-name "Node Service Account"
export NODE_SA_EMAIL=$(gcloud iam service-accounts list --format='value(email)' \
  --filter='displayName:Node Service Account')

Para configurar tu cuenta de servicio con las funciones y permisos necesarios, debes ejecutar los comandos siguientes. PROJECT es el ID del proyecto:

export PROJECT=$(gcloud config get-value project)

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

Además, si tu clúster extrae imágenes privadas de Container Registry, debes agregar la función storage.objectViewer:

gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/storage.objectViewer

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

Los extremos del servidor de metadatos v1beta1 y v0.1 de Compute Engine quedaron obsoletos y están programados para apagarse. Asegúrate de actualizar todas las solicitudes para usar el extremo v1.

El servidor de metadatos de instancia de Compute Engine expone los extremos heredados v0.1 y v1beta1, que no aplican encabezados de consulta de metadatos. Esta es una característica de las API v1 que dificulta a un atacante potencial recuperar metadatos de la instancia. A menos que sea específicamente necesario, te recomendamos que inhabilites estas API heredadas.

Nota: En la actualidad, puedes inhabilitar las API de metadatos heredados solo cuando se crea un clúster nuevo o se agrega un grupo de nodos nuevo a un clúster existente.

En la próxima sección, se explica cómo hacerlo:

  • Identifica qué nodos acceden a los extremos obsoletos. Si alguno de los nodos usa los extremos obsoletos, debes migrar estos nodos.

  • Crea un clúster nuevo o un grupo de nodos con los extremos del servidor de metadatos heredados inhabilitados para estos nodos identificados.

Identifica los nodos con los extremos del servidor de metadatos heredados

Puedes usar la herramienta check-legacy-endpoint-access para definir cuál de tus nodos de Kubernetes Engine usa los extremos del servidor de metadatos heredados. Cuando se aplica en tu clúster, esta herramienta registra todas las solicitudes a los extremos v0.1 y v1beta1 que realizan tus nodos cada 5 minutos. Esta herramienta también se puede usar para identificar, depurar y verificar el uso de los extremos heredados en Kubernetes Engine.

Para configurar la herramienta check-legacy-endpoint-access, completa los siguientes pasos:

  1. En cada uno de tus clústeres, ejecuta el siguiente comando:

    kubectl apply -f \
    https://raw.githubusercontent.com/GoogleCloudPlatform\
    /k8s-node-tools/master/check-legacy-endpoint-access/check-legacy-endpoint-access.yaml
  2. Consulta los registros recopilados con la información de uso del extremo heredado. Para consultar los registros, en cada clúster, ejecuta el siguiente comando:

    kubectl -n kube-system logs -l \
    app=check-legacy-endpoint-access | grep "access count"

También puedes ver los registros recopilados en Stackdriver Logging.

  1. Ve a la página Stackdriver Logging > Registros (Visor de registros) en Cloud Console:

    Ir a la página Visor de registros

  2. Aplica el siguiente filtro:

    resource.type="container"
    resource.labels.namespace_id="kube-system"
    logName:"/check-legacy-endpoint-access"

    Ir a la vista filtrada

  3. Una vez que identificaste los nodos, debes identificar los procesos que usan estos extremos. Si deseas obtener instrucciones para identificar estos procesos, consulta Identifica los procesos.

  4. Migra estos procesos para que usen el extremo v1 del servidor de metadatos. Si deseas obtener instrucciones para migrar los nodos de Compute Engine y las diferencias en los extremos, consulta Migra al extremo del servidor de metadatos v1.

  5. Quita el daemonset check-legacy-endpoint-access.

    kubectl delete check-legacy-endpoint-access 

Crea un grupo de nodos nuevo con las API de metadatos heredados inhabilitadas

Después de crear una cuenta de servicio, puedes crear un grupo de nodos nuevo (o un grupo de nodos predeterminado en un clúster nuevo) con las API de metadatos heredados inhabilitadas mediante la herramienta de línea de comandos de gcloud.

Para crear un grupo de nodos nuevo con las API de metadatos heredados inhabilitados, debes usar la marca --metadata disable-legacy-endpoints=true. Por ejemplo:

gcloud container node-pools create [POOL_NAME] \
  --service-account=$NODE_SA_EMAIL \
  --metadata disable-legacy-endpoints=true

Se puede crear un clúster nuevo con las API de metadatos heredados inhabilitadas en el grupo de nodos predeterminado mediante la misma marca. Por ejemplo:

gcloud container clusters create [CLUSTER_NAME] \
  --service-account=$NODE_SA_EMAIL \
  --metadata disable-legacy-endpoints=true

Actualiza un clúster existente para inhabilitar las API de metadatos heredados

Después de crear un grupo de nodos nuevo con las API de metadatos heredados inhabilitadas, sigue los pasos de la guía de migración de grupos de nodos para actualizar un clúster existente y poder usarlo.

Verifica que las API de metadatos heredados están inhabilitadas

Cuando se inhabilitan las API de metadatos de instancias heredadas, las solicitudes a los extremos del servidor de metadatos /0.1/ y /v1beta1/ mostrarán 403 Forbidden.

Para verificar que las API de metadatos heredados se inhabilitaron, puedes ejecutar un comando curl desde dentro de un pod:

root@pod-name# curl -H 'Metadata-Flavor: Google' \
'http://metadata.google.internal/computeMetadata/v1/instance/attributes/disable-legacy-endpoints'
true
root@pod-name# curl 'http://metadata.google.internal/computeMetadata/v1beta1/instance/id'
... Error 403 (Forbidden) ... Legacy metadata endpoint accessed: /computeMetadata/v1beta1/instance/id Legacy metadata endpoints are disabled. Please use the /v1/ endpoint. ...

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.

En Kubernetes v1.9.3 y versiones más recientes, puedes habilitar el ocultamiento de metadatos a fin de evitar que los pods de usuario accedan a ciertos metadatos de VM 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.

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.

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 con el ocultamiento de metadatos habilitado mediante la herramienta de línea de comandos de gcloud.

Para crear un clúster con el ocultamiento de metadatos habilitado, debes ejecutar el comando siguiente en tu shell o ventana de la terminal:

gcloud beta container clusters create [CLUSTER_NAME] \
  --workload-metadata-from-node=SECURE \
  --service-account=$NODE_SA_EMAIL \
  --metadata disable-legacy-endpoints=true \
  [additional parameters and flags omitted]

En el ejemplo anterior, se ilustra lo siguiente:

  • [CLUSTER_NAME] es el nombre del clúster que se creará.
  • --workload-metadata-from-node se establece en SECURE; si se establece la marca en EXPOSED o UNSPECIFIED, se inhabilita el ocultamiento de metadatos.

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, puedes ejecutar un comando curl desde dentro de un pod:

root@pod-name# curl -H "Metadata-Flavor: Google" \
'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://www.example.com'
This metadata endpoint is concealed.