Control de acceso con la gestión de identidades y accesos

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

Una vez que hayas configurado los permisos, podrás configurar la autenticación para los clientes de Docker que utilices para enviar y extraer imágenes.

Si usas Artifact Analysis para trabajar con metadatos de contenedores, como las vulnerabilidades encontradas en las imágenes, consulta la documentación de Artifact Analysis para obtener información sobre cómo conceder acceso para ver o gestionar metadatos.

Antes de empezar

Verifica que tienes permisos para gestionar usuarios. Debes tener permisos en uno de los siguientes roles:

  • Administrador de gestión de identidades y accesos de proyectos (roles/resourcemanager.projectIamAdmin)
  • Administrador de seguridad (roles/iam.securityAdmin)

Como alternativa a la concesión de estos roles, puedes usar un rol personalizado o un rol predefinido con los mismos permisos.

Permisos y roles

Todos los usuarios, las cuentas de servicio y otras identidades que interactúen con Container Registry deben tener los permisos de Gestión de Identidades y Accesos (IAM) de Cloud Storage adecuados.

  • LosGoogle Cloud servicios que suelen acceder a Container RegistryGoogle Cloud se configuran con permisos predeterminados para los registros del mismo proyecto. Si los permisos predeterminados no se ajustan a tus necesidades, debes configurar los permisos adecuados.
  • En el caso de otras identidades, debe configurar los permisos necesarios.

Controlas el acceso a los hosts de Container Registry con permisos de Cloud Storage. En la siguiente tabla se enumeran los roles de Cloud Storage que tienen los permisos que necesita Container Registry.

Se necesitan permisos adicionales para ver imágenes de Container Registry con la Google Cloud consola. Consulta los permisos comunes necesarios para usar la consola de Cloud.

Acceso necesario Rol Dónde conceder permisos
Extraer imágenes (solo lectura) de un registro Lector de objetos de Storage (roles/storage.objectViewer) Concede el rol en el segmento de almacenamiento del registro.
Enviar (escribir) imágenes a un host de registro de un proyecto y extraer (leer) imágenes de él Editor de segmentos heredados de Storage (roles/storage.legacyBucketWriter) Concede el rol en el segmento de almacenamiento del registro. Este permiso solo está disponible a nivel de segmento. No puedes concederlo a nivel de proyecto.
Añade hosts de registro a proyectos de Google Cloud y crea los segmentos de almacenamiento asociados. Administrador de almacenamiento (roles/storage.admin) Concede el rol a nivel de proyecto

Para enviar imágenes, se necesitan permisos de lectura y escritura de objetos, así como el permiso storage.buckets.get. El rol Editor de segmentos heredados de Storage incluye los permisos necesarios en un solo rol de Cloud Storage, pero no concede control total sobre los segmentos y objetos de almacenamiento.

El rol Administrador de Storage permite controlar por completo los segmentos y objetos de almacenamiento. Si concede este permiso a nivel de proyecto, la entidad de seguridad tendrá acceso a todos los segmentos de almacenamiento del proyecto, incluidos los que no utilice Container Registry. Piensa detenidamente qué principales necesitan este rol.

  • De forma predeterminada, la cuenta de servicio de Cloud Build tiene permisos en el rol Administrador de Storage. Por lo tanto, esta cuenta de servicio puede añadir registros a su proyecto principal con la primera inserción e insertar imágenes en los registros de su proyecto principal.
  • Si usas Docker u otras herramientas para crear y enviar imágenes a un registro, te recomendamos que añadas registros a tu proyecto con una cuenta que tenga el rol de administrador de Storage, que es más permisivo, y que luego concedas los roles de escritor de segmentos antiguos de Storage o lector de objetos de Storage a otras cuentas que necesiten enviar o extraer imágenes.

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

Conceder permisos de gestión de identidades y accesos

Container Registry usa segmentos de Cloud Storage como almacenamiento subyacente de las imágenes de contenedor. Tú controlas el acceso a tus imágenes concediendo permisos al contenedor de un registro.

La primera vez que se envía una imagen a un nombre de host, se añade el host del registro y su segmento de almacenamiento a un proyecto. Por ejemplo, la primera inserción en gcr.io/my-project añade el host de registro gcr.io al proyecto con el ID de proyecto my-project y crea un contenedor de almacenamiento para el registro. El nombre del segmento tiene uno de los siguientes formatos:

  • artifacts.PROJECT-ID.appspot.com para las imágenes almacenadas en el host gcr.io
  • STORAGE-REGION.artifacts.PROJECT-ID.appspot.com para imágenes almacenadas en otros hosts de registro

