Configura el control de acceso

En esta página, se describen los permisos para controlar el acceso a Container Registry.

Después de configurar los permisos, puedes configurar la autenticación para los clientes de Docker que usas para enviar y extraer imágenes.

Si usas Container Analysis para trabajar con metadatos de contenedor, como vulnerabilidades encontradas en las imágenes, consulta la documentación de Container Analysis para obtener información sobre cómo otorgar acceso para ver o administrar metadatos.

Requisitos generales de acceso

Todos los usuarios, las cuentas de servicio y otras entidades que interactúan con Container Registry deben tener los permisos adecuados de administración de identidades y accesos (IAM) para el almacenamiento de Cloud Storage.

En la cuenta de servicio que usan las VM de Compute Engine, incluidas las VM en los clústeres de Google Kubernetes Engine, el acceso se basa en los permisos de IAM y los permisos de acceso.

Permisos para la cuenta de servicio de Container Registry

El agente de servicio de Container Registry es una cuenta de servicio administrada por Google que actúa en nombre de Container Registry cuando interactúa con los servicios de Google Cloud.

A fin de aplicar el principio de seguridad de menor privilegio, a esta cuenta de servicio se le otorga la función de agente de servicio de Container Registry en proyectos en los que la API de Container Registry se haya habilitado después del 5 de octubre de 2020. Esta función tiene los siguientes permisos:

  • Temas de publicación: pubsub.topics.publish
  • Lee las LCA del objeto de almacenamiento: storage.objects.getIamPolicy
  • Lee datos y metadatos de objeto de almacenamiento: storage.objects.get
  • Enumera los objetos de almacenamiento de un depósito y lee los metadatos de objetos: storage.objects.list

Anteriormente, a la cuenta de servicio de Container Registry se le otorgó la función Editor. Dado que la función de editor otorga permisos para crear y borrar la mayoría de los recursos de un proyecto, te recomendamos que restrinjas los permisos si tu cuenta de servicio de Container Registry tiene esta función.

Para verificar los permisos actuales de tu cuenta de servicio de Container Registry, ejecuta el siguiente comando:

gcloud projects get-iam-policy PROJECT-ID  \
--flatten="bindings[].members" \
--format='table(bindings.role)' \
--filter="bindings.members:service-PROJECT-NUMBER@containerregistry.iam.gserviceaccount.com"

Donde

  • PROJECT-ID es el ID del proyecto de Google Cloud.
  • PROJECT-NUMBER es el número de proyecto de Google Cloud.

Puedes obtener el ID del proyecto y el número de proyecto en Google Cloud Console o con los siguientes comandos:

PROJECT=$(gcloud config get-value project)
echo $PROJECT && gcloud projects list --filter="$PROJECT" --format="value(PROJECT_NUMBER)"

Para otorgar la función de agente de servicio de Container Registry y revocar la función de editor, sigue estos pasos:

  1. Otorga la función de Agente de servicio de Container Registry con el siguiente comando:

    gcloud projects add-iam-policy-binding PROJECT-ID \
    --member=serviceAccount:service-PROJECT-NUMBER@containerregistry.iam.gserviceaccount.com --role=roles/containerregistry.ServiceAgent
    
  2. Revoca la función de editor con el siguiente comando:

    gcloud projects remove-iam-policy-binding PROJECT-ID \
    --member=serviceAccount:service-PROJECT-NUMBER@containerregistry.iam.gserviceaccount.com --role=roles/editor
    

Permisos de IAM

Los permisos de Cloud IAM determinan quién puede acceder a los recursos. Todos los usuarios, las cuentas de servicio y otras identidades que interactúan con Container Registry deben tener los permisos de Cloud Storage adecuados.

De forma predeterminada, Google Cloud usa cuentas de servicio predeterminadas para interactuar con recursos dentro del mismo proyecto. Por ejemplo, la cuenta de servicio de Cloud Build puede enviar y extraer imágenes cuando Container Registry está en el mismo proyecto.

Debes configurar o modificar los permisos tú mismo si:

  • Usas una cuenta de servicio en un proyecto para acceder a Container Registry en otro proyecto
  • Usas una cuenta de servicio predeterminada con acceso de solo lectura al almacenamiento, pero deseas extraer y enviar imágenes
  • Usas una cuenta de servicio personalizada para interactuar con Container Registry

Permisos de acceso para VM y clústeres

