Identidad de funciones (1.ª gen.)

Por motivos de seguridad, la mayoría de las interacciones entre entidades en Google Cloud requieren que cada entidad tenga una identidad verificable, protegida por algún tipo de secreto, como una contraseña o una clave. Al igual que otras entidades necesitan una identidad para acceder a las funciones de Cloud Run, las propias funciones suelen necesitar acceso a otros recursos de Google Cloud para hacer su trabajo. Cada función está asociada a una cuenta de servicio que sirve como identidad cuando la función accede a otros recursos. La cuenta de servicio que usa una función como identidad también se conoce como cuenta de servicio de tiempo de ejecución.

Para usarlo en producción, Google recomienda que asignes a cada función una identidad específica mediante una cuenta de servicio gestionada por el usuario. Las cuentas de servicio gestionadas por el usuario te permiten controlar el acceso concediendo un conjunto mínimo de permisos mediante Gestión de Identidades y Accesos.

Cuenta de servicio de tiempo de ejecución

A menos que especifiques otra cuenta de servicio de entorno de ejecución al desplegar una función, las funciones de Cloud Run usarán una cuenta de servicio predeterminada como identidad para la ejecución de la función:

Estas cuentas de servicio predeterminadas tienen el rol Editor, que les da acceso amplio a muchos Google Cloud servicios. Aunque esta es la forma más rápida de desarrollar funciones, Google recomienda usar la cuenta de servicio predeterminada solo para las pruebas y el desarrollo. En producción, debes conceder a la cuenta de servicio de tiempo de ejecución solo el conjunto mínimo de permisos necesarios para lograr su objetivo.

Para proteger tus funciones en producción:

Cambiar los permisos de la cuenta de servicio de tiempo de ejecución predeterminada

Consola

  1. Ve a la página Gestión de identidades y accesos de la Google Cloud consola:

    Ir a la Google Cloud consola

  2. Selecciona la cuenta de servicio predeterminada de App Engine o la cuenta de servicio predeterminada de Compute de la tabla.

  3. Haz clic en el icono del lápiz situado a la derecha de la fila para mostrar la pestaña Editar permisos.

  4. Añade o quita roles en el menú desplegable Rol para proporcionar el acceso con los mínimos privilegios.

  5. Haz clic en Guardar.

gcloud

Quita el rol Editor y, a continuación, usa el comando gcloud projects add-iam-policy-binding para añadir un nuevo rol:

# Remove the Editor role
gcloud projects remove-iam-policy-binding PROJECT_ID \
--member="SERVICE_ACCOUNT_EMAIL" \
--role="roles/editor"

# Add the desired role
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="SERVICE_ACCOUNT_EMAIL" \
--role="ROLE"

Donde PROJECT_ID es el ID del proyecto que estás usando, SERVICE_ACCOUNT_EMAIL es la dirección de correo de la cuenta de servicio de tiempo de ejecución predeterminada, tal como se muestra anteriormente en Cuenta de servicio de tiempo de ejecución, y ROLE es el nuevo rol que se va a asignar a la cuenta de servicio de tiempo de ejecución predeterminada.

Usar cuentas de servicio individuales para tus funciones

Para que tengas más flexibilidad a la hora de controlar el acceso a tus funciones, puedes asignarles a cada una su propia cuenta de servicio gestionada por el usuario.

  1. Crea tu cuenta de servicio. Anota su nombre.
  2. Concédele los roles adecuados, en función de los recursos a los que necesite acceder la función para hacer su trabajo.
  3. Si la cuenta de servicio y la función están en proyectos diferentes, haz lo siguiente desde el proyecto en el que se encuentre la cuenta de servicio:

    1. Configura la cuenta de servicio para que funcione en varios proyectos.
    2. Asigna el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) a la cuenta de servicio del agente de servicio de Cloud Run (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com), donde PROJECT hace referencia al proyecto en el que se encuentra la función. El agente de servicio de funciones de Cloud Run gestiona el acceso entre proyectos de tu cuenta de servicio.

    3. Concede el permiso iam.serviceaccounts.actAs al agente de servicio de las funciones de Cloud Run en la cuenta de servicio del otro proyecto.

  4. Concede a la cuenta de servicio acceso al recurso. El método para hacerlo depende del tipo de recurso.

  5. Conecta la cuenta de servicio con tu función. Puedes hacerlo durante la implementación o actualizando una función que ya se haya implementado.

