Identidad del servicio

Acerca de la cuenta de servicio predeterminada

De forma predeterminada, las revisiones de Cloud Run se ejecutan como la cuenta de servicio predeterminada de Compute Engine. La cuenta de servicio predeterminada de Compute Engine tiene la función de IAM Editor del proyecto que otorga permisos de lectura y escritura en todos los recursos del proyecto de Google Cloud.

Si bien esto puede ser conveniente, en lugar de usar la cuenta de servicio predeterminada, Google recomienda crear tu propia cuenta de servicio administrada por el usuario con los permisos más detallados y asignar esa cuenta de servicio como la identidad de tu servicio de Cloud Run. En este documento, se describe cómo configurar identidades por servicio con Cloud Run.

Usa la identidad por servicio

Google recomienda asignar una cuenta de servicio administrada por el usuario a cada servicio de Cloud Run en lugar de usar la cuenta de servicio predeterminada. Las cuentas de servicio creadas por el usuario te permiten controlar el acceso mediante la concesión de un conjunto mínimo de permisos con Identity and Access Management.

La herramienta de línea de comandos de gcloud y las bibliotecas cliente de Google Cloud detectan de forma automática cuándo se ejecutan en Google Cloud y usan la cuenta de servicio del entorno de ejecuciónde la revisión actual de Cloud Run. Esto significa que si tu código usa la herramienta de gcloud o una biblioteca cliente oficial de Google Cloud, esta detectará y autenticará de forma automática como la cuenta de servicio del entorno de ejecución del servicio de Cloud Run. Esta estrategia se denomina credenciales predeterminadas de la aplicación y permite la portabilidad de código en varios entornos.

Permisos necesarios en las cuentas de servicio administradas por el usuario

A fin de implementar un servicio de Cloud Run mediante una cuenta de servicio administrada por el usuario, debes tener permiso para actuar en nombre de una cuenta de servicio (iam.serviceAccounts.actAs). Este permiso se puede otorgar a través de la función de IAM roles/iam.serviceAccountUser. Todos los principales (p.ej., usuarios, cuentas de servicio) deben tener este permiso en la cuenta de servicio administrada por el usuario para implementar un servicio de Cloud Run como la cuenta de servicio administrada por el usuario.

Puedes otorgar este permiso mediante Cloud Console, a través de la API (YAML) o mediante la herramienta de gcloud de la siguiente manera:

gcloud iam service-accounts add-iam-policy-binding "SERVICE_ACCOUNT_EMAIL" \
    --member "user@example.com" \
    --role "roles/iam.serviceAccountUser"

Para obtener información sobre cómo otorgar permisos, consulta Otorga, cambia y revoca el acceso a los recursos.

Implementa un servicio nuevo con una cuenta de servicio creada por el usuario

Si aún no tienes una cuenta de servicio administrada por el usuario, primero crea una cuenta de servicio.

Puedes configurar la cuenta de servicio del servicio de Cloud Run mediante Cloud Console, la herramienta de gcloud o la API (YAML) cuando crees un servicio nuevo o implementes una revisión nueva:

Console

  1. Ir a Cloud Run

  2. Haz clic en Crear servicio si quieres configurar un servicio nuevo en el que realizarás la implementación. Si quieres configurar un servicio existente, haz clic en el servicio y, luego, en Editar e implementar nueva revisión.

  3. Si estás configurando un servicio nuevo, llena la página de configuración inicial del servicio como desees y haz clic en Siguiente > Configuración avanzada para acceder a la página de configuración del servicio.

  4. Haz clic en la pestaña Seguridad.

    image

  5. Haz clic en el menú desplegable Service account (Cuenta de servicio) y selecciona la cuenta de servicio que deseas.

  6. Haz clic en Crear o Implementar.

gcloud

Puedes actualizar un servicio existente para tener una nueva cuenta de servicio del entorno de ejecución mediante el siguiente comando:

gcloud run services update SERVICE --service-account SERVICE_ACCOUNT

Reemplaza lo siguiente:

  • SERVICE por el nombre de tu servicio
  • SERVICE_ACCOUNT por la cuenta de servicio asociada a la identidad nueva: este valor es la dirección de correo electrónico de la cuenta de servicio, por ejemplo, example@myproject.iam.gserviceaccount.com.

También puedes configurar una cuenta de servicio durante la implementación mediante el siguiente comando:

gcloud run deploy --image IMAGE_URL --service-account SERVICE_ACCOUNT

Reemplaza lo siguiente:

  • IMAGE_URL por una referencia a la imagen del contenedor, como us-docker.pkg.dev/cloudrun/container/hello:latest
  • SERVICE_ACCOUNT por la cuenta de servicio asociada a la identidad nueva: este valor es la dirección de correo electrónico de la cuenta de servicio, por ejemplo, example@myservice.iam.gserviceaccount.com.

