Identidad de las funciones

Así como otras entidades necesitan acceso a Cloud Functions para interactuar con él, las funciones a menudo necesitan acceso a otros recursos en Google Cloud para hacer 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 del entorno de ejecución diferente cuando implementes una función, Cloud Functions usa lacuenta de servicio predeterminada de App Engine, PROJECT_ID@appspot.gserviceaccount.com, como su identidad para la ejecución de funciones.

La cuenta de servicio de App Engine tiene la función de Editor, que le 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 esta cuenta de servicio predeterminada solo para pruebas y desarrollo. Para la producción, debes otorgar a la cuenta de servicio 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 predeterminada de App Engine

Console

  1. Ve a Google Cloud Console:

    Ir a Google Cloud Console

  2. Selecciona la cuenta de servicio predeterminada de App Engine (PROJECT_ID@appspot.gserviceaccount.com) en la tabla.

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

  4. Agrega funciones al menú desplegable función o quítalas para proporcionar el acceso con menos privilegios.

  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="PROJECT_ID@appspot.gserviceaccount.com"
  --role="roles/editor"

# Add the desired role
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="PROJECT_ID@appspot.gserviceaccount.com"
  --role="ROLE"

Donde PROJECT_ID es el ID del proyecto que estás usando y ROLE es la nueva función que se asignará a la cuenta de servicio del entorno de ejecución.

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 la función de creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) a estas dos cuentas de servicio administradas por Google:

      • Cuenta de servicio predeterminada de App Engine (PROJECT_ID@appspot.gserviceaccount.com)
      • Agente de servicio de Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)

      Estas Cuentas de Google administran el acceso entre proyectos de tu cuenta de servicio.

  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 Google Cloud Console:

    Ir a Google Cloud Console

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

  3. Haz clic en Configuración del entorno de ejecución, compilación y conexiones 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, en Crear.

gcloud

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

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 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 Google Cloud Console:

    Ir a Google Cloud Console

  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 Configuración del entorno de ejecución, compilación y conexiones para mostrar opciones de configuración adicionales.

  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 la identificación y la autorización en Google Cloud, algunos servicios pueden requerir otros modos, como una Clave de API, de cliente OAuth 2.0 o 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 identidad 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 identidad 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 API 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.