Para realizar correctamente este primer envío de imagen, la cuenta que lo realice debe tener permisos en el rol de administrador de almacenamiento.

Después de enviar la imagen inicial a un host de registro, debes conceder permisos en el segmento de almacenamiento del registro para controlar el acceso a las imágenes del registro:

  • Editor de segmentos heredados de Storage para enviar y extraer
  • Lector de objetos de Storage para extraer solo

Puedes conceder permiso para un segmento mediante la Google Cloud console o la CLI de Google Cloud.

Limitaciones y restricciones

Solo puede conceder permisos a nivel de segmento de almacenamiento para hosts de Container Registry.

  • Container Registry ignora los permisos definidos en objetos individuales de un segmento de Cloud Storage.
  • No puedes conceder permisos en repositorios de un registro. Si necesitas un control de acceso más pormenorizado, Artifact Registry ofrece control de acceso a nivel de repositorio y puede adaptarse mejor a tus necesidades.
  • Si habilita el acceso uniforme a nivel de segmento en cualquier segmento de almacenamiento de Container Registry, debe conceder permisos explícitamente a todos los usuarios y cuentas de servicio que accedan a sus registros. En este caso, es posible que los roles de propietario y editor por sí solos no concedan los permisos necesarios.

Conceder permisos

  1. Si el host del registro aún no existe en el proyecto, una cuenta con permisos del rol Administrador de Storage debe enviar la primera imagen al registro. De esta forma, se crea el segmento de almacenamiento del host del registro.

    Cloud Build tiene los permisos necesarios para realizar el envío inicial de la imagen en el mismo proyecto. Si estás enviando imágenes con otra herramienta, verifica los permisos de la Google Cloud cuenta que estás usando para autenticarte en Container Registry.

    Para obtener más información sobre cómo enviar la imagen inicial con Docker, consulta el artículo sobre cómo añadir un registro.

  2. En el proyecto con Container Registry, concede los permisos adecuados en el segmento de Cloud Storage que usa el host del registro.

    Consola

    1. Ve a la página de Cloud Storage en la Google Cloud consola.
    2. Haz clic en el enlace artifacts.PROJECT-ID.appspot.com o STORAGE-REGION.artifacts.PROJECT-ID.appspot.com del segmento.

      Sustituye PROJECT-ID por el Google Cloud ID del proyecto del proyecto que aloja Container Registry y STORAGE-REGION por la multirregión (asia, eu o us) del registro que aloja la imagen.

    3. Selecciona la pestaña Permisos.

    4. Haz clic en Añadir.

    5. En el campo Principales, introduce las direcciones de correo de las cuentas que necesiten acceso, separadas por comas. Esta dirección de correo puede ser una de las siguientes:

      • 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 gestión de identidades y accesos.

        Consulta la lista de Google Cloud servicios que suelen acceder a los registros para buscar la dirección de correo de la cuenta de servicio asociada. Si el servicio se ejecuta en un proyecto diferente al de Container Registry, asegúrate de usar la dirección de correo de la cuenta de servicio del otro proyecto.

    6. En el menú desplegable Seleccionar un rol, selecciona la categoría Cloud Storage y, a continuación, el permiso correspondiente.

      • Lector de objetos de Storage para extraer imágenes únicamente
      • Editor de segmentos heredados de Storage para enviar y extraer imágenes
    7. Haz clic en Añadir.

    gcloud

    1. Ejecuta el siguiente comando para enumerar los contenedores del proyecto:

      gcloud storage ls
      

      La respuesta tiene este aspecto:

      gs://[BUCKET_NAME1]/
      gs://[BUCKET_NAME2]/
      gs://[BUCKET_NAME3]/ ...
      

      Busca el segmento del host del registro en la lista de segmentos devuelta. El segmento que almacena tus imágenes tiene el nombre BUCKET-NAME en uno de los siguientes formatos:

      • artifacts.PROJECT-ID.appspot.com para las imágenes almacenadas en el host gcr.io
      • STORAGE-REGION.artifacts.PROJECT-ID.appspot.com para imágenes almacenadas en otros hosts de registro

      Dónde

      • PROJECT-ID es tu Google Cloud ID de proyecto.
      • STORAGE-REGION es la ubicación del segmento de almacenamiento:
        • us para los registros del host us.gcr.io
        • eu para los registros del host eu.gcr.io
        • asia para los registros del host asia.gcr.io
    2. Ejecuta este comando en el shell o en la ventana del terminal:

      gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
      --member=TYPE:EMAIL-ADDRESS \
      --role=ROLE
      

      Dónde

      • BUCKET_NAME es el nombre del segmento de Cloud Storage con el formato artifacts.PROJECT-ID.appspot.com o STORAGE-REGION.artifacts.PROJECT-ID.appspot.com.
      • TYPE puede ser uno de los siguientes:
        • serviceAccount, si EMAIL-ADDRESS especifica una cuenta de servicio.
        • user, si el EMAIL-ADDRESS es una cuenta de Google.
        • group, si el EMAIL-ADDRESS es un grupo de Google.
      • EMAIL-ADDRESS puede ser uno de los siguientes:

        • 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 gestión de identidades y accesos.

          Consulta la lista de Google Cloud servicios que suelen acceder a los registros para buscar la dirección de correo de la cuenta de servicio asociada. Si el servicio se ejecuta en un proyecto diferente al de Container Registry, asegúrate de usar la dirección de correo de la cuenta de servicio del otro proyecto.

      • ROLE es el rol de Cloud Storage que quieres conceder.

        • objectViewer para extraer imágenes
        • legacyBucketWriter insertar y extraer imágenes

    Por ejemplo, este comando concede a la cuenta de servicio my-account@my-project.iam.gserviceaccount.com permisos para insertar y extraer imágenes del segmento my-example-bucket:

    gcloud storage buckets add-iam-policy-binding gs://my-example-bucket \
      --member=serviceAccount:my-account@my-project.iam.gserviceaccount.com \
      --role=roles/storage.objectUser
    

    El comando gcloud storage buckets add-iam-policy-binding cambia los permisos de IAM del segmento de almacenamiento en el que se aloja el registro. Puedes consultar más ejemplos en la documentación de gcloud CLI.

  3. Si vas a configurar el acceso para máquinas virtuales de Compute Engine o nodos de GKE que van a enviar imágenes a Container Registry, consulta Configurar máquinas virtuales y clústeres para ver los pasos de configuración adicionales.

