Autenticar cargas de trabajo en las APIs de Google Cloud mediante cuentas de servicio


En esta página se describe cómo usar cuentas de servicio para permitir que las aplicaciones que se ejecutan en tus instancias de máquina virtual (VM) se autentiquen en las APIs de Google Cloud y autoricen el acceso a los recursos.

Para usar cuentas de servicio en la autenticación, primero debes asegurarte de que tu máquina virtual esté configurada para usar una cuenta de servicio. Para ello, completa uno de los siguientes procedimientos:

Antes de empezar

  • Consulta el artículo Resumen de las cuentas de servicio.
  • Si aún no lo has hecho, configura la autenticación. La autenticación verifica tu identidad para acceder a Google Cloud servicios y APIs. Para ejecutar código o ejemplos desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

    Para usar las Python muestras de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Set up authentication for a local development environment.

Información general

Una vez que hayas configurado una instancia de VM para que se ejecute con una cuenta de servicio, una aplicación que se ejecute en la instancia de VM podrá usar uno de los siguientes métodos para autenticarse:

Autenticar aplicaciones con credenciales de cuenta de servicio

Después de configurar una instancia para que se ejecute como una cuenta de servicio, puedes usar las credenciales de la cuenta de servicio para autenticar las aplicaciones que se ejecutan en la instancia.

Autenticar aplicaciones con una biblioteca de cliente

Las bibliotecas de cliente pueden usar las credenciales predeterminadas de la aplicación para autenticarse en las APIs de Google y enviar solicitudes a esas APIs. Las credenciales predeterminadas de la aplicación permiten que las aplicaciones obtengan automáticamente credenciales de varias fuentes para que puedas probar tu aplicación de forma local y, a continuación, implementarla en una instancia de Compute Engine sin cambiar el código de la aplicación.

Para obtener información sobre cómo configurar las credenciales predeterminadas de la aplicación, consulta Proporcionar credenciales a las credenciales predeterminadas de la aplicación.

En este ejemplo se usa la biblioteca de cliente de Python para autenticar y hacer una solicitud a la API Cloud Storage con el fin de enumerar los contenedores de un proyecto. En el ejemplo se sigue el siguiente procedimiento:

  1. Obtén las credenciales de autenticación necesarias para la API de Cloud Storage e inicializa el servicio de Cloud Storage con el método build() y las credenciales.
  2. Lista los segmentos de Cloud Storage.

Puedes ejecutar este ejemplo en una instancia que tenga acceso para gestionar segmentos en Cloud Storage.

import argparse
from typing import List

from google.cloud import storage


def create_client() -> storage.Client:
    """
    Construct a client object for the Storage API using the
    application default credentials.

    Returns:
        Storage API client object.
    """
    # Construct the service object for interacting with the Cloud Storage API -
    # the 'storage' service, at version 'v1'.
    # Authentication is provided by application default credentials.
    # When running locally, these are available after running
    # `gcloud auth application-default login`. When running on Compute
    # Engine, these are available from the environment.
    return storage.Client()


def list_buckets(client: storage.Client, project_id: str) -> List[storage.Bucket]:
    """
    Retrieve bucket list of a project using provided client object.


    Args:
        client: Storage API client object.
        project_id: name of the project to list buckets from.

    Returns:
        List of Buckets found in the project.
    """
    buckets = client.list_buckets()
    return list(buckets)


def main(project_id: str) -> None:
    client = create_client()
    buckets = list_buckets(client, project_id)
    print(buckets)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument("project_id", help="Your Google Cloud Project ID.")

    args = parser.parse_args()

    main(args.project_id)

Autenticar aplicaciones directamente con tokens de acceso

En la mayoría de las aplicaciones, puedes autenticarte mediante las credenciales de aplicación predeterminadas, que buscan credenciales y gestionan tokens por ti. Sin embargo, si tu aplicación requiere que proporciones un token de acceso de OAuth 2.0, Compute Engine te permite obtener un token de acceso de su servidor de metadatos para usarlo en tu aplicación.

Hay varias opciones para obtener y usar estos tokens de acceso para autenticar tus aplicaciones. Por ejemplo, puedes usar curl para crear una solicitud sencilla o usar un lenguaje de programación como Python para tener más flexibilidad.

cURL

