Habilita IAP para Cloud Run

En esta página, se explica cómo proteger un servicio de Cloud Run con Identity-Aware Proxy (IAP).

Limitaciones conocidas

  • Los servicios de Cloud Run con HTTP/2 habilitado detrás de un balanceador de cargas de aplicaciones clásico que están protegidos con IAP encuentran un bucle de redireccionamiento infinito a pedido. Google recomienda usar un balanceador de cargas de aplicaciones externo global cuando se usa un servicio habilitado de HTTP/2 y protegido con IAP. Consulta los modos del balanceador de cargas para obtener más detalles.

  • IAP no protege el dominio que proporciona Cloud Run para un servicio implementado. Para asegurarte de que solo IAP tenga permiso para acceder al servicio, usa la autenticación de IAM en el servicio de Cloud Run. Para permitir que IAP acceda al servicio de Cloud Run, Otorgar el rol de cuenta de servicio de IAP service-[PROJECT_NUMBER]@gcp-sa-iap.iam.gserviceaccount.com con el rol de Invocador de Cloud Run IAP genera un token de ID y lo usa para autenticarse en Cloud Run con el X-Serverless-Authorization.

  • IAP se autentica en Cloud Run con el encabezado X-Serverless-Authorization. Cloud Run pasa este encabezado a tu servicio después de quitar su firma. Si tu servicio está diseñado para reenviar la solicitud a otro Cloud Run, que requiere autenticación de IAM, primero actualiza tu servicio para quitar este encabezado.

  • IAP no es compatible con Cloud CDN.

Antes de comenzar

Si quieres habilitar IAP para Cloud Run, necesitas lo siguiente:

IAP usa un cliente de OAuth administrado por Google para autenticar usuarios. Solo los usuarios de la organización pueden acceder a las instancias con IAP habilitado y mantener la integridad de su aplicación. Si quieres permitir el acceso a usuarios ajenos a tu organización consulta Habilita IAP para aplicaciones externas.

Habilita IAP

Console

El cliente de OAuth administrado por Google no está disponible cuando se habilita IAP con la consola de Google Cloud.

Si aún no has configurado la pantalla de consentimiento de OAuth para tu proyecto, se te solicitará hacerlo. Para configurar la pantalla de consentimiento de OAuth, consulta Configura la pantalla de consentimiento de OAuth.

Configura el acceso de IAP

  1. Ve a la página Identity-Aware Proxy.
  2. Selecciona el proyecto que deseas proteger con IAP.
  3. En APPLICATIONS, selecciona la casilla de verificación junto al servicio de backend del balanceador de cargas al que deseas agregar miembros.
  4. En el panel de la derecha, haz clic en Agregar miembro.
  5. En el cuadro de diálogo Agregar miembros, ingresa las cuentas de los grupos o las personas que deben tener el rol Usuario de app web protegida con IAP para el proyecto. Las siguientes cuentas pueden ser miembros:

    • Cuenta de Google: usuario@gmail.com. También puede ser una cuenta de Google Workspace, como usuario@google.com o algún otro dominio de Workspace.
    • Grupo de Google: administradores@googlegroups.com
    • Cuenta de servicio: servidor@ejemplo.iam.gserviceaccount.com
    • Dominio de Google Workspace: example.com
  6. En la lista desplegable Roles, selecciona Cloud IAP > Usuario de aplicación web protegida con IAP.

  7. Haz clic en Guardar.

Activa IAP

  1. En la página IAP, en APPLICATIONS, busca el servicio de backend del balanceador de cargas al que deseas restringir el acceso. Para activar IAP para un recurso, haz clic en el botón de activación IAP. Para habilitar IAP, haz lo siguiente:
    • Al menos un protocolo en la configuración del frontend del balanceador de cargas debe ser HTTPS. Obtén información sobre cómo configurar un balanceador de cargas.
    • Necesitas los permisos compute.backendServices.update, clientauthconfig.clients.create y clientauthconfig.clients.getWithSecret. Estos permisos se otorgan por funciones, como la función de Editor de proyectos. Para obtener más información, consulta Administra el acceso a los recursos protegidos con IAP.
  2. En la ventana Activar IAP que aparece, haz clic en Activar para confirmar que deseas que IAP proteja tu recurso. Después de activar IAP, se requieren credenciales de acceso para todas las conexiones a tu balanceador de cargas. Solo se otorgará acceso a las cuentas con la función Usuario de aplicación web protegida con IAP en el proyecto.
  3. Sigue las instrucciones en Control de acceso con IAM para autorizar a IAP a enviar tráfico al servicio de backend de Cloud Run.

    • Principal: service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com
    • Función: Invocador de Cloud Run

