Descripción general
El principio de privilegio mínimo establece que un recurso solo debe tener acceso al conjunto exacto de recursos que necesita para funcionar. Por ejemplo, si un servicio realiza una copia de seguridad automatizada de la base de datos, el servicio debe restringirse a permisos de solo lectura en exactamente una base de datos. Del mismo modo, si un servicio solo es responsable de encriptar datos, no debería tener permisos para desencriptarlos.
En Cloud Run, si un servicio se implementa sin especificar una cuenta de servicio, se usa una cuenta de servicio predeterminada. La cuenta de servicio predeterminada que se usa es la cuenta de servicio de Compute Engine, que tiene el rol de editor amplio en el proyecto. Debido a la herencia de la vinculación de políticas, esta cuenta de servicio tiene permisos de lectura y escritura en la mayoría de los recursos de tu proyecto. Si bien es conveniente, es un riesgo de seguridad inherente, ya que los recursos se pueden crear, modificar o borrar con esta cuenta de servicio.
Para mitigar este riesgo y aplicar el principio de privilegio mínimo, debes crear una cuenta de servicio que sirva como identidad del servicio y otorgarle el conjunto mínimo de permisos que se requieren para la funcionalidad del servicio.
Objetivos
En este lab, aprenderás a realizar las siguientes tareas:
- Configurar tu entorno y habilitar la API de Cloud Run
- Crear e implementar un servicio público de Cloud Run
- Probar el servicio con solicitudes no autenticadas
- Crear una cuenta de servicio con permisos mínimos
- Usar la gcloud CLI para autenticarte con la cuenta de servicio e invocar un servicio de Cloud Run
- Implementar el privilegio mínimo otorgando el conjunto mínimo de permisos necesarios para invocar un servicio en Cloud Run
Requisitos previos
Estos labs se basan en conocimientos intermedios de Google Cloud. Si bien los pasos necesarios se explican en el contenido, sería útil tener conocimientos sobre cualquiera de los siguientes productos:
Configuración y requisitos
Antes de hacer clic en el botón Comenzar lab
Nota: Lee estas instrucciones.
Los labs son cronometrados y no se pueden pausar. El cronómetro, que comienza a funcionar cuando haces clic en Comenzar lab, indica por cuánto tiempo tendrás a tu disposición los recursos de Google Cloud.
En este lab práctico de Qwiklabs, se te proporcionarán credenciales temporales nuevas para acceder a Google Cloud y realizar las actividades en un entorno de nube real, no en uno de simulación o demostración.
Requisitos
Para completar este lab, necesitarás lo siguiente:
- Acceso a un navegador de Internet estándar (se recomienda el navegador Chrome)
- Tiempo para completar el lab
Nota: Si ya tienes un proyecto o una cuenta personal de Google Cloud, no los uses para el lab.
Nota: Si usas una Pixelbook, abre una ventana de incógnito para ejecutar el lab.
Cómo iniciar tu lab y acceder a la consola
-
Haz clic en el botón Comenzar lab. Si debes pagar por el lab, se abrirá una ventana emergente para que selecciones tu forma de pago.
A la izquierda, verás un panel con las credenciales temporales que debes usar para este lab.

-
Copia el nombre de usuario y, luego, haz clic en Abrir la consola de Google.
El lab inicia los recursos y abre otra pestaña que muestra la página Elige una cuenta.
Sugerencia: Abre las pestañas en ventanas separadas, una junto a la otra.
-
En la página Elige una cuenta, haz clic en Usar otra cuenta. Se abrirá la página de acceso.

-
Pega el nombre de usuario que copiaste del panel Detalles de la conexión. Luego, copia y pega la contraseña.
Nota: Debes usar las credenciales del panel Detalles de la conexión. No uses tus credenciales de Google Cloud Skills Boost. Si tienes una cuenta propia de Google Cloud, no la utilices para este lab para no incurrir en cargos.
- Haz clic para avanzar por las páginas siguientes:
- Acepta los Términos y Condiciones.
- No agregues opciones de recuperación o autenticación de dos factores (esta es una cuenta temporal).
- No te registres para obtener pruebas gratuitas.
Después de un momento, se abrirá la consola de Cloud en esta pestaña.
Nota: Para ver el menú con una lista de los productos y servicios de Google Cloud, haz clic en el menú de navegación que se encuentra en la parte superior izquierda de la pantalla.
Activa Google Cloud Shell
Google Cloud Shell es una máquina virtual que cuenta con herramientas para desarrolladores. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud.
Google Cloud Shell proporciona acceso de línea de comandos a tus recursos de Google Cloud.
-
En la consola de Cloud, en la barra de herramientas superior derecha, haz clic en el botón Abrir Cloud Shell.

