Identidad del servicio

Cada revisión o trabajo de Cloud Run está vinculado a una cuenta de servicio. Las bibliotecas cliente de Google Cloud usan esta cuenta de servicio de forma automática para autenticarse con las APIs de Google Cloud. Entre los ejemplos de las API de Google Cloud con las que el código de servicio puede interactuar, se incluyen Cloud Storage, Firestore, Cloud SQL, Pub/Sub o Cloud Tasks.

Si no especificas una cuenta de servicio, Cloud Run vincula una revisión o un trabajo a la cuenta de servicio predeterminada que tiene permisos amplios en todas las APIs de Google Cloud. Google recomienda usar la identidad por servicio y otorgar permisos selectivos en su lugar.

Acerca de la cuenta de servicio predeterminada

De forma predeterminada, las revisiones y los trabajos 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 asignarle esa identidad de servicio o trabajo 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 o trabajo 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.

Google Cloud CLI 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ón de la revisión actual de Cloud Run. Esto significa que si tu código usa gcloud CLI 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.

Existen dos aspectos para asignar la identidad por servicio:

Permisos necesarios para asignar 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 (iam.serviceAccounts.actAs) de esa cuenta de servicio. Este permiso se puede otorgar a través del rol 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 la consola de Google Cloud, a través de la API (YAML) o mediante gcloud CLI de la siguiente manera:

gcloud iam service-accounts add-iam-policy-binding "SERVICE_ACCOUNT_EMAIL" \
    --member "PRINCIPAL" \
    --role "roles/iam.serviceAccountUser"

Reemplaza lo siguiente:

  • SERVICE_ACCOUNT_EMAIL por la dirección de correo electrónico de la cuenta de servicio, como PROJECT_NUMBER-compute@developer.gserviceaccount.com.
  • PRINCIPAL por la principal a la que agregarás la vinculación. Usa el formato user:email, por ejemplo, user:test-user@gmail.com.

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 la consola de Google Cloud, gcloud CLI o la API (YAML) cuando crees un servicio nuevo o implementes una revisión nueva:

Consola

  1. En la consola de Google Cloud ve a Cloud Run:

    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 implementar y editar la nueva revisión.

  3. Si configuras un servicio nuevo, completa la página de configuración del servicio inicial como desees y haz clic en Contenedor, herramientas de redes, seguridad para expandir la página de configuración del servicio.

  4. Haz clic en la pestaña Seguridad.

    image

    • Haz clic en el menú desplegable Service account (Cuenta de servicio) y selecciona la cuenta de servicio que deseas.
  5. 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 Si usas Artifact Registry, el repositorio REPO_NAME debe estar creado. La URL tiene el formato REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
  • 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 las configuraciones 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 siguiente comando:

    gcloud run services replace service.yaml

Terraform

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

Para crear una cuenta de servicio, agrega el siguiente recurso a tu archivo main.tf existente:

resource "google_service_account" "cloudrun_service_identity" {
  account_id = "my-service-account"
}

Crea o actualiza un servicio de Cloud Run y, luego, incluye tu cuenta de servicio:

resource "google_cloud_run_v2_service" "default" {
  name     = "cloud-run-srv"
  location = "us-central1"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    service_account = google_service_account.cloudrun_service_identity.email
  }
}

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 del proyecto de despliegue:

    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 roles directamente al recurso de la cuenta de servicio o heredar de niveles superiores en la jerarquía de recursos.

Permisos que requieren las cuentas de servicio administradas por el usuario para operar Cloud Run

Si un servicio de Cloud Run no accede a ninguna otra parte de Google Cloud, su cuenta de servicio no necesita tener funciones ni permisos.

Cuando creas una cuenta de servicio nueva desde la consola de Google Cloud, el paso opcional “Otorgar a esta cuenta de servicio acceso al proyecto” es para cualquier acceso adicional necesario. Por ejemplo, un servicio de Cloud Run puede invocar otro servicio privado de Cloud Run o acceder a una base de datos de Cloud SQL, las cuales requieren una especificación específica de funciones de IAM. Consulta la documentación sobre la administración de acceso para obtener más información.

Recupera los tokens de ID y acceso con el servidor de metadatos

Si el código de tu servicio de Cloud Run usa una biblioteca cliente de Google Cloud, la biblioteca adquiere de forma automática los tokens de acceso para autenticar tus solicitudes de código con la cuenta de servicio del entorno de ejecución del servicio.

Si, en cambio, usas tu propio código personalizado, puedes usar el servidor de metadatos para recuperar tokens de ID y de acceso de forma manual. Ten en cuenta que no puedes consultar este servidor 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.

Los dos tipos de tokens que puedes recuperar con el servidor de metadatos son los siguientes:

Para recuperar un token, selecciona una de estas opciones:

Tokens de acceso

Por ejemplo, si deseas crear un tema de Pub/Sub, usa el método projects.topics.create.

  1. Usa el servidor de metadatos de Compute para recuperar un token de acceso:

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

    Este extremo muestra una respuesta JSON con un atributo access_token.

  2. En tu solicitud HTTP/protocolo, la solicitud debe autenticarse con un token de acceso en el encabezado Authorization:

    PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
    Authorization: Bearer ACCESS_TOKEN
    

    Aquí:

    • PROJECT_ID es el ID del proyecto.
    • TOPIC_ID es el ID del tema.
    • ACCESS_TOKEN es el token de acceso que recuperaste en el paso anterior.

    Respuesta:

    {
        "name": "projects/PROJECT_ID/topics/TOPIC_ID"
    }
    

Tokens de ID

Usa el servidor de metadatos de Compute para recuperar 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 o un público personalizado, como un dominio personalizado, configurado para el servicio.

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.

Para 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.