Para las cuentas de servicio asociadas con las VM de Compute Engine, incluidas las VM en los clústeres de GKE, el acceso al almacenamiento se basa en los permisos de IAM y el permiso de acceso de almacenamiento configurado.

La cuenta de servicio predeterminada de Compute Engine está configurada para extraer imágenes en el mismo proyecto que la VM. Si necesitas una VM o un clúster de GKE para extraer imágenes o interactuar con Container Registry en un proyecto diferente, consulta Usa Container Registry con Google Cloud.

Configura permisos de IAM

Container Registry usa depósitos de Cloud Storage como almacenamiento subyacente para las imágenes de contenedor. Para controlar el acceso a tus imágenes, otorga los permisos de Cloud Storage adecuados a un usuario, grupo, cuenta de servicio o a otra identidad.

Los permisos de Cloud Storage otorgados a nivel de proyecto se aplican a todos los depósitos de almacenamiento del proyecto, no solo a los que usa Container Registry. Para configurar permisos específicos de Container Registry, otórgalos en el bucket de almacenamiento que usa el registro. Container Registry ignora los permisos configurados en objetos individuales dentro del bucket de almacenamiento.

Aunque también puedes usar las funciones de nivel de proyecto Owner, Editor y Viewer para otorgar acceso, las funciones de Cloud Storage te permiten aplicar el principio de seguridad de menor privilegio, para que los usuarios y las cuentas de servicio solo tengan los permisos necesarios.

Los productos y las aplicaciones de Google Cloud que interactúan con Google Cloud usan cuentas de servicio para interactuar con Container Registry. Las siguientes consideraciones se aplican al acceso de la cuenta de servicio:

  • De forma predeterminada, las cuentas de servicio para algunas integraciones comunes se configuran con acceso a Container Registry dentro del mismo proyecto. Por ejemplo, de forma predeterminada, la cuenta de servicio de Cloud Build puede enviar y extraer imágenes del mismo proyecto.
  • Si la cuenta de servicio necesita acceder a Container Registry en otro proyecto, debes otorgar los permisos necesarios en el proyecto con Container Registry.
  • Las instancias de VM, incluidas las de los clústeres de Google Kubernetes Engine, deben tener configurados los niveles de acceso de almacenamiento correctos para enviar o extraer imágenes. De forma predeterminada, las VM pueden extraer imágenes cuando Container Registry está en el mismo proyecto.

Permisos y funciones

En la siguiente tabla, se explican los permisos y las funciones que se requieren para las acciones de Container Registry.

Para obtener más información sobre las funciones y los permisos de Cloud Storage, consulta la documentación de Cloud Storage.

Acción Permisos Función Título de la función
Envío (lectura y escritura)

storage.buckets.create

storage.buckets.delete

storage.buckets.get

storage.buckets.list

storage.buckets.update

storage.objects.create

storage.objects.delete

storage.objects.get

storage.objects.list

storage.objects.update

roles/storage.admin Administrador de almacenamiento
Extracción (solo lectura)

storage.objects.get

storage.objects.list

roles/storage.objectViewer Visualizador de objetos de almacenamiento

Otorga permisos de IAM

Otorga permisos en el bucket de almacenamiento que usa Container Registry.