YAML

Puedes descargar y ver la configuración del servicio existente mediante el comando gcloud run services describe --format export, que genera resultados limpios en formato YAML. Luego, puedes modificar los campos que se describen a continuación y subir el YAML modificado mediante el comando gcloud run services replace. Asegúrate de modificar los campos tal como se indica en la documentación.

  1. Para ver y descargar la configuración, ejecuta el siguiente comando:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Actualiza el atributo serviceAccountName::

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          serviceAccountName: SERVICE_ACCOUNT

    Reemplaza los siguientes elementos:

    • SERVICE por el nombre del servicio de Cloud Run
    • SERVICE_ACCOUNT por la cuenta de servicio asociada a la identidad nueva: este valor es la dirección de correo electrónico de la cuenta de servicio, por ejemplo, example@myproject.iam.gserviceaccount.com.
  3. Reemplaza el servicio por la configuración nueva mediante el comando siguiente:

    gcloud run services replace service.yaml

Usa cuentas de servicio en otros proyectos

También puedes usar una cuenta de servicio administrada por el usuario que resida en un proyecto de Google Cloud diferente del servicio de Cloud Run. Si la cuenta de servicio y el servicio de Cloud Run están en proyectos diferentes, sigue estos pasos:

  • El proyecto que contiene esta cuenta de servicio requiere que la política de la organización iam.disableCrossProjectServiceAccountUsage se establezca como falsa o no se aplique a nivel de carpeta o se herede de la configuración a nivel de proyecto. El valor predeterminado es de true.

  • La cuenta de servicio requiere una membresía de función para roles/iam.serviceAccountTokenCreator del agente de servicio de deploy-project:

    service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com
    

    donde PROJECT_NUMBER es el número del proyecto para el proyecto.

  • La cuenta de servicio requiere una membresía de función para roles/iam.serviceAccountUser en la identidad (usuario o automatización) que realiza la operación de implementación.

Puedes aplicar membresías de funciones directamente al recurso de la cuenta de servicio o heredar de niveles superiores en la jerarquía de recursos.

Recupera los tokens de identidad y acceso

No es necesario recuperar tokens de identidad ni de acceso si el código de tu servicio de Cloud Run usa una biblioteca cliente de Google Cloud. Estas bibliotecas cliente detectarán y autenticarán de manera automática con la cuenta de servicio del entorno de ejecución del servicio de Cloud Run.

El código personalizado que se ejecuta en un servicio de Cloud Run puede usar el servidor de metadatos para recuperar tokens de identidad y de acceso. No puedes consultar este servidor de metadatos directamente desde tu máquina local, ya que el servidor de metadatos solo está disponible para cargas de trabajo que se ejecutan en Google Cloud.

Tokens de acceso

Debes usar tokens de acceso de OAuth 2.0 cuando llamas a la mayoría de las API de Google. Para generar un token de acceso, haz lo siguiente:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
    --header "Metadata-Flavor: Google"

De forma predeterminada, los tokens de acceso tienen el alcance cloud-platform, que permite el acceso a todas las API de Google Cloud Platform, suponiendo que IAM también permita el acceso. Para acceder a otras API de Google o Google Cloud, deberás recuperar un token de acceso con el permiso adecuado. Para especificar diferentes permisos, sigue estos pasos:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?scopes=SCOPES" \
    --header "Metadata-Flavor: Google"

En el ejemplo anterior, SCOPES es una lista separada por comas de los permisos de OAuth solicitados, por ejemplo:

https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets

Consulta la lista completa de permisos de Google OAuth para buscar los que necesitas. También puedes obtener más información sobre cómo recuperar tokens de acceso.

Tokens de identidad

Debes usar tokens de identidad cuando llamas a otros servicios de Cloud Run o cuando invocas cualquier servicio que pueda validar un token de identidad.

Usa el servidor de metadatos de Compute para obtener un token de identidad con un público específico:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \
    --header "Metadata-Flavor: Google"

En el ejemplo anterior, AUDIENCE es el JWT Audience solicitado.

Para los servicios de Cloud Run, el público debe ser la URL del servicio que invocas:

https://service.domain.com

Para otros recursos, es probable que sea el ID de cliente de OAuth de un recurso protegido por IAP:

1234567890.apps.googleusercontent.com

Obtén recomendaciones para crear cuentas de servicio dedicadas

El servicio de recomendación proporciona de forma automática recomendaciones para crear una cuenta de servicio dedicada con el conjunto mínimo de permisos necesarios.

Próximos pasos

Obtén más información sobre cómo administrar el acceso a los servicios o autenticar a los desarrolladores, los servicios y los usuarios finales en ellos de forma segura.

A fin de obtener una explicación integral de una aplicación que usa la identidad de servicio para minimizar el riesgo de seguridad, sigue el instructivo sobre cómo proteger los servicios de Cloud Run.