Control de acceso con IAM

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 Artifact Analysis para trabajar con metadatos de contenedores, como vulnerabilidades encontradas en las imágenes, consulta Documentación de Artifact Analysis para obtener información sobre cómo otorgar acceso para ver o administrar metadatos.

Antes de comenzar

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

  • Administrador de IAM de proyecto (roles/resourcemanager.projectIamAdmin)
  • Administrador de seguridad (roles/iam.securityAdmin)

Como alternativa a otorgar estos roles, puedes usar un rol personalizado o rol predefinido con el mismo permisos.

Permisos y funciones

Todos los usuarios, las cuentas de servicio y otras identidades que interactúan con Container Registry deben tener los permisos Permisos de Identity and Access Management (IAM) para Cloud Storage

  • Servicios de Google Cloud que suelen acceder a Container Registry están configurados con permisos predeterminados para los registros del mismo proyecto de Google Cloud. Si los permisos predeterminados no se ajustan a tus necesidades, debes configurar los permisos adecuados.
  • Para otras identidades, debes configurar los permisos necesarios.

Tú controlas el acceso a los hosts de Container Registry con los permisos de Cloud Storage. En la siguiente tabla, se indican Roles de Cloud Storage que tienen las siguientes características: los permisos necesarios para Container Registry.

Se requieren algunos permisos adicionales cuando se visualiza Container Registry con la consola de Google Cloud, consulta Permisos comunes necesarios para usar la consola de Cloud.

Acceso requerido Rol Dónde otorgar permisos
Extrae imágenes (solo lectura) de un registro existente Visualizador de objetos de almacenamiento (roles/storage.objectViewer) Otorga el rol en el bucket de almacenamiento del registro.
Envía (escribe) imágenes y extrae (lee) imágenes de un host de registro existente. en un proyecto Escritor de buckets heredados de almacenamiento (roles/storage.legacyBucketWriter) Otorga el rol en el bucket de almacenamiento del registro. Este permiso solo está disponible a nivel de bucket, no puedes otorgarlo a nivel de proyecto.
Agrega hosts de registro a proyectos de Google Cloud y crea la buckets de almacenamiento asociados. Administrador de almacenamiento (roles/storage.admin) Otorga el rol a nivel de proyecto

Para enviar imágenes, se requieren permisos de lectura y escritura de objetos, además del storage.buckets.get. El rol de escritor de buckets heredados de Storage incluye los permisos necesarios en un solo rol de Cloud Storage, pero no otorga control total sobre los buckets y objetos de almacenamiento.

El rol Administrador de almacenamiento otorga control total sobre los buckets y los objetos de almacenamiento. Si otorgas este permiso a nivel de proyecto, la principal tendrá acceso a todos los buckets de almacenamiento del proyecto, incluidos los buckets que Container Registry. Analiza con cuidado qué principales requieren esta función.

  • De forma predeterminada, la cuenta de servicio de Cloud Build permisos en el rol Administrador de almacenamiento. Por lo tanto, esta cuenta de servicio puede agregar registros a su proyecto superior con el primer envío y el envío de imágenes a las existentes registros en el proyecto superior.
  • Si usas Docker o alguna otra herramienta para crear y enviar imágenes a un registro, considera agregar registros a tu proyecto con una cuenta que tenga rol de administrador de almacenamiento permisivo y, luego, otorgarles el rol de Escritor de buckets de Visualizador de objetos de Storage a otras cuentas que deban enviar o extraer imágenes de contenedores.

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

Otorga permisos de IAM

Container Registry usa depósitos de Cloud Storage como almacenamiento subyacente para las imágenes de contenedor. Tú controlas el acceso a tus imágenes otorgando permisos al bucket para un registro.

El primer envío de imagen a un nombre de host agrega el host de registro y su almacenamiento a un proyecto. Por ejemplo, el primer envío a gcr.io/my-project agrega el host de registro gcr.io al proyecto con el ID del proyecto my-project y crea un bucket de almacenamiento para el registro. El nombre del bucket 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 imágenes, la cuenta que realiza el envío Debe tener permisos en el rol Administrador de almacenamiento.