Configurar el acceso público a las imágenes

Se puede acceder públicamente a Container Registry si se puede acceder públicamente al segmento de almacenamiento subyacente de la ubicación del host. En un proyecto, todas las imágenes de cada ubicación de host son públicas o no. En el host de un proyecto, no es posible servir públicamente solo imágenes específicas. Si quieres hacer públicas imágenes concretas, sigue estos pasos:

  • Asegúrate de mantenerlos en una ubicación de host independiente que hagas pública. o
  • Crea un proyecto para alojar imágenes de acceso público.

Para publicar imágenes de contenedor, haga que el segmento de almacenamiento subyacente sea accesible públicamente siguiendo estos pasos:

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

  2. Busca el nombre del segmento de Cloud Storage de ese registro. Para ello, enumera los contenedores:

    gcloud storage ls
    

    La URL de tu bucket de Container Registry se mostrará como gs://artifacts.PROJECT-ID.appspot.com o gs://STORAGE-REGION.artifacts.PROJECT-ID.appspot.com, donde:

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

    gcloud storage buckets add-iam-policy-binding gs://BUCKET-NAME \
        --member=allUsers --role=roles/storage.objectViewer
    

    donde:

    • gs://BUCKET-NAME es la URL del bucket de Container Registry

Retirar el acceso público a las imágenes

Consola

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

  2. Abre la página Container Registry en la Google Cloud consola.

    Abre la página Container Registry.

  3. En el panel de la izquierda, haz clic en Configuración.

  4. En la página Configuración, en Acceso público, cambia la visibilidad a Privado. Este ajuste controla el acceso al segmento de almacenamiento subyacente.

gcloud storage

  1. Busca el nombre del segmento de Cloud Storage de ese registro. Para ello, enumera los contenedores:

    gcloud storage ls
    

    La URL de tu bucket de Container Registry se mostrará como gs://artifacts.PROJECT-ID.appspot.com o gs://STORAGE-REGION.artifacts.PROJECT-ID.appspot.com, donde:

    • PROJECT-ID es el Google Cloud ID del proyecto de la consola. Los proyectos con ámbito de dominio tendrán el nombre de dominio como parte del ID de proyecto.
    • STORAGE-REGION es la ubicación del segmento de almacenamiento:
      • us para los registros del host us.gcr.io
      • eu para los registros del host eu.gcr.io
      • asia para los registros del host asia.gcr.io
  2. Para quitar el acceso público a tu segmento de almacenamiento, ejecuta el siguiente comando en tu shell o ventana de terminal:

    gcloud storage bucket remove-iam-policy-binding gs://BUCKET-NAME \
      --member=allUsers --role=roles/storage.objectViewer
    

