1. Descripción general
En este lab, se muestra cómo restringir el acceso a un servicio de Cloud Run y permitir solo las solicitudes de una carga de trabajo que se ejecuta de forma local o en la VPC de tu proyecto. Existen dos capas de control de acceso que puedes usar: la configuración de entrada y las políticas de Identity and Access Management (IAM).
Configuración de entrada
La configuración de entrada te permite filtrar las solicitudes según su origen de red (interno o externo). De forma predeterminada, se permite que todas las solicitudes pasen, incluidas las de la Internet pública.
Política de IAM
Las políticas de IAM te permiten filtrar solicitudes según la identidad del remitente y se usan comúnmente para autenticar solicitudes de servicio a servicio.
En este lab, aprenderás cómo y cuándo usar la configuración de entrada.
Los hosts locales se conectan a través de la VPC
En este lab, simularemos una carga de trabajo local. Para conectar un host local a Cloud Run, debes configurar el Acceso privado a Google para hosts locales. Esto incluye configurar una puerta de enlace de Cloud VPN en la red de VPC, como se muestra a continuación.
Cómo simular una carga de trabajo local con un servidor de salto en la VPC
En este lab, simularás el envío de solicitudes desde un host local mediante el envío de solicitudes desde una máquina virtual de Compute Engine en la VPC, como se muestra aquí.
La máquina virtual de Compute Engine que usarás como servidor de salto tiene el mismo origen de red que la puerta de enlace de VPN de Cloud, por lo que puedes usarla para simular el envío de solicitudes desde una carga de trabajo local.
2. Configuración y requisitos
Cómo configurar el entorno a tu propio ritmo
- Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.
- El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla en cualquier momento.
- El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. Por lo general, no importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (suele identificarse como
PROJECT_ID
). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se mantendrá durante todo el proyecto. - Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
- A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar todo el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.
Configuración del entorno
- Establece una variable de entorno en el ID del proyecto para usarla en comandos posteriores:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ZONE=us-central1-a
- Habilita las APIs necesarias para ejecutar este lab.
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
compute.googleapis.com \
artifactregistry.googleapis.com
- Clona el repositorio de la app de ejemplo y navega al directorio
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
cd cymbal-eats/partner-registration-service
- Establece la región y la zona predeterminadas para Compute Engine y Cloud Run
gcloud config set compute/region ${REGION}
gcloud config set run/region ${REGION}
gcloud config set compute/zone ${ZONE}
3. Implemente el servicio
Primero, implementarás el servicio y lo dejarás de acceso público. Una vez que verifiques que puedes enviar solicitudes desde tu navegador, bloquearemos el servicio y solo permitiremos las solicitudes de fuentes de red internas.
Cuando ejecutes el siguiente comando, sigue estas instrucciones:
- Ubicación del código fuente (...): Verifica que te encuentres en el directorio partner-registration-service y presiona Intro para aceptar la opción predeterminada.
- Nombre del servicio (partner-registration-service): Presiona Intro para aceptar el valor predeterminado
- ¿Permitir invocaciones no autenticadas a [partner-registration-service] (y/N)? Y
gcloud run deploy
Cuando se complete este comando, se mostrará la URL de tu servicio de Cloud Run. El resultado se verá similar a esta ficha:
Service [partner-registration-service] revision [partner-registration-service-00001-haz] has been deployed and is serving 100 percent of traffic. Service URL: https://partner-registration-service-ssssssssss-uc.a.run.app
Abre la URL del servicio en tu navegador. Deberías ver este resultado:
Partner registration service: RUNNING
Configura el servicio para permitir solo solicitudes internas
Ahora, usarás la configuración de entrada del servicio de Cloud Run para permitir solo solicitudes de fuentes internas. Las fuentes internas incluyen recursos en redes de VPC que se encuentran en el mismo proyecto (o perímetro de los Controles del servicio de VPC) que el servicio de Cloud Run, lo que lo hace perfecto para nuestro caso de uso.
Además, las solicitudes de otros productos de Google Cloud se consideran internas, incluso si no forman parte de la VPC. Entre esos productos, se incluyen Pub/Sub y Workflows.
Las solicitudes de estas fuentes permanecen dentro de la red de Google, incluso si acceden a tu servicio en la URL run.app, y se prohíbe el acceso público.
Actualiza el servicio para permitir solo solicitudes internas:
gcloud run services update partner-registration-service --ingress=internal
Si vuelves a abrir la URL del servicio, aparecerá el mensaje "Error: Forbidden - Access is forbidden".
Dado que tu navegador envía la solicitud desde un origen de red externo y no desde un origen interno al proyecto de Google Cloud, esto es exactamente lo que esperas que suceda. Tu servicio ahora es más seguro.
4. Crea una máquina virtual de Compute Engine como servidor de salto
El siguiente paso es simular solicitudes de un servidor local a través de una puerta de enlace de Cloud VPN. Para ello, crea una instancia de Compute Engine en la VPC para usarla como servidor de salto:
gcloud compute instances create jump-server --scopes=https://www.googleapis.com/auth/cloud-platform
El resultado de este comando debería ser similar al siguiente:
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS jump-server us-central1-a n1-standard-1 10.128.0.10 34.170.108.8 RUNNING
Envía una solicitud desde la instancia de Compute Engine al servicio
Ahora, abrirás una terminal en la máquina virtual y enviarás una solicitud directamente desde la máquina en la red de VPC.
Si el siguiente comando te solicita que configures SSH en Cloud Shell, sigue las instrucciones:
gcloud compute ssh jump-server
Obtén la URL del servicio de Cloud Run con este comando:
gcloud run services describe partner-registration-service --region us-central1
Las primeras líneas del resultado deberían verse así:
✔ Service partner-registration-service in region us-central1 URL: https://partner-registration-service-ssssssssss-uc.a.run.app Ingress: internal
Ahora, copia la URL y envía una solicitud desde la instancia de Compute Engine con curl. Esta solicitud debería tener éxito, ya que la instancia de VM se ejecuta en la red de VPC de tu proyecto, es una fuente interna.
export SERVICE_URL=https://
curl ${SERVICE_URL}
El resultado debería decir lo siguiente:
Partner registration service: RUNNING
5. ¿Qué sucede con el control de acceso basado en IAM?
En este lab, se te mostró cómo y cuándo usar la configuración de entrada. La configuración de entrada es un excelente primer paso si deseas conectar una carga de trabajo local a Cloud Run.
El control de acceso basado en IAM requiere más esfuerzo para su implementación, en especial si realizas llamadas desde un host local:
- IAM requiere que administres credenciales de cuenta de servicio de larga duración en el host
- IAM requiere cambios de código para firmar solicitudes con las credenciales de la cuenta de servicio.
Google recomienda un enfoque de varias capas para el control de acceso. Usar la configuración de entrada para restringir el acceso solo a hosts internos es un excelente primer paso, pero no te detengas ahí.
6. ¡Felicitaciones!
¡Felicitaciones! Completaste el codelab.
¿Qué sigue?
Explora otros codelabs de Cymbal Eats:
- Cómo activar flujos de trabajo de Cloud con Eventarc
- Cómo activar el procesamiento de eventos desde Cloud Storage
- Cómo conectarse a CloudSQL privado desde Cloud Run
- Cómo conectarse a bases de datos completamente administradas desde Cloud Run
- Cómo proteger una aplicación sin servidor con Identity-Aware Proxy (IAP)
- Cómo activar trabajos de Cloud Run con Cloud Scheduler
- Implementa de forma segura en Cloud Run
- Cómo conectarse a AlloyDB privado desde GKE Autopilot
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra el proyecto
La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.
Referencias útiles
Estos son recursos adicionales que te ayudarán a obtener más información sobre las dos capas de control de acceso en Cloud Run.