Proteger 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 a fin de acceder directamente a las instancias de los nodos.

No uses una cuenta de servicio que tenga el permiso compute.instances.get, la función de administrador de Compute Instance o permisos similares, ya que permiten que los atacantes potenciales obtengan metadatos de instancia con la API de Compute Engine. La recomendación es restringir los permisos de una VM de nodo mediante el uso de los permisos de cuenta de servicio, no de niveles de acceso. Para obtener más información, consulta la documentación de las cuentas de servicio de Compute Engine.

gcloud

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

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, ejecuta los siguientes comandos. PROJECT es tu 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 del Container Registry, agrega la función storage.objectViewer:

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

Inhabilita las API de metadatos heredados

El servidor de metadatos de instancia de Compute Engine expone los extremos heredados /0.1/ y /v1beta1/, que no imponen los encabezados de consultas de metadatos. Esta es una característica de las API /v1/ que dificulta que un atacante potencial pueda recuperar los metadatos de instancia. A menos que sea específicamente necesario, te recomendamos que inhabilites estas API heredadas.

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.

gcloud

Para crear un grupo de nodos nuevo con las API de metadatos heredados inhabilitadas, usa 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 en 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 las API de metadatos de la instancia heredada están inhabilitadas, las solicitudes a los extremos del servidor de metadatos /0.1/ y /v1beta1/ mostrarán 403 Forbidden.|

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

cURL

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 el token de identidad de la instancia de VM.

El tráfico del firewall de ocultamiento de metadatos desde los pods de usuario (pods que no se ejecutan en HostNetwork) hasta el servidor de metadatos del clúster 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 el token de identidad de 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.

gcloud

To create a cluster with metadata concealment enabled, run the following
command in your shell or terminal window:

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

donde:

  • [CLUSTER_NAME] es el nombre del clúster que se creará.
  • --workload-metadata-from-node está configurado como SECURE. Establecer la marca como EXPOSED o UNSPECIFIED 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:

cURL

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.
¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…