-
Haz clic en Continuar.
El aprovisionamiento y la conexión al entorno demorarán unos minutos. Cuando te conectes, habrás completado la autenticación, y el proyecto estará configurado con tu PROJECT_ID. Por ejemplo:

gcloud es la herramienta de línea de comandos de Google Cloud. Viene preinstalada en Cloud Shell y es compatible con el completado de línea de comando.
- Puedes solicitar el nombre de la cuenta activa con este comando:
gcloud auth list
Resultado:
Credentialed accounts:
- @.com (active)
Resultado de ejemplo:
Credentialed accounts:
- google1623327_student@qwiklabs.net
- Puedes solicitar el ID del proyecto con este comando:
gcloud config list project
Resultado:
[core]
project =
Resultado de ejemplo:
[core]
project = qwiklabs-gcp-44776a13dea667a6
Nota:
La documentación completa de gcloud está disponible en la
guía de descripción general de gcloud CLI
.
Tarea 1: Configura el entorno
Configura variables de entorno en Cloud Shell para que el proceso de aprovisionamiento sea más flexible.
-
Habilita la API de Cloud Run:
gcloud services enable run.googleapis.com
-
Crea una variable de entorno LOCATION:
LOCATION={{{project_0.default_region|REGION}}}
-
Establece la región predeterminada de Cloud Run:
gcloud config set run/region $LOCATION
Tarea 2: Crea e implementa un servicio público
Requisitos
Quickway Parking tiene un servicio de facturación de Cloud Run que le gustaría que fuera más seguro. En esta tarea, harás lo siguiente:
- Implementa el servicio de facturación desde una imagen.
- Prueba el servicio invocándolo sin autenticación.
Implementa con Cloud Run
El equipo de desarrollo de Quickway ya tiene una imagen de la aplicación de facturación disponible en Google Cloud.
-
Implementa la imagen de la aplicación de facturación en Cloud Run:
gcloud run deploy billing-service \
--image gcr.io/qwiklabs-resources/gsp723-parking-service \
--region $LOCATION \
--allow-unauthenticated
-
Asigna la URL del nuevo servicio a una variable de entorno:
BILLING_SERVICE_URL=$(gcloud run services list \
--format='value(URL)' \
--filter="billing-service")
-
Invoca el servicio sin autorización:
curl -X POST -H "Content-Type: application/json" $BILLING_SERVICE_URL -d '{"userid": "1234", "minBalance": 100}'
El servicio no genera ningún resultado cuando se invoca.
-
En el menú de navegación de la consola de Google Cloud (
), haz clic en Cloud Run.
-
Haz clic en el vínculo a billing-service.
-
Para ver los registros del servicio, haz clic en Registros.
-
Agrega el filtro de registro minBalance
para ver el saldo mínimo recibido en la solicitud hecha al servicio.
-
Para volver a la página de detalles del servicio, haz clic en <- Detalles del servicio.
-
Selecciona billing-service marcando la casilla a la izquierda de la marca de verificación verde.

El equipo de Seguridad detectó algo en la configuración de seguridad. ¿Puedes ver qué parte de la configuración anterior le preocupa tanto?
Analiza más de cerca la autenticación aplicada. Actualmente, cualquier persona en Internet puede llamar al servicio de facturación. Esto se indica con la identidad allUsers que tiene el rol Invocador de Cloud Run.

