Identidad del servicio

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.
Cada revisión de Cloud Run está vinculada a una cuenta de servicio. Las bibliotecas cliente de Google Cloud usan esta cuenta de servicio de forma automática para autenticarse con las API 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 a la cuenta de servicio predeterminada que tiene permisos amplios en todas las API 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 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 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.

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 la CLI 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.

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 la CLI 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 la consola de Google Cloud, la CLI 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 Edit and Deploy New Revision.

  3. Si configuras un servicio nuevo, completa la página de configuración del servicio inicial como desees y haz clic en Contenedor, conexiones, seguridad para expandir 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 siguiente comando:

    gcloud run services replace service.yaml

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_service" "default" {
  name     = "cloud-run-srv"
  location = "us-central1"

  template {
    spec {
      containers {
        image = "gcr.io/cloudrun/hello"
      }
      service_account_name = google_service_account.cloudrun_service_identity.email
    }
  }

  traffic {
    percent         = 100
    latest_revision = true
  }
}

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 Google Cloud Console, 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 identidad y acceso mediante 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 adecuados para autenticar tus solicitudes de código mediante 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 identidad y tokens de acceso de forma manual. Nota: 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.

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 llamadas 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 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:

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.