Después del envío de la imagen inicial a un host de registro, otorgas en el bucket de almacenamiento del registro para controlar el acceso registro:

  • Escritor de buckets heredados de almacenamiento para enviar y extraer
  • Visualizador de objetos de Storage

Puedes otorgar permiso para un bucket con la consola de Google Cloud o la herramienta de línea de comandos de gsutil.

Limitaciones y restricciones

Solo puedes otorgar permisos a nivel del bucket de almacenamiento para Hosts de Container Registry.

  • Container Registry ignora los permisos establecidos en objetos individuales dentro un bucket de Cloud Storage.
  • No puedes otorgar permisos a repositorios dentro de un registro. Si necesitas un control de acceso más detallado, Artifact Registry proporciona a nivel de repositorio y podría adaptarse mejor a tus necesidades.
  • Si habilitas el acceso uniforme a nivel de bucket para cualquier bucket de almacenamiento de Container Registry, debes otorgar permisos a todos los usuarios y cuentas de servicio que acceden a tus registros. En en este caso, es posible que los roles de propietario y editor por sí mismos no otorguen los permisos necesarios.

Otorga permisos

  1. Si el host de registro aún no existe en el proyecto, se creará una cuenta con permisos en el rol Administrador de almacenamiento debe enviar la primera imagen al registro. Esto crea el bucket de almacenamiento para el host de registro.

    Cloud Build tiene los permisos necesarios para realizar la imagen inicial enviar dentro del mismo proyecto. Si envías imágenes con otra herramienta, verificar los permisos de la cuenta de Google Cloud que estás usando para autenticarse con Container Registry.

    Para obtener más información sobre cómo enviar la imagen inicial con Docker, consulta Agrega un registro.

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

    Console

    1. Ve a la página de Cloud Storage en la consola de Google Cloud.
    2. Haz clic en el vínculo artifacts.PROJECT-ID.appspot.com. STORAGE-REGION.artifacts.PROJECT-ID.appspot.com para el bucket.

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

    3. Selecciona la pestaña Permisos.

    4. Haz clic en Agregar.

    5. En el campo Principales, ingresa las direcciones de correo electrónico de las cuentas. que requieran acceso, separados 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.

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

    6. En el menú desplegable Seleccionar un rol, selecciona el Cloud Storage y, luego, selecciona el permiso adecuado.

      • El Visualizador de objetos de Storage extrae solo las imágenes
      • Escritor de buckets heredados de Storage para enviar y extraer imágenes
    7. Haz clic en Agregar.

    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]/ ...
      

      Busca el bucket para el host de registro en la lista de bucket s que se muestra. El bucket que almacena tus imágenes tiene el nombre BUCKET-NAME de una de las siguientes formas:

      • 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 cuenta de Google Cloud 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
    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 uno de los datos 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 IAM.

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

      • ROLE es la función de Cloud Storage que deseas otorgar.

        • objectViewer para extraer imágenes
        • legacyBucketWriter 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.

    Por ejemplo, este comando otorga a la cuenta de servicio my-account@my-project.iam.gserviceaccount.com con permisos para Envía y extrae imágenes en el bucket my-example-bucket:

    gsutil iam ch \
      serviceAccount:my-account@my-project.iam.gserviceaccount.com:legacyBucketWriter \
      gs://my-example-bucket
    

    El comando gsutil iam ch cambia los permisos de IAM del depósito de almacenamiento en el que se aloja el registro. Otros ejemplos son en la documentación de gsutil.

  3. Si configuras el acceso para VMs de Compute Engine o de GKE que enviarán imágenes a Container Registry, consulta Configura VMs y clústeres para obtener información los pasos de configuración.

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 conservar 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:

  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 tu cuenta de Google Cloud ID del proyecto: 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.

Quita el acceso público a las imágenes

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 la consola de Google Cloud.

    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 la visibilidad como Privado. Esta configuración controla el acceso al bucket de almacenamiento subyacente.

gsutil

  1. 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 tu consola de Google Cloud ID del proyecto: 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
  2. Para quitar el acceso público a tu bucket de almacenamiento, ejecuta el siguiente comando: en tu shell o ventana de terminal:

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