Cuando se implementó originalmente el servicio de facturación, se usó el permiso --allow-unauthenticated
, lo que significa que el servicio es de acceso público y se puede invocar sin autenticación.
Tipo |
Permiso |
Descripción |
Acceso por URL |
--allow-unauthenticated |
Hace que el servicio sea de acceso público (los usuarios no autenticados pueden acceder a él). |
Principal que invoca |
allUsers |
Permite que cualquiera invoque o active el servicio. |
Si quitas el permiso --allow-unauthenticated
, puedes usar los permisos predeterminados de Cloud Run para proteger el servicio o especificar explícitamente el permiso no-allow-unauthenticated
.
Tipo |
Permiso |
Descripción |
Acceso por URL |
--no-allow-unauthenticated |
Protege el servicio con autenticación (solo los usuarios autenticados pueden acceder a él). |
Principal que invoca |
ninguno |
No permite que nadie invoque o active el servicio. |
Nota: Recuerda que, con Google Cloud, siempre debes intentar usar permisos de privilegio mínimo en tu solución.
Con estos cambios, el equipo de Seguridad estará mucho más satisfecho con el diseño general.
Haz clic en Revisar mi progreso para verificar la tarea realizada.
Implementar un servicio público de Cloud Run
Tarea 3: Autentica solicitudes de servicio
El equipo actualiza el diseño de la aplicación para mostrar cómo funcionarán los cambios:

Los principales cambios son los siguientes:
- Quitar el acceso público sin autenticar al servicio de facturación
- Crear una cuenta de servicio nueva con los permisos adecuados para invocar el servicio de facturación
Actualiza el servicio para que requiera autenticación
Ahora que comprendes mejor los permisos que se usan con Cloud Run, corrige los permisos de autenticación aplicados al servicio de facturación:
-
Borra el servicio implementado existente:
gcloud run services delete billing-service
-
Si se te solicita, escribe Y y, luego, presiona Intro.
-
Vuelve a implementar el servicio de facturación con el permiso --no-allow-authenticated
:
gcloud run deploy billing-service \
--image gcr.io/qwiklabs-resources/gsp723-parking-service \
--region $LOCATION \
--no-allow-unauthenticated
Volver a implementar el servicio significa que ya no permite el acceso no autenticado en su URL de servicio. Además, se quitó el permiso de acceso para invocar el servicio.
-
Espera unos segundos y, luego, invoca el servicio de facturación de nuevo como antes:
curl -X POST -H "Content-Type: application/json" $BILLING_SERVICE_URL -d '{"userid": "1234", "minBalance": 100}'
Como se esperaba, el resultado es un error de permisos, ya que el servicio ahora requiere autenticación.
Crea una cuenta de servicio
Para invocar el servicio de facturación, necesitarás una identidad o cuenta de servicio con los permisos adecuados y vincular esa identidad al servicio.
Esto se puede hacer en la consola de Google Cloud o con la interfaz de línea de comandos de gcloud. En este lab, usarás la consola de Google Cloud para crear la cuenta de servicio y configurar la nueva vinculación de política para el servicio de facturación.
-
En el menú de navegación (
) de la consola de Google Cloud, selecciona IAM y administración > Cuentas de servicio.
-
Para crear una cuenta de servicio nueva que proporcione acceso autenticado, haz clic en Crear cuenta de servicio (Create Service Account) cerca de la parte superior.
-
Asigna el nombre Billing Initiator
a la cuenta de servicio.

-
Para crear la cuenta, haz clic en Crear y continuar (Create and Continue) y, luego, avanza al paso Otorgar acceso.
-
Para otorgar a la cuenta de servicio Billing Initiator permisos para invocar el servicio de facturación, selecciona el menú desplegable Rol (Role), desplázate por el lado izquierdo hasta Cloud Run
y, luego, selecciona el rol Invocador de Cloud Run
(Cloud Run Invoker).

-
Para completar la configuración de la cuenta de servicio, haz clic en Continuar (Continue) y, luego, en Listo (Done).
Verás la nueva cuenta de servicio en la parte superior de la lista de cuentas de servicio en la consola.