Para usar curl para solicitar un token de acceso y enviar una solicitud a una API, sigue estos pasos:

  1. En la instancia en la que se ejecuta tu aplicación, consulta el servidor de metadatos para obtener un token de acceso ejecutando el siguiente comando:

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

    La solicitud devuelve una respuesta similar a la siguiente:

    {
          "access_token":"ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_QtAS08i85nHq39HE3C2LTrCARA",
          "expires_in":3599,
          "token_type":"Bearer"
     }

    En las solicitudes de la API, debe incluir el valor access_token, no toda la respuesta. Si tienes instalado el procesador JSON de línea de comandos jq, puedes usar el siguiente comando para extraer el valor del token de acceso de la respuesta:

    $ ACCESS_TOKEN=`curl \
    "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
    -H "Metadata-Flavor: Google" | jq -r '.access_token'`
    
  2. Copia el valor de la propiedad access_token de la respuesta y úsalo para enviar solicitudes a la API. Por ejemplo, la siguiente solicitud imprime una lista de instancias de tu proyecto de una zona determinada:

    $ curl https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances \
    -H "Authorization":"Bearer ACCESS_TOKEN"
    

    Haz los cambios siguientes:

    • PROJECT_ID: el ID del proyecto de esta solicitud.
    • ZONE: la zona de la que se van a enumerar las VMs.
    • ACCESS_TOKEN: el valor del token de acceso que has obtenido en el paso anterior.

    Para obtener información sobre los parámetros que puede definir en su solicitud, consulte la documentación sobre los parámetros del sistema.

Python

En este ejemplo se muestra cómo solicitar un token para acceder a la API Cloud Storage en una aplicación Python. En el ejemplo se usa el siguiente procedimiento:

  1. Solicita un token de acceso al servidor de metadatos.
  2. Extrae el token de acceso de la respuesta del servidor.
  3. Usa el token de acceso para hacer una solicitud a Cloud Storage.
  4. Si la solicitud se realiza correctamente, la secuencia de comandos imprime la respuesta.

import argparse

import requests


METADATA_URL = "http://metadata.google.internal/computeMetadata/v1/"
METADATA_HEADERS = {"Metadata-Flavor": "Google"}
SERVICE_ACCOUNT = "default"


def get_access_token() -> str:
    """
    Retrieves access token from the metadata server.

    Returns:
        The access token.
    """
    url = f"{METADATA_URL}instance/service-accounts/{SERVICE_ACCOUNT}/token"

    # Request an access token from the metadata server.
    r = requests.get(url, headers=METADATA_HEADERS)
    r.raise_for_status()

    # Extract the access token from the response.
    access_token = r.json()["access_token"]

    return access_token


def list_buckets(project_id: str, access_token: str) -> dict:
    """
    Calls Storage API to retrieve a list of buckets.

    Args:
        project_id: name of the project to list buckets from.
        access_token: access token to authenticate with.

    Returns:
        Response from the API.
    """
    url = "https://www.googleapis.com/storage/v1/b"
    params = {"project": project_id}
    headers = {"Authorization": f"Bearer {access_token}"}

    r = requests.get(url, params=params, headers=headers)
    r.raise_for_status()

    return r.json()


def main(project_id: str) -> None:
    """
    Retrieves access token from metadata server and uses it to list
    buckets in a project.

    Args:
        project_id: name of the project to list buckets from.
    """
    access_token = get_access_token()
    buckets = list_buckets(project_id, access_token)
    print(buckets)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument("project_id", help="Your Google Cloud project ID.")

    args = parser.parse_args()

    main(args.project_id)

Los tokens de acceso caducan al cabo de un breve periodo. El servidor de metadatos almacena en caché los tokens de acceso hasta que les queden 5 minutos antes de caducar. Si no se pueden almacenar en caché los tokens, es posible que se limite la frecuencia de las solicitudes que superen las 50 consultas por segundo. Tus aplicaciones deben tener un token de acceso válido para que sus llamadas a la API se realicen correctamente.

Autenticar herramientas en una instancia mediante una cuenta de servicio

Algunas aplicaciones pueden usar comandos de la CLI de gcloud, que se incluye de forma predeterminada en la mayoría de las imágenes de Compute Engine. La CLI de gcloud reconoce automáticamente la cuenta de servicio de una instancia y los permisos relevantes concedidos a la cuenta de servicio. En concreto, si asignas los roles correctos a la cuenta de servicio, puedes usar la interfaz de línea de comandos gcloud desde tus instancias sin tener que usar gcloud auth login.

El reconocimiento de la cuenta de servicio se produce automáticamente y solo se aplica a la CLI de gcloud incluida en la instancia. Si creas herramientas nuevas o añades herramientas personalizadas, debes autorizar tu aplicación mediante una biblioteca de cliente o usando tokens de acceso directamente en tu aplicación.

Para aprovechar el reconocimiento automático de cuentas de servicio, asigna los roles de gestión de identidades y accesos adecuados a la cuenta de servicio y asocia la cuenta de servicio a la instancia. Por ejemplo, si asignas el rol roles/storage.objectAdmin a una cuenta de servicio, la CLI de gcloud puede gestionar y acceder automáticamente a objetos de Cloud Storage.

Del mismo modo, si habilitas roles/compute.instanceAdmin.v1 en la cuenta de servicio, la herramienta gcloud compute podrá gestionar las instancias automáticamente.

Siguientes pasos

Pruébalo

Si es la primera vez que utilizas Google Cloud, crea una cuenta para evaluar el rendimiento de Compute Engine en situaciones reales. Los nuevos clientes también reciben 300 USD en crédito gratuito para ejecutar, probar y desplegar cargas de trabajo.

Probar Compute Engine gratis