Donde:

  • BUCKET-NAME es el nombre del depósito deseado

Revocar permisos

Sigue estos pasos para revocar los permisos de IAM.

Console

  1. Visita la página de Cloud Storage en la consola de Google Cloud.
  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 junto a cualquier principal que desees quitar.

gsutil

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

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

donde:

  • PRINCIPAL 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

Integrar los servicios de Google Cloud

Para la mayoría de las cuentas de servicio de Google Cloud, configurar el acceso a un registro solo requiere otorgar los permisos de IAM adecuados.

Permisos predeterminados para los servicios de Google Cloud

Los servicios de Google Cloud, como Cloud Build o Google Kubernetes Engine, usan un cuenta de servicio predeterminada agente de servicio con el que interactuar recursos dentro del mismo proyecto.

Debes configurar o modificar los permisos tú mismo si:

  • El servicio de Google Cloud está en un proyecto diferente al de Container Registry.
  • Los permisos predeterminados no satisfacen tus necesidades. Por ejemplo, la configuración predeterminada Compute Engine tiene acceso de solo lectura al almacenamiento en el mismo en un proyecto final. Si quieres enviar una imagen de la VM a un registro, 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.
  • Usas una cuenta de servicio personalizada para interactuar con Container Registry

Por lo general, las siguientes cuentas de servicio acceden a Container Registry. El dirección de correo electrónico de la cuenta de servicio incluye 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 a acceso de solo lectura al almacenamiento
Cloud Build Cuenta de servicio de Cloud Build PROJECT-NUMBER@cloudbuild.gserviceaccount.com Permisos predeterminados incluyen la creación de buckets de almacenamiento y el acceso de lectura y escritura al almacenamiento.
Cloud Run Cuenta de servicio predeterminada de Compute Engine
La cuenta de servicio del entorno de ejecución predeterminada para las revisiones.
PROJECT-NUMBER-compute@developer.gserviceaccount.com Rol de editor, limitado a acceso de solo lectura al almacenamiento
GKE Cuenta de servicio predeterminada de Compute Engine
La cuenta de servicio predeterminada para los nodos.
PROJECT-NUMBER-compute@developer.gserviceaccount.com Rol de editor, limitado a acceso de solo lectura al almacenamiento

Configura VMs y clústeres para enviar imágenes

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

Tanto los permisos de IAM como los permisos de acceso afectan la capacidad de para leer y escribir en el almacenamiento.

  • Los permisos de IAM determinan el acceso a los recursos.
  • Los permisos de acceso determinan la permisos de OAuth predeterminados para solicitudes realizadas a través de gcloud CLI y el cliente bibliotecas en una instancia de VM. Como resultado, los permisos de acceso pueden limitar aún más acceso a los métodos de la API cuando autentiques con 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 imágenes privadas, la cuenta de servicio de la VM debe tener la Permiso de acceso de read-write, cloud-platform o full-control al bucket de almacenamiento de una imagen.

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

Si solo quieres implementar imágenes en entornos como Compute Engine y GKE, no es necesario modificar el permiso de acceso. Si ejecutar aplicaciones en estos entornos que envían imágenes al registro, debe realizar una configuración adicional.

Los siguientes parámetros de configuración requieren cambios en los permisos de IAM o configuración del permiso de acceso.

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 otorgar la cuenta de servicio con la IAM. permisos para acceder al bucket 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 los permisos para las VMs

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.

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

Configura los permisos para los 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.

La cuenta de servicio de Container Registry

El agente de servicio de Container Registry actúa en nombre de Container Registry cuando interactúas con los servicios de Google Cloud. El servicio tiene el conjunto mínimo de permisos necesarios si habilitaste API de Container Registry después del 5 de octubre de 2020. El agente de servicio antes tener el rol de editor Más información sobre el agente de servicio y cómo modificar sus permisos, consulta Cuenta de servicio de Container Registry.

Pruébalo tú mismo

Si es la primera vez que usas Google Cloud, crea una cuenta para evaluar cómo Container Registry funciona en situaciones reales reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.

Prueba Container Registry gratis