Identidad de las 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 y protegida por algún tipo de Secret, como una contraseña o una clave. Así como otras entidades necesitan una identidad para acceder a Cloud Run Functions, las funciones a menudo necesitan acceso a otros recursos en Google Cloud para realizar su trabajo. Cada función está asociada con una cuenta de servicio que funciona como su identidad cuando la función accede a otros recursos. La cuenta de servicio que una función usa como su identidad también se conoce como su cuenta de servicio del entorno de ejecución.

Para el uso en producción, Google recomienda asignar a cada función una identidad dedicada mediante la asignación de una cuenta de servicio administrada por el usuario. Las cuentas de servicio administradas por el usuario te permiten controlar el acceso mediante la concesión de un conjunto mínimo de permisos con Identity and Access Management.

Cuenta de servicio del entorno de ejecución

A menos que especifiques una cuenta de servicio diferente del entorno de ejecución cuando implementes una función, Cloud Run Functions usa una cuenta de servicio predeterminada como su identidad para la ejecución de la función:

Estas cuentas de servicio predeterminadas tienen el rol Editor, que les permite un acceso amplio a muchos servicios de Google Cloud. Si bien esta es la forma más rápida de desarrollar funciones, Google recomienda usar la cuenta de servicio predeterminada solo para pruebas y desarrollo. Para la producción, debes otorgar a la cuenta de servicio del entorno de ejecución solo el conjunto mínimo de permisos necesarios para lograr su objetivo.

Para proteger tus funciones en producción, haz lo siguiente:

Cambia los permisos en la cuenta de servicio del entorno de ejecución predeterminada

Console

  1. Ve a la página de IAM en la consola de Google Cloud:

    Ir a la consola de Google Cloud

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

  3. Haz clic en el ícono de lápiz en el lado derecho de la fila para ver la pestaña Editar permisos.

  4. Agrega o quita roles en el menú desplegable Rol para proporcionar acceso con privilegio mínimo.

  5. Haz clic en Guardar.

gcloud

Elimina la función Editor y, luego, usa el comando gcloud projects add-iam-policy-binding para agregar una función nueva:

# 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"

En este caso, PROJECT_ID es el ID del proyecto que usas, SERVICE_ACCOUNT_EMAIL es la dirección de correo electrónico de la cuenta de servicio del entorno de ejecución predeterminada, como se mostró antes en Cuenta de servicio del entorno de ejecución, yROLE es el rol nuevo que se asignará a la cuenta de servicio del entorno de ejecución predeterminada.

Usa cuentas de servicio individuales para las funciones

Para brindarte mayor flexibilidad en el control del acceso a tus funciones, puedes proporcionarles a cada una su propia cuenta de servicio administrada por el usuario.

  1. Crea tu cuenta de servicio. Toma nota de su nombre.
  2. Otorga las funciones adecuadas, en función de los recursos a los que necesita acceder la función para hacer su trabajo.
  3. Si la cuenta de servicio y la función se encuentran en proyectos diferentes, desde el proyecto en el que se encuentra la cuenta de servicio, haz lo siguiente:

    1. Configura la cuenta de servicio para que funcione en todos los proyectos.
    2. Otorga el rol de creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) al agente de servicio de Cloud Run Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com), en el que PROJECT se refiere al proyecto en el que reside la función. El agente de servicio de Cloud Run Functions administra el acceso entre proyectos de tu cuenta de servicio.

    3. Otorga el permiso iam.serviceaccounts.actAs al agente de servicio de Cloud Run Functions en la cuenta de servicio del proyecto diferente.

  4. Otorga a la cuenta de servicio acceso al recurso. El método para hacer esto depende del tipo de recurso.

  5. Conecta la cuenta de servicio con la función. Puedes hacerlo en el momento de la implementación o si actualizas una función implementada con anterioridad.

Agrega una cuenta de servicio administrada por el usuario en la implementación

Console

  1. Ve a la consola de Google Cloud:

    Ir a la consola de Google Cloud

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

  3. Haz clic en Entorno de ejecución, compilación… para mostrar opciones de configuración adicionales.

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

  5. Haz clic en el menú desplegable Cuenta de servicio y selecciona la cuenta de servicio deseada.

  6. Haz clic en Siguiente y, luego, Implementar.

gcloud

Cuando implementas una función con gcloud functions deploy, agrega el marcador --service-account. Por ejemplo:

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

en el que FUNCTION_NAME es el nombre de la función y SERVICE_ACCOUNT_EMAIL es el correo electrónico de la cuenta de servicio.

Actualiza la cuenta de servicio de una función existente

Puedes actualizar la cuenta de servicio del entorno de ejecución de una función existente.

Console

  1. Ve a la consola de Google Cloud:

    Ir a la consola de Google Cloud

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

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

  4. Haz clic en Entorno de ejecución, compilación… para mostrar la configuración adicional.

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

  6. Haz clic en el menú desplegable Cuenta de servicio y selecciona la cuenta de servicio deseada.

  7. Haz clic en Siguiente y, luego, Implementar.

gcloud

Cuando implementas una función con gcloud functions deploy, agrega el marcador --service-account:

gcloud functions deploy FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL

en el que FUNCTION_NAME es el nombre de la función y SERVICE_ACCOUNT_EMAIL es la cuenta de servicio.

La función que se volvió a implementar ahora usa la nueva cuenta de servicio del entorno de ejecución.

Usa el servidor de metadatos para adquirir tokens

Si bien las cuentas de servicio definidas por IAM son el método preferido para administrar 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 tu servicio de destino requiere que presentes un token de ID de OpenID Connect o un token de acceso de Oauth 2.0, es posible que puedas usar el servidor de metadatos de Compute para recuperar estos tokens en lugar de configurar un cliente de OAuth completo.

Tokens de identidad

Puedes usar el servidor de metadatos de Compute para recuperar tokens de ID con un público específico 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 objetivo 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 permisos para definir los permisos de acceso. De forma predeterminada, dentro de Google Cloud, los tokens de acceso tienen el permiso cloud-platform. Para acceder a otras APIs de Google o Google Cloud, debes recuperar un token de acceso con el permiso adecuado.

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

Si necesitas un token de acceso con un alcance específico, puedes generar uno de la siguiente manera:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?scopes=SCOPES" \
  -H "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.

Próximos pasos

Aprende a autorizar el acceso a tus funciones o a autenticar desarrolladores y otras funciones para que puedan invocar tus funciones.