donde:

  • BUCKET-NAME es el nombre del segmento que quieres.

Revocar permisos

Sigue estos pasos para revocar los permisos de gestión de identidades y accesos.

Consola

  1. Ve a la página de Cloud Storage en la Google Cloud consola.
  2. Haz clic en el enlace artifacts.PROJECT-ID.appspot.com o STORAGE-REGION.artifacts.PROJECT-ID.appspot.com del segmento. En este caso, PROJECT-ID es el Google Cloud ID del proyecto del proyecto que aloja Container Registry y STORAGE-REGION es la multirregión (asia, eu o us) del registro que aloja la imagen.

  3. Selecciona la pestaña Permisos.

  4. Haz clic en el icono de la papelera situado junto al principal que quieras quitar.

gcloud

Ejecuta este comando en el shell o en la ventana del terminal:

gcloud storage bucket remove-iam-policy-binding gs://BUCKET-NAME \
    --member=PRINCIPAL --all

donde:

  • BUCKET-NAME es el nombre del segmento que quieres.
  • PRINCIPAL puede ser uno de los siguientes:
    • user:EMAIL-ADDRESS de una cuenta de Google
    • serviceAccount:EMAIL-ADDRESS de una cuenta de servicio de gestión de identidades y accesos
    • group:EMAIL-ADDRESS de un grupo de Google.
    • allUsers para revocar el acceso público

Integración con Google Cloud servicios

En la mayoría de las Google Cloud cuentas de servicio, para configurar el acceso a un registro, solo tienes que conceder los permisos de gestión de identidades y accesos adecuados.

Permisos predeterminados para los servicios de Google Cloud

Google Cloud servicios como Cloud Build o Google Kubernetes Engine usan una cuenta de servicio predeterminada o un agente de servicio para interactuar con recursos del mismo proyecto.

Debes configurar o modificar los permisos tú mismo si:

  • El Google Cloud servicio está en un proyecto diferente al de Container Registry.
  • Los permisos predeterminados no satisfacen sus necesidades. Por ejemplo, la cuenta de servicio predeterminada de Compute Engine tiene acceso de solo lectura al almacenamiento del mismo proyecto. Si quieres enviar una imagen de la VM a un registro, debes modificar los permisos de la cuenta de servicio de la VM o autenticarte en el registro con una cuenta que tenga acceso de escritura al almacenamiento.
  • Estás usando una cuenta de servicio personalizada para interactuar con Container Registry

Las siguientes cuentas de servicio suelen acceder a Container Registry. La dirección de correo de la cuenta de servicio incluye el Google Cloud ID o número de proyecto del proyecto en el que se ejecuta el servicio.

Servicio Cuenta de servicio Dirección de correo electrónico Permisos
Entorno flexible de App Engine Cuenta de servicio predeterminada de App Engine PROJECT-ID@appspot.gserviceaccount.com Rol de editor, puede leer y escribir en el almacenamiento
Compute Engine Cuenta de servicio predeterminada de Compute Engine PROJECT-NUMBER-compute@developer.gserviceaccount.com Rol de editor, limitado al acceso de solo lectura al almacenamiento
Cloud Build Cuenta de servicio de Cloud Build PROJECT-NUMBER@cloudbuild.gserviceaccount.com Los permisos predeterminados incluyen la creación de segmentos de almacenamiento y el acceso de lectura y escritura al almacenamiento.
Cloud Run Cuenta de servicio predeterminada de Compute Engine
Cuenta de servicio de tiempo de ejecución predeterminada de las revisiones.
PROJECT-NUMBER-compute@developer.gserviceaccount.com Rol de editor, limitado al acceso de solo lectura al almacenamiento
GKE Cuenta de servicio predeterminada de Compute Engine
Es la cuenta de servicio predeterminada de los nodos.
PROJECT-NUMBER-compute@developer.gserviceaccount.com Rol de editor, limitado al acceso de solo lectura al almacenamiento

Configurar máquinas virtuales y clústeres para enviar imágenes

Compute Engine y cualquier Google Cloud servicio que use Compute Engine tienen la cuenta de servicio predeterminada de Compute Engine como identidad predeterminada.

