Migra desde permisos de acceso heredados

En esta página se explican los cambios en los permisos de acceso de los clústeres que ejecutan la versión 1.10 de Kubernetes y versiones posteriores. Estos cambios solo afectan las interacciones de los clústeres con Cloud Storage y Compute Engine.

¿Qué son los permisos de acceso?

Los permisos de acceso constituyen el método heredado para especificar los permisos de los nodos y de las cargas de trabajo que se ejecutan en ellos, en caso de que estas usen las credenciales predeterminadas de la aplicación (ADC). En los clústeres que ejecutan versiones de Kubernetes anteriores a la 1.10, se le otorgó un conjunto de permisos de acceso predeterminados a la cuenta de servicio predeterminada del clúster. gcloud y Google Cloud Console otorgaron los permisos de acceso compute-rw y storage-ro a estos clústeres:

  • compute-rw otorga acceso completo a todos los métodos de la API de Compute Engine.
  • storage-ro otorga acceso de solo lectura a todos los recursos de Cloud Storage, incluidas las imágenes privadas que se almacenan en Container Registry.

Cambios en los permisos de acceso

A partir de la versión 1.10 de Kubernetes, gcloud y Cloud Console ya no otorgan de forma predeterminada el permiso de acceso de compute-rw en los clústeres y grupos de nodos nuevos. Además, si --scopes se especifica en gcloud container create, gcloud ya no agrega compute-rw o storage-ro de forma automática.

Estos cambios garantizan que tu cuenta de servicio predeterminada solo tenga los permisos necesarios para ejecutar el clúster, lo que mejora la seguridad del proyecto.

¿Se ven afectadas las cargas de trabajo?

Si las cargas de trabajo no requieren llamar a las API a las que se otorga acceso mediante estos permisos, no es necesario hacer nada.

Sin embargo, si las cargas de trabajo requieren permiso para interactuar con Compute Engine o Cloud Storage, es posible que se vean afectadas. Recomendamos crear una cuenta de servicio personalizada con las funciones equivalentes de Cloud Identity and Access Management.

Si anulas los permisos y las cargas de trabajo requieren permiso para interactuar con Cloud Storage, lo que incluye extraer imágenes privadas de contenedores de Container Registry, también se debe incluir el permiso storage-ro.

De forma alternativa, para replicar el comportamiento de los clústeres anteriores a la versión 1.10, consulta Revierte a los permisos de acceso heredados.

Impacto

Compute Engine y Cloud Storage muestran errores 403 a las aplicaciones que se ejecutan en los clústeres de Kubernetes 1.10 y que no tienen los permisos necesarios.

Además, en la respuesta a una solicitud con permisos insuficientes, se incluye un encabezado HTTP que detalla los permisos necesarios. Por ejemplo:

WWW-Authenticate: Bearer realm="https://accounts.google.com/", error=insufficient_scope, scope="https://www.googleapis.com/auth/compute.readonly"
    

Configura una cuenta de servicios personalizada para las cargas de trabajo

Cloud Identity and Access Management es el sistema de control de acceso para otorgar funciones autorizadas a usuarios y cuentas de servicio dentro del proyecto de GCP. Una cuenta de servicio es una Cuenta de Google especial que realiza tareas, como la implementación de aplicaciones, en tu nombre. Puedes usar Cloud IAM a fin de crear una cuenta de servicio y, luego, usar las vinculaciones de políticas de Cloud IAM para proteger la cuenta.

Si las cargas de trabajo requieren acceso a Compute Engine, otorga la función de administrador de Compute Engine a la cuenta de servicio. Si las cargas de trabajo necesitan extraer imágenes privadas de Container Registry, otórgales la función de visualizador de objetos de almacenamiento.

Crea una cuenta de servicio

Para crear una cuenta de servicio personalizada llamada kubernetes-engine-node-sa, ejecuta los siguientes comandos:

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

Otorga funciones mínimas

Si deseas configurar la cuenta de servicio con la cantidad mínima de funciones y permisos para GKE, ejecuta los siguientes comandos, donde $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
    

Otorga funciones adicionales

Para otorgar la función de administrador de Compute Engine a la cuenta de servicio, ejecuta el siguiente comando:

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

Para otorgar la función de visualizador de objetos de almacenamiento, haz lo siguiente:

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

Para aprender a otorgarle a las cuentas de servicio acceso a las imágenes privadas almacenadas en Container Registry, consulta Otorga acceso a un registro a los usuarios y otros proyectos.

Crea un clúster o grupo de nodos con la cuenta de servicios personalizada

Si deseas crear un clúster que use la cuenta de servicio personalizada, ejecuta el siguiente comando:

gcloud container clusters create --service-account=$NODE_SA_EMAIL
    

Para crear un grupo de nodos en un clúster existente, usa este comando:

gcloud container node-pools create --service-account=$NODE_SA_EMAIL
    

Revierte a los permisos de acceso heredados

Si deseas seguir usando los permisos de acceso heredados en clústeres que ejecutan la versión 1.10 de Kubernetes y versiones posteriores, debes agregarlos de forma manual.

Console

Para crear un clúster con Cloud Console, sigue estos pasos:

  1. Visita el menú de Google Kubernetes Engine en Cloud Console.

    Ir al menú de Google Kubernetes Engine

  2. Haz clic en Crear clúster.

  3. En Versión principal selecciona Kubernetes 1.10.

  4. Configura el clúster como quieras. Aún no hagas clic en Crear.

  5. Haz clic en Edición avanzada para el grupo de nodos predeterminado.

  6. En la sección Permisos de acceso, selecciona Configurar el acceso para cada API.

  7. En Compute Engine, selecciona Lectura/escritura. De forma predeterminada, el almacenamiento debería ser de Solo lectura.

  8. Haz clic en Guardar para salir de la Edición avanzada.

  9. Haz clic en Crear.

gcloud

Para crear un clúster, ejecuta el siguiente comando:

gcloud container clusters create example-cluster --scopes compute-rw,gke-default
    

Para crear un grupo de nodos en un clúster existente, usa este comando:

gcloud container node-pools create example-pool --scopes compute-rw,gke-default