gcloud

  1. Si aún no lo has hecho, ejecuta el siguiente comando para crear una cuenta de servicio. Si ya creaste una cuenta de servicio, la ejecución del comando no crea cuentas de servicio duplicadas.
    gcloud beta services identity create --service=iap.googleapis.com --project=[PROJECT_ID]
  2. Ejecuta el siguiente comando para otorgarle permiso a la cuenta de servicio creada en el paso anterior.
    gcloud run services add-iam-policy-binding [SERVICE-NAME] \
    --member='serviceAccount:service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com'  \
    --role='roles/run.invoker'
    
  3. Habilita IAP ejecutando el comando con alcance global o regional, según si el servicio de backend del balanceador de cargas es global o regional. Usa el ID y el secreto de cliente de OAuth del paso anterior.

    Alcance global

    gcloud compute backend-services update BACKEND_SERVICE_NAME --global --iap=enabled
    

    Permiso regional

    gcloud compute backend-services update BACKEND_SERVICE_NAME --region REGION_NAME --iap=enabled
    
    Reemplaza lo siguiente:

    • BACKEND_SERVICE_NAME: el nombre del servicio de backend.
    • REGION_NAME: Es la región en la que deseas habilitar IAP.

Después de habilitar IAP, puedes usar Google Cloud CLI para manipular una política de acceso de IAP con el rol de Identity and Access Management roles/iap.httpsResourceAccessor. Consulta Administra roles y permisos para obtener más información.

Configura Cloud Run para limitar el acceso

Puedes configurar tu servicio de Cloud Run para que solo permita el acceso de los clientes internos y el balanceador de cargas externo, que bloquea todas las solicitudes directas de Internet pública.

Sigue los pasos que se indican en Restringe la entrada para Cloud Run para establecer la configuración de entrada de tu servicio de Cloud Run Uso interno y de Cloud Load Balancing.

Solución de errores

 The IAP service account is not provisioned 
Si ves este error, estás intentando habilitar IAP en un servicio de Cloud Run a través de gcloud CLI. La configuración de IAP a través de gcloud CLI incluye la paso adicional de aprovisionamiento de una cuenta de servicio IAP en tu proyecto con el siguiente comando: gcloud beta services identity create --service=iap.googleapis.com --project=[PROJECT_ID]
 Your client does not have permission to get URL from this server 
  • IAP usa los permisos de la cuenta de servicio de IAP para invocar tu servicio de Cloud Run. Asegúrate de haber otorgado a la API de Cloud Ejecuta el rol de Invocador en la siguiente cuenta de servicio: service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com.

  • Si otorgaste el rol de Invocador de Cloud Run a los roles anteriores cuenta de servicio y aún tienes este problema, vuelve a implementar tu servicio de Cloud Run.

La cuenta de servicio de IAP no necesita el permiso run.routes.invoke

Durante IAP con la vista previa de Cloud Run, Cloud Run no realizó la verificación de permisos run.routes.invoke para las llamadas de IAP que usan el rol de Invocador de Cloud Run. Con en la etapa de disponibilidad general (DG), Cloud Run otorga este permiso de verificación.

Para evitar cambios drásticos, algunos proyectos de clientes que dependían de este comportamiento durante la versión preliminar se colocaron en una lista de entidades permitidas para que no se verificara el permiso. Comunícate con el equipo de asistencia de Cloud Run para quitar esos proyectos de la lista de entidades permitidas solo para la versión preliminar.

¿Qué sigue?

Para ayudar a configurar IAP para Cloud Run con Terraform, haz lo siguiente: explorar una muestra de código de Terraform.