Añadir una cuenta de servicio gestionada por el usuario durante la implementación

Consola

  1. Ve a la Google Cloud consola:

    Ir a la Google Cloud consola

  2. Especifica y configura la función como quieras.

  3. Haz clic en Tiempo de ejecución, compilación... para ver más ajustes.

  4. Selecciona la pestaña Tiempo de ejecución.

  5. Haga clic en el menú desplegable Cuenta de servicio y seleccione la cuenta de servicio que quiera.

  6. Haz clic en Siguiente y en Implementar.

gcloud

Cuando despliegues una función con gcloud functions deploy, añade la marca --service-account. Por ejemplo:

gcloud functions deploy --no-gen2 FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL

donde FUNCTION_NAME es el nombre de tu función y SERVICE_ACCOUNT_EMAIL es el correo de la cuenta de servicio.

Actualizar la cuenta de servicio de una función

Puedes actualizar la cuenta de servicio de tiempo de ejecución de una función.

Consola

  1. Ve a la Google Cloud consola:

    Ir a la Google Cloud consola

  2. Haz clic en el nombre de la función que quieras para ir a su página de detalles.

  3. Haz clic en el icono de lápiz Editar situado en la parte superior de la página de detalles para editar la función.

  4. Haz clic en Tiempo de ejecución, compilación... para ver más ajustes.

  5. Selecciona la pestaña Tiempo de ejecución.

  6. Haga clic en el menú desplegable Cuenta de servicio y seleccione la cuenta de servicio que quiera.

  7. Haz clic en Siguiente y en Implementar.

gcloud

Cuando despliegues una función con gcloud functions deploy, añade la marca --service-account:

gcloud functions deploy FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL

donde FUNCTION_NAME es el nombre de tu función y SERVICE_ACCOUNT_EMAIL es la cuenta de servicio.

La función vuelve a implementarse y ahora usa la nueva cuenta de servicio del tiempo de ejecución.

Usar el servidor de metadatos para obtener tokens

Aunque las cuentas de servicio definidas por IAM son el método preferido para gestionar el acceso en Google Cloud, algunos servicios pueden requerir otros modos, como una clave de API, un cliente de OAuth 2.0 o una clave de cuenta de servicio. El acceso a un recurso externo también puede requerir métodos alternativos.

Si el servicio de destino requiere que presentes un token de ID de OpenID Connect o un token de acceso de OAuth 2.0, puedes usar el servidor de metadatos de Compute para obtener estos tokens en lugar de configurar un cliente de OAuth completo.

Tokens de identidad

Puedes usar el servidor de metadatos de Compute para obtener tokens de ID con una audiencia específica de la siguiente manera:

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

Donde AUDIENCE es el destino solicitado. Por ejemplo, la URL de un servicio que estés invocando, como https://service.domain.com, o el ID de cliente de OAuth de un recurso protegido por IAP, como 1234567890.apps.googleusercontent.com.

Tokens de acceso

Los tokens de acceso de OAuth 2.0 usan scopes para definir los permisos de acceso. De forma predeterminada, los tokens de acceso de Google Cloud tienen el ámbito cloud-platform. Para acceder a otras APIs de Google o Google Cloud , debes obtener un token de acceso con el ámbito adecuado.

Puedes usar el servidor de metadatos de Compute para obtener tokens de acceso.

Si necesitas un token de acceso con un permiso específico, puedes generarlo de la siguiente manera:

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

Donde SCOPES es una lista de permisos de OAuth separados por comas solicitados. Por ejemplo: https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets.

Consulta la lista completa de permisos de OAuth de Google para saber qué permisos necesitas.

Pasos siguientes

Consulta cómo autorizar el acceso a tus funciones o cómo autenticar a desarrolladores y otras funciones para que puedan invocar tus funciones.