Otorga permisos

  1. Si la ubicación de host de Container Registry (gcr.io, asia.gcr.io, eu.gcr.io, us.gcr.io) no existe en el proyecto, un usuario con permisos de propietario, editor o administrador de almacenamiento debe crear el depósito de almacenamiento mediante el envío de una imagen al host.
  2. En el proyecto con Container Registry, otorga los permisos adecuados en el bucket de Cloud Storage que usa el nombre de host.

    El depósito que almacena tus imágenes tiene el nombre BUCKET-NAME con el siguiente formato:

    • artifacts.PROJECT-ID.appspot.com para las imágenes enviadas a un registro en el host gcr.io, o
    • STORAGE-REGION.artifacts.PROJECT-ID.appspot.com

    Donde

    • PROJECT-ID es el ID de tu proyecto de Google Cloud Console.
    • STORAGE-REGION es la ubicación del depósito de almacenamiento:
      • us para los registros en el host us.gcr.io
      • eu para los registros en el host eu.gcr.io
      • asia para los registros en el host asia.gcr.io

    Puedes otorgar permiso para un depósito con Google Cloud Console o la herramienta de línea de comandos de gsutil.

    Console

    1. Visita la página de Cloud Storage en Cloud Console.
    2. Haz clic en el vínculo artifacts.PROJECT-ID.appspot.com o STORAGE-REGION.artifacts.PROJECT-ID.appspot.com para el depósito.

      Aquí, PROJECT-ID es el ID del proyecto de Google Cloud del proyecto que aloja Container Registry y STORAGE-REGION es la multirregión (asiaeuus) del registro que aloja la imagen.

    3. Selecciona la pestaña Permisos.

    4. Haz clic en Agregar miembros.

    5. En el menú que aparece, completa el campo Miembros con las direcciones de correo electrónico de los usuarios que necesitan permiso, separadas por comas. Estas direcciones de correo electrónico pueden ser de los siguientes tipos:

      • una Cuenta de Google (por ejemplo, someone@example.com)
      • Un Grupo de Google (por ejemplo, my-developer-team@googlegroups.com)
      • Una cuenta de servicio de IAM
      • la cuenta de servicio predeterminada de Compute Engine de otro proyecto Google Kubernetes Engine utiliza esta cuenta para extraer los clústeres de imágenes de contenedor de forma predeterminada. Tiene el formato PROJECT-NUMBER-compute@developer.gserviceaccount.com, donde PROJECT-NUMBER es el número del proyecto de Google Cloud que ejecuta el clúster de Google Kubernetes Engine.
    6. En el menú desplegable Seleccionar una función, la categoría Almacenamiento y, luego, selecciona el permiso correspondiente.

      • El Visualizador de objetos de Storage extrae solo las imágenes
      • El Administrador de objetos de almacenamiento envía y extrae imágenes
    7. Haga clic en Add.

    gsutil

    1. Ejecuta el siguiente comando para mostrar una lista de los depósitos en el proyecto:

      gsutil ls
      

      La respuesta se ve como el siguiente ejemplo:

      gs://[BUCKET_NAME1]/
      gs://[BUCKET_NAME2]/
      gs://[BUCKET_NAME3]/ ...
      
    2. Ejecuta el siguiente comando en el shell o la ventana de la terminal:

      gsutil iam ch TYPE:EMAIL-ADDRESS:ROLE gs://BUCKET_NAME
      

      Donde

      • TYPE puede ser una de las siguientes opciones:
        • serviceAccount, si EMAIL-ADDRESS especifica una cuenta de servicio
        • user, si EMAIL-ADDRESS es una Cuenta de Google
        • group, si EMAIL-ADDRESS es un Grupo de Google.
      • EMAIL-ADDRESS puede ser una de las siguientes opciones:
        • una Cuenta de Google (por ejemplo, someone@example.com)
        • Un Grupo de Google (por ejemplo, my-developer-team@googlegroups.com)
        • Una cuenta de servicio de IAM
        • la cuenta de servicio predeterminada de Compute Engine de otro proyecto Google Kubernetes Engine utiliza esta cuenta para extraer los clústeres de imágenes de contenedor de forma predeterminada. Tiene el formato PROJECT_NUMBER-compute@developer.gserviceaccount.com, donde PROJECT_NUMBER es el número del proyecto de Google Cloud que ejecuta el clúster de Google Kubernetes Engine.
      • ROLE es la función de Cloud Storage que deseas otorgar.
        • objectViewer para extraer imágenes
        • objectAdmin para enviar y extraer imágenes
      • BUCKET_NAME es el nombre del depósito de Cloud Storage en el formato artifacts.PROJECT-ID.appspot.com o STORAGE-REGION.artifacts.PROJECT-ID.appspot.com.

    El comando gsutil iam ch cambia los permisos de IAM del depósito de almacenamiento en el que se aloja el registro. Si otorgas permisos objectViewer a una cuenta, esta podrá extraer imágenes del registro.

    Consulta la documentación de gsutil iam para obtener más información sobre el comando.

  3. Compute Engine y Google Kubernetes Engine están configurados con permisos para extraer imágenes de forma predeterminada desde Container Registry en el mismo proyecto. Si tienes otros requisitos para estas integraciones, consulta Integración con los servicios de Google Cloud.

Configura el acceso público a las imágenes

Se puede acceder públicamente a Container Registry si el bucket de almacenamiento subyacente de la ubicación del host es de acceso público. Dentro de un proyecto, o todas las imágenes de todas las ubicaciones del host son públicas o ninguna lo es. En el host de un proyecto, no es posible entregar públicamente solo imágenes específicas. Si tienes imágenes específicas que quieres hacer públicas, haz lo siguiente:

  • Asegúrate de mantenerlas en una ubicación del host independiente que vayas a hacer pública o
  • crea un proyecto nuevo para guardar las imágenes de acceso público.

Para entregar imágenes de contenedor de forma pública, sigue estos pasos a fin de que el bucket de almacenamiento subyacente sea de acceso público:

Console

  1. Asegúrate de haber enviado una imagen a Container Registry para que exista el bucket de almacenamiento subyacente.

  2. Abre la página de Container Registry en Cloud Console.

    Abrir la página de Container Registry

  3. En el panel izquierdo, haz clic en Configuración.

  4. En la página Configuración, en Acceso público, activa o desactiva la visibilidad como Pública o Privada. Esta configuración controla el acceso al bucket de almacenamiento subyacente.

    Cuando la visibilidad del host es pública, todas las imágenes de tu proyecto de Google Cloud que se encuentran en esa ubicación del host son de acceso público.

gsutil

  1. Asegúrate de haber enviado una imagen a Container Registry para que exista el bucket de almacenamiento subyacente.

  2. Busca el nombre del bucket de Cloud Storage para ese registro. Para ello, enumera los depósitos:

    gsutil ls
    

    La URL del depósito de Container Registry aparecerá como gs://artifacts.PROJECT-ID.appspot.com o gs://STORAGE-REGION.artifacts.PROJECT-ID.appspot.com, donde:

    • PROJECT-ID es el ID de tu proyecto de Google Cloud Console. Los proyectos con alcance de dominio tendrán el nombre de dominio como parte del ID del proyecto.
    • STORAGE-REGION es la ubicación del depósito de almacenamiento:
      • us para los registros en el host us.gcr.io
      • eu para los registros en el host eu.gcr.io
      • asia para los registros en el host asia.gcr.io
  3. Para hacer que el bucket de almacenamiento de Container Registry sea de acceso público, ejecuta el siguiente comando. Este comando hará que todas las imágenes del bucket sean de acceso público.

    gsutil iam ch allUsers:objectViewer gs://BUCKET-NAME
    

    donde:

    • gs://BUCKET-NAME es la URL del depósito de Container Registry.

Cuando Container Registry es de acceso público, cualquiera puede extraer sus imágenes. Para obtener instrucciones, consulta cómo extraer imágenes de un registro.

Revoca permisos

Sigue estos pasos para revocar los permisos de IAM.

Console

  1. Visita la página de Cloud Storage en Cloud Console.
  2. Haz clic en el vínculo artifacts.PROJECT-ID.appspot.com o STORAGE-REGION.artifacts.PROJECT-ID.appspot.com para el depósito. Aquí, PROJECT-ID es el ID del proyecto de Google Cloud del proyecto que aloja Container Registry y STORAGE-REGION es la multirregión (asiaeuus) del registro que aloja la imagen.

  3. Selecciona la pestaña Permisos.

  4. Haz clic en el ícono de papelera ubicado junto a cualquier miembro que desees quitar.

gsutil

Ejecuta el siguiente comando en el shell o la ventana de la terminal:

gsutil iam ch -d MEMBER gs://BUCKET-NAME

donde:

  • MEMBER puede ser una de las siguientes opciones:
    • user:EMAIL-ADDRESS para una Cuenta de Google
    • serviceAccount:EMAIL-ADDRESS para una cuenta de servicio de IAM
    • group:EMAIL-ADDRESS para un Grupo de Google.
    • allUsers para revocar el acceso público
  • BUCKET-NAME es el nombre del depósito deseado

Integración con los servicios de Google Cloud

De forma predeterminada, las cuentas de servicio para algunas integraciones comunes se configuran para el acceso de extracción o extracción en el mismo proyecto. El acceso se basa en permisos de IAM, y solo necesitas configurar permisos si la cuenta de servicio se conecta a Container Registry en un proyecto diferente.

La cuenta de servicio asociada con las instancias de VM de Compute Engine, incluidas las VM en los clústeres de GKE, tiene un requisito adicional. El acceso de las VM al almacenamiento se basa en permisos de IAM y permisos de acceso de almacenamiento.

  • Los permisos de Cloud IAM determinan quién puede acceder a los recursos.
  • Los permisos de acceso determinan los permisos de OAuth predeterminados para las solicitudes que se realizan a través de la herramienta de gcloud y las bibliotecas cliente en una instancia de VM. Como resultado, los permisos de acceso pueden limitar aún más el acceso a los métodos de la API cuando se autentica con las credenciales predeterminadas de la aplicación.
    • Para extraer una imagen privada, la cuenta de servicio de VM debe tener el permiso read en el depósito de almacenamiento de la imagen.
    • Para enviar una imagen privada, la cuenta de servicio de VM debe tener el permiso read-write, cloud-platform o full-control en el depósito de almacenamiento de la imagen.

De forma predeterminada, la cuenta de servicio predeterminada de Compute Engine tiene permiso de editor para los recursos en el mismo proyecto y el permiso de acceso de almacenamiento de read-only. El permiso read-only limita una VM para extraer solo imágenes. La cuenta de servicio predeterminada tiene el sufijo @developer.gserviceaccount.com.

Las siguientes configuraciones requieren que cambies el permiso predeterminado o la configuración del permiso.

Envía imágenes desde una VM o un clúster
Si deseas enviar imágenes, la cuenta de servicio de la instancia de VM debe tener el permiso storage-rw en lugar de storage-ro.
La VM y Container Registry están en proyectos distintos
Debes otorgarle permisos de IAM a la cuenta de servicio para acceder al depósito de almacenamiento que usa Container Registry.
Ejecuta comandos gcloud en las VM
La cuenta de servicio debe tener el permiso cloud-platform. Este permiso otorga los permisos para enviar y extraer imágenes, así como para ejecutar comandos de gcloud.

Los pasos para configurar los permisos se encuentran en las siguientes secciones.

Configura permisos de IAM para las VM

De forma predeterminada, las VM de Compute Engine solo pueden acceder al almacenamiento en el mismo proyecto. Si tu VM necesita acceder a Container Registry en un proyecto diferente, debes otorgar permisos a la cuenta de servicio de VM.

  1. En el proyecto con tu instancia de VM, obtén el nombre de la cuenta de servicio predeterminada de Compute Engine o la cuenta de servicio que asociaste con la instancia de VM. La cuenta de servicio predeterminada tiene el sufijo @developer.gserviceaccount.com.

  2. En el proyecto con Container Registry, otorga permisos para que la cuenta de servicio pueda acceder a esta.

Configura permisos para VM

Para establecer permisos de acceso cuando creas una VM, usa la opción - scopes.

gcloud compute instances create INSTANCE --scopes=SCOPE

Donde

  • INSTANCE es el nombre de la instancia de VM.
  • SCOPE es el permiso que deseas configurar para la cuenta de servicio de VM:
    • Extrae imágenes: storage-ro
    • Extrae y envía imágenes: storage-rw
    • Extrae y envía imágenes, ejecuta comandos de gcloud: cloud-platform

Para cambiar los alcances de una instancia de VM existente, sigue estos pasos:

Configura el permiso de acceso con la opción - scopes.

  1. Detén la instancia de VM. Consulta Detén una instancia.

  2. Cambia el permiso de acceso con el siguiente comando.

    gcloud compute instances set-service-account INSTANCE --scopes=SCOPE
    

    Donde

    • INSTANCE es el nombre de la instancia de VM.
    • SCOPE es el permiso que deseas configurar para la cuenta de servicio de VM:
      • Extrae imágenes: storage-ro
      • Extrae y envía imágenes: storage-rw
      • Extrae y envía imágenes, ejecuta comandos de gcloud: cloud-platform
  3. Reinicia la instancia de VM. Consulta Inicia una instancia detenida.

Configura los permisos para clústeres de Google Kubernetes Engine

De forma predeterminada, los clústeres de GKE nuevos se crean con permisos de solo lectura para los depósitos de Cloud Storage.

A fin de configurar el permiso de almacenamiento read-write cuando creas un clúster de Google Kubernetes Engine, usa la opción --scopes. Por ejemplo, el siguiente comando crea un clúster con los alcances bigquery, storage-rw y compute-ro:

gcloud container clusters create example-cluster \
--scopes=bigquery,storage-rw,compute-ro

Para obtener más información sobre los permisos que puedes configurar cuando creas un clúster nuevo, consulta la documentación del comando gcloud container clusters create.