Se creó la cuenta de servicio Billing Initiator con la autorización para invocar un servicio de Cloud Run, usando una vinculación de política de IAM en tu proyecto.
Haz clic en Revisar mi progreso para verificar la tarea realizada.
Crear una cuenta de servicio
Tarea 4: Invoca el servicio con autenticación
Ahora que tienes una cuenta de servicio con el permiso adecuado, puedes usarla para invocar tu servicio de Cloud Run.
Autentícate con gcloud
El primer paso es configurar la cuenta de servicio en gcloud para que se pueda usar en la autenticación con el servicio.
-
En el menú de la terminal de Cloud Shell, haz clic en Agregar (
) para abrir una shell nueva en una pestaña separada.
Ejecuta los comandos restantes de esta tarea en esta ventana de Cloud Shell.
-
Obtén el correo electrónico de identidad de la cuenta de servicio y guárdalo en una variable de entorno:
BILLING_INITIATOR_EMAIL=$(gcloud iam service-accounts list --filter="Billing Initiator" --format="value(EMAIL)"); echo $BILLING_INITIATOR_EMAIL
-
En esta terminal de Cloud Shell, asigna la URL del servicio de facturación a una variable de entorno:
BILLING_SERVICE_URL=$(gcloud run services list \
--format='value(URL)' \
--filter="billing-service")
-
Para autenticar gcloud con la cuenta de servicio, genera un archivo de claves:
gcloud iam service-accounts keys create key.json --iam-account=${BILLING_INITIATOR_EMAIL}
-
Autoriza el acceso a Cloud Run con una cuenta de servicio:
gcloud auth activate-service-account --key-file=key.json
Invoca el servicio
-
Invoca el servicio de facturación de Cloud Run con un token de identidad generado a partir de la cuenta de servicio:
curl -X POST -H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-identity-token)" \
$BILLING_SERVICE_URL -d '{"userid": "1234", "minBalance": 500}'
-
En el menú de navegación de la consola de Google Cloud (
), haz clic en Cloud Run.
-
Haz clic en el vínculo a billing-service.
-
Para ver los registros del servicio, haz clic en Registros.
-
Agrega el filtro de registro minBalance
para ver el saldo mínimo actualizado que se recibió en la solicitud hecha al servicio.
Haz clic en Revisar mi progreso para verificar la tarea realizada.
Invocar un servicio de Cloud Run con autenticación
Tarea 5: Implementa el privilegio mínimo
Usaste una cuenta de servicio con los permisos adecuados para invocar un servicio de Cloud Run que antes era accesible para cualquier persona. Pero, ¿usaste los privilegios mínimos absolutos necesarios para llamar a este servicio específico?
Para determinar si esto es cierto, implementa un segundo servicio de facturación que, supongamos, solo debería ser accesible para otros servicios privados internos, como Cloud Scheduler.
Este es un diagrama de este requisito:

