Definir audiencias personalizadas de servicios

En esta página se describe cómo usar audiencias personalizadas para la autorización.

Los clientes que llamen a un servicio de Cloud Run protegido por Gestión de Identidades y Accesos deben proporcionar un token de ID válido que incluya una reclamación de audiencia que coincida con la URL *.run.app del servicio receptor. En el caso de los clientes que no conozcan esta URL, puede usar un valor de audiencia personalizado.

Información sobre las audiencias personalizadas

Cloud Run proporciona un rol de invocador (roles/run.invoker) para admitir el control de acceso con IAM. El control de acceso de IAM usa tokens de ID firmados por Google, que se empaquetan como JSON Web Tokens (JWTs). El contenido de estos tokens se ajusta a un estándar de OIDC.

Un campo de audiencia se codifica en el token para especificar el objetivo al que se dirige y que puede usar el token. De esta forma, se limita el riesgo de que se produzca un ataque de repetición, en el que se repite un token interceptado que se iba a usar con un servicio en otro servicio.

Por convención, la audiencia es la URL completa del servicio de destino. De forma predeterminada en Cloud Run, se trata de la URL generada por Google de un servicio que termina en run.app.

Sin embargo, un servicio de Cloud Run puede estar detrás de una URL distinta de la URL generada de forma predeterminada, como en los siguientes casos:

  • Cuando se usa un dominio personalizado para acceder a un servicio en el que el cliente no conoce la URL generada por Google.
  • Cuando se implementan varios servicios detrás de un balanceador de carga y un cliente no puede predecir a qué servicio regional llega una solicitud. Las URLs generadas por Google para los servicios son específicas de la región, aunque el nombre del servicio sea el mismo.

En estos casos, debe configurar un servicio para que acepte valores de audiencia personalizados que permitan añadir segmentaciones conocidas por un cliente. La URL predeterminada generada por Google siempre se mantiene como valor de audiencia aceptado.

Definir y actualizar audiencias personalizadas

Las audiencias personalizadas de Cloud Run se definen a nivel de servicio y se aplican a todas las revisiones de servicio, de forma similar a la pertenencia a la autorización de gestión de identidades y accesos.

Puedes definir varias audiencias personalizadas, siempre que la codificación JSON de las audiencias como lista de cadenas no supere los 32.768 caracteres.

Cualquier cambio en la configuración conlleva la creación de una nueva revisión. Las revisiones posteriores también recibirán automáticamente este ajuste de configuración, a menos que hagas cambios explícitos para modificarlo.

gcloud

Puedes definir audiencias personalizadas en un servicio con el siguiente comando:

gcloud run services update SERVICE --add-custom-audiences=AUDIENCE

Sustituir

  • SERVICE con el nombre de tu servicio de Cloud Run
  • AUDIENCE con una cadena de la audiencia personalizada que quieras admitir. Por ejemplo, myservice o https://myservice.example.com.

Para quitar todas las audiencias personalizadas de un servicio, usa el siguiente comando:

gcloud run services update SERVICE --clear-custom-audiences

YAML

  1. Si va a crear un servicio, puede saltarse este paso. Si va a actualizar un servicio, descargue su configuración YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Define la anotación run.googleapis.com/custom-audiences en los metadatos de Service (no en los metadatos de template):

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      annotations:
        run.googleapis.com/custom-audiences: '["AUDIENCE"]'
    spec:
      template:
        ...

    Sustituir

    • SERVICE con el nombre de tu servicio de Cloud Run
    • AUDIENCE con una cadena de la audiencia personalizada que quieras admitir. Por ejemplo, myservice o https://myservice.example.com.

    Ten en cuenta que el valor del atributo es una matriz JSON de cadenas entre comillas, por lo que se deben usar comillas dobles y simples.

  3. Sustituye el servicio por su nueva configuración con el siguiente comando:

    gcloud run services replace service.yaml

Terraform

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

Añade lo siguiente a un recurso google_cloud_run_v2_service en tu configuración de Terraform:

resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE"
  location = "REGION"

  custom_audiences = ["AUDIENCE"]
  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
  }
}

Sustituye:

  • SERVICE con el nombre de tu servicio de Cloud Run.
  • REGION con la región Google Cloud . Por ejemplo, europe-west1.
  • AUDIENCE con una cadena de la audiencia personalizada que quieras admitir. Por ejemplo, myservice.

Verificar audiencias personalizadas

  1. Obtener un token de ID de una cuenta de servicio que tenga permiso de gestión de identidades y accesos para invocar el servicio. Fíjate en el uso de la audiencia personalizada AUDIENCE.

    export TOKEN=$(gcloud auth print-identity-token --impersonate-service-account SERVICE_ACCOUNT_EMAIL --audiences='AUDIENCE')

    Sustituye:

    • SERVICE_ACCOUNT_EMAIL con el correo de la cuenta de servicio. Termina con .iam.gserviceaccount.com.
    • AUDIENCE con el valor de audiencia personalizada que hayas definido en el servicio.
  2. Llama al endpoint del servicio con ese token de ID.

    curl -H "Authorization: Bearer ${TOKEN}" ENDPOINT

    Sustituye ENDPOINT por el endpoint para acceder a tu servicio, por ejemplo, su dominio personalizado o la URL .run.app.

  3. Confirma que la solicitud está autorizada y que ves la respuesta esperada de tu servicio.