Autenticar cargas de trabalho para APIs do Google Cloud usando contas de serviço


Esta página descreve como usar contas de serviço para permitir que aplicativos em execução nas instâncias de máquina virtual (VM) se autentiquem Google Cloud APIs e autorizar o acesso aos recursos.

Para usar contas de serviço para autenticação, primeiro você deve garantir que sua VM esteja configurada para usar uma conta de serviço. Para fazer isso, execute um dos seguintes procedimentos:

Antes de começar

Visão geral

Depois de configurar uma instância de VM para execução usando uma conta de serviço, um aplicativo em execução na instância de VM poderá usar um dos seguintes métodos de autenticação:

Autenticação de aplicativos usando credenciais de conta de serviço

Depois de configurar uma instância para execução como uma conta de serviço, você poderá usar as credenciais da conta de serviço para autenticar aplicativos em execução na instância.

Autenticando aplicativos com uma biblioteca cliente

As bibliotecas cliente podem usar credenciais padrão do aplicativo para autenticar com APIs do Google e enviar solicitações para essas APIs. As credenciais padrão do aplicativo permitem que os aplicativos obtenham credenciais automaticamente de várias fontes para que você possa testar seu aplicativo localmente e implantá-lo em uma instância do Compute Engine sem alterar o código do aplicativo.

Para obter informações sobre como configurar credenciais padrão do aplicativo, consulte Fornecer credenciais para credenciais padrão do aplicativo .

Este exemplo usa a biblioteca cliente Python para autenticar e fazer uma solicitação à API Cloud Storage para listar os buckets em um projeto. O exemplo usa o seguinte procedimento:

  1. Obtenha as credenciais de autenticação necessárias para a API Cloud Storage e inicialize o serviço Cloud Storage com o método build() e as credenciais.
  2. Liste intervalos no Cloud Storage.

Você pode executar este exemplo em uma instância que tenha acesso para gerenciar buckets no 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)

Autenticando aplicativos diretamente com tokens de acesso

Para a maioria dos aplicativos, você pode autenticar usando Application Default Credentials , que localiza credenciais e gerencia tokens para você. No entanto, se seu aplicativo exigir que você forneça um token de acesso OAuth2, o Compute Engine permitirá que você receba um token de acesso do servidor de metadados para uso em seu aplicativo.

Existem diversas opções para obter e usar esses tokens de acesso para autenticar suas aplicações. Por exemplo, você pode usar curl para criar uma solicitação simples ou usar uma linguagem de programação como Python para obter mais flexibilidade.

curvatura

Para usar curl para solicitar um token de acesso e enviar uma solicitação a uma API:

  1. Na instância em que seu aplicativo é executado, consulte o servidor de metadados para obter um token de acesso executando o seguinte comando:

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

    A solicitação retorna uma resposta semelhante a:

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

    Para solicitações de API, você precisa incluir o valor access_token , não a resposta inteira. Se você tiver o processador JSON da linha de comando jq instalado, poderá usar o comando a seguir para extrair o valor do token de acesso da resposta:

    $ ACCESS_TOKEN=`curl \
    "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
    -H "Metadata-Flavor: Google" | jq -r '.access_token'`
    
  2. Copie o valor da propriedade access_token da resposta e use-a para enviar solicitações à API. Por exemplo, a solicitação a seguir imprime uma lista de instâncias em seu projeto de uma determinada zona:

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

    Substitua o seguinte:

    • PROJECT_ID : o ID do projeto para esta solicitação.
    • ZONE : a zona da qual listar VMs.
    • ACCESS_TOKEN : o valor do token de acesso obtido na etapa anterior.

    Para obter informações sobre os parâmetros que você pode definir em sua solicitação, consulte a documentação de parâmetros do sistema .

Pitão

Este exemplo demonstra como solicitar um token para acessar a API Cloud Storage em um aplicativo Python. O exemplo usa o seguinte procedimento:

  1. Solicite um token de acesso do servidor de metadados.
  2. Extraia o token de acesso da resposta do servidor.
  3. Use o token de acesso para fazer uma solicitação ao Cloud Storage.
  4. Se a solicitação for bem-sucedida, o script imprimirá a resposta.

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)

Os tokens de acesso expiram após um curto período de tempo. O servidor de metadados armazena em cache os tokens de acesso até que tenham 5 minutos restantes antes de expirarem. Se os tokens não puderem ser armazenados em cache, as solicitações que excederem 50 consultas por segundo poderão ter taxa limitada. Seus aplicativos devem ter um token de acesso válido para que suas chamadas de API sejam bem-sucedidas.

Como autenticar ferramentas em uma instância usando uma conta de serviço

Alguns aplicativos podem usar comandos da CLI gcloud, que é incluída por padrão na maioria das imagens do Compute Engine. A CLI gcloud reconhece automaticamente a conta de serviço de uma instância e as permissões relevantes concedidas à conta de serviço. Especificamente, se você conceder os papéis corretos à conta de serviço, poderá usar a CLI gcloud nas suas instâncias sem precisar usar gcloud auth login .

Esse reconhecimento da conta de serviço acontece automaticamente e se aplica somente à CLI gcloud incluída na instância. Se você criar novas ferramentas ou adicionar ferramentas personalizadas, deverá autorizar seu aplicativo usando uma biblioteca cliente ou usando tokens de acesso diretamente em seu aplicativo .

Para aproveitar o reconhecimento automático da conta de serviço, conceda os papéis do IAM apropriados à conta de serviço e anexe a conta de serviço à instância . Por exemplo, se você conceder a uma conta de serviço o papel roles/storage.objectAdmin , a CLI gcloud poderá gerenciar e acessar automaticamente objetos do Cloud Storage.

Da mesma forma, se você ativar roles/compute.instanceAdmin.v1 para a conta de serviço, a ferramenta gcloud compute poderá gerenciar instâncias automaticamente.

O que vem a seguir

Experimente você mesmo

Se você é novo no Google Cloud, crie uma conta para avaliar o desempenho do Compute Engine em cenários do mundo real. Novos clientes também recebem US$ 300 em créditos gratuitos para executar, testar e implantar cargas de trabalho.

Experimente o Compute Engine gratuitamente