Implementa un segundo servicio
-
Abre una tercera ventana o pestaña de la terminal de Cloud Shell.
-
Crea una variable de entorno LOCATION:
LOCATION={{{project_0.default_region|REGION}}}
-
Para simular un segundo servicio, implementa la imagen de la aplicación de facturación en Cloud Run:
gcloud run deploy billing-service-2 \
--image gcr.io/qwiklabs-resources/gsp723-parking-service \
--region $LOCATION \
--no-allow-unauthenticated
-
Asigna la URL del nuevo servicio a una variable de entorno:
BILLING_SERVICE_2_URL=$(gcloud run services list \
--format='value(URL)' \
--filter="billing-service-2")
Invoca el segundo servicio con la identidad de la cuenta de servicio
-
En esta tercera terminal de Cloud Shell, autoriza el acceso a Cloud Run con la misma cuenta de servicio:
gcloud auth activate-service-account --key-file=key.json
-
Invoca el segundo servicio de Cloud Run con un token de identidad generado a partir de la cuenta de servicio:
curl -X POST -H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-identity-token)" \
$BILLING_SERVICE_2_URL -d '{"userid": "1234", "minBalance": 900}'
¿Por qué tuvo éxito? Esto se debe a que cuando creaste la cuenta de servicio, se le otorgaron los permisos de Invocador de Cloud Run en el proyecto. Debido a la herencia, los recursos del proyecto, como los dos servicios de Cloud Run, heredan esos permisos. Como resultado, la cuenta de servicio se puede usar para invocar los servicios.
Restringe los permisos de la cuenta de servicio
Para implementar por completo el privilegio mínimo, solo se deben otorgar permisos a la cuenta de servicio en el servicio que necesita.
En esta subtarea, quitarás el permiso que se le otorgó previamente a la cuenta de servicio en el proyecto y, luego, agregarás los permisos adecuados que se requieren para invocar el servicio de facturación original.
-
Cambia a la primera ventana de la terminal de Cloud Shell.
-
En esta terminal de Cloud Shell, obtén el correo electrónico de identidad de la cuenta de servicio y guárdalo en una variable de entorno:
BILLING_INITIATOR_EMAIL=$(gcloud iam service-accounts list --filter="Billing Initiator" --format="value(EMAIL)"); echo $BILLING_INITIATOR_EMAIL
-
Quita el permiso de la cuenta de servicio para el proyecto:
gcloud projects remove-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member=serviceAccount:${BILLING_INITIATOR_EMAIL} \
--role=roles/run.invoker
-
Agrega el permiso a la cuenta de servicio en el servicio de facturación:
gcloud run services add-iam-policy-binding billing-service --region $LOCATION \
--member=serviceAccount:${BILLING_INITIATOR_EMAIL} \
--role=roles/run.invoker --platform managed
Invoca los servicios
-
Regresa a la segunda ventana o pestaña de la terminal de Cloud Shell.
-
Espera unos segundos y, luego, invoca el primer servicio de facturación de Cloud Run con un token de identidad generado a partir de la cuenta de servicio:
curl -X POST -H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-identity-token)" \
$BILLING_SERVICE_URL -d '{"userid": "1234", "minBalance": 700}'
Los permisos actualizados tardan unos segundos en propagarse, después de lo cual esta invocación debería ser exitosa.
-
Cambia a la tercera ventana de la terminal de Cloud Shell.
-
Intenta invocar el segundo servicio de Cloud Run con un token de identidad generado a partir de la misma cuenta de servicio:
curl -X POST -H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-identity-token)" \
$BILLING_SERVICE_2_URL -d '{"userid": "1234", "minBalance": 500}'
Ahora deberías recibir un error de permisos que indica que la cuenta de servicio solo tiene el conjunto mínimo de permisos necesarios para invocar el primer servicio.
Haz clic en Revisar mi progreso para verificar la tarea realizada.
Usar el privilegio mínimo para invocar un servicio de Cloud Run
¡Felicitaciones!
En este lab, viste cómo reconfigurar un servicio implementado para proteger el acceso a él y aplicaste el principio de privilegio mínimo cuando otorgaste permisos para acceder a recursos en Google Cloud. Tú:
- Implementaste un servicio en Cloud Run.
- Usaste la gcloud CLI para actualizar el servicio de modo que requiriera autenticación.
- Creaste una cuenta de servicio con los permisos necesarios para invocar el servicio.
- Estableciste los permisos mínimos necesarios para invocar un servicio específico en Cloud Run, implementando el privilegio mínimo.
Sigue la serie de videos Serverless Expeditions para obtener más información sobre cómo usar estos productos en tu proyecto.
Finalice su lab
Cuando haya completado el lab, haga clic en Finalizar lab. Google Cloud Skills Boost quitará los recursos que usó y limpiará la cuenta.
Tendrá la oportunidad de calificar su experiencia en el lab. Seleccione la cantidad de estrellas que corresponda, ingrese un comentario y haga clic en Enviar.
La cantidad de estrellas indica lo siguiente:
- 1 estrella = Muy insatisfecho
- 2 estrellas = Insatisfecho
- 3 estrellas = Neutral
- 4 estrellas = Satisfecho
- 5 estrellas = Muy satisfecho
Puede cerrar el cuadro de diálogo si no desea proporcionar comentarios.
Para enviar comentarios, sugerencias o correcciones, use la pestaña Asistencia.
Copyright 2020 Google LLC. All rights reserved. Google y el logotipo de Google son marcas de Google LLC. Los demás nombres de productos y empresas pueden ser marcas de las respectivas empresas a las que estén asociados.