Tanto los permisos de gestión de identidades y accesos como los ámbitos de acceso influyen en la capacidad de las máquinas virtuales para leer y escribir en el almacenamiento.

  • Los permisos de gestión de identidades y accesos determinan el acceso a los recursos.
  • Los ámbitos de acceso determinan los ámbitos de OAuth predeterminados de las solicitudes realizadas a través de la interfaz de línea de comandos de gcloud y las bibliotecas de cliente en una instancia de VM. Por lo tanto, los permisos de acceso pueden limitar aún más el acceso a los métodos de la API al autenticarse con las credenciales predeterminadas de la aplicación.
    • Para extraer una imagen privada, la cuenta de servicio de la VM debe tener permiso read para el segmento de almacenamiento de la imagen.
    • Para enviar una imagen privada, la cuenta de servicio de la VM debe tener el ámbito de acceso read-write, cloud-platform o full-control al bucket de almacenamiento de la imagen.

La cuenta de servicio predeterminada de Compute Engine tiene el rol Editor de forma predeterminada, que incluye permisos para crear y actualizar recursos de la mayoría de losGoogle Cloud servicios. Sin embargo, tanto para la cuenta de servicio predeterminada como para la cuenta de servicio personalizada que asocies a una VM, el ámbito de acceso predeterminado de los segmentos de almacenamiento es de solo lectura. Esto significa que, de forma predeterminada, las VMs no pueden enviar imágenes.

Si solo tienes previsto desplegar imágenes en entornos como Compute Engine y GKE, no es necesario que modifiques el ámbito de acceso. Si quieres ejecutar aplicaciones en estos entornos que inserten imágenes en el registro, debes realizar una configuración adicional.

Las siguientes configuraciones requieren cambios en los permisos de gestión de identidades y accesos o en la configuración del ámbito de acceso.

Enviar imágenes desde una VM o un clúster
Si quieres enviar imágenes, la cuenta de servicio de la instancia de VM debe tener el ámbito storage-rw en lugar de storage-ro.
La VM y Container Registry están en proyectos independientes
Debes conceder a la cuenta de servicio permisos de gestión de identidades y accesos para acceder al segmento de almacenamiento que usa Container Registry.
Ejecutar comandos de gcloud en máquinas virtuales
La cuenta de servicio debe tener el ámbito cloud-platform. Este ámbito concede permisos para insertar y extraer imágenes, así como para ejecutar comandos gcloud.

En las siguientes secciones se explica cómo configurar los ámbitos.

Configurar permisos para máquinas virtuales

Para definir los permisos de acceso al crear una VM, usa la opción --scopes.

gcloud compute instances create INSTANCE --scopes=SCOPE

Dónde

  • INSTANCE es el nombre de la instancia de VM.
  • SCOPE es el ámbito que quieres configurar para la cuenta de servicio de la VM:
    • Extraer imágenes: storage-ro
    • Insertar y extraer imágenes: storage-rw
    • Extraer e insertar imágenes, ejecutar comandos de gcloud: cloud-platform

Para cambiar los ámbitos de una instancia de VM, sigue estos pasos:

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

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

  2. Cambia el ámbito de acceso con el siguiente comando.

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

    Dónde

    • INSTANCE es el nombre de la instancia de VM.
    • SCOPE es el ámbito que quieres configurar para la cuenta de servicio de la VM:
      • Extraer imágenes: storage-ro
      • Insertar y extraer imágenes: storage-rw
      • Extraer e insertar imágenes, ejecutar comandos de gcloud: cloud-platform
  3. Reinicia la instancia de VM. Consulta Iniciar una instancia detenida.

Si quieres usar una cuenta de servicio personalizada para las VMs en lugar de la cuenta de servicio predeterminada, puedes especificar la cuenta de servicio y los ámbitos de acceso que quieras usar al crear la VM o al modificar la configuración de la VM.

Configurar ámbitos para clústeres de Google Kubernetes Engine

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

Para definir el read-write ámbito de almacenamiento al crear un clúster de Google Kubernetes Engine, usa la opción --scopes. Por ejemplo, el siguiente comando crea un clúster con los ámbitos 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 ámbitos que puedes definir al crear un clúster, consulta la documentación del comando gcloud container clusters create.

de GKE.

Cuenta de servicio de Container Registry

El agente de servicio de Container Registry actúa en nombre de Container Registry cuando interactúa con Google Cloud servicios. El agente de servicio tiene el conjunto mínimo de permisos necesarios si habilitaste la API Container Registry después del 5 de octubre del 2020. El agente de servicio tenía el rol Editor. Para obtener más información sobre el agente de servicio y cómo modificar sus permisos, consulta el artículo Cuenta de servicio de Container Registry.

Pruébalo

Si es la primera vez que utilizas Google Cloud, crea una cuenta para evaluar el rendimiento de Container Registry en situaciones reales. Los nuevos clientes también reciben 300 USD en crédito gratuito para ejecutar, probar y desplegar cargas de trabajo.

Probar Container Registry gratis