Acessar recursos da AWS

Neste documento, mostramos como usar a federação de identidade para acessar recursos do Google Cloud na Amazon Web Services (AWS).

Os aplicativos executados fora do Google Cloud costumavam usar chaves de conta de serviço para acessar os recursos do Google Cloud. Com a federação de identidade, é possível permitir que um usuário ou um papel da AWS personifique uma conta de serviço. Isso permite que a carga de trabalho acesse os recursos do Google Cloud diretamente, usando um token de acesso de curta duração, e elimina a sobrecarga de manutenção e segurança associada às chaves de conta de serviço.

Antes de começar

  1. Ative as APIs IAM, Resource Manager, Service Account Credentials, and Security Token Service (STS).

    Ative as APIs

  2. Verifique se você tem os papéis Administrador de pool de Identidade da carga de trabalho (roles/iam.workloadIdentityPoolAdmin) e Administrador da conta de serviço (roles/iam.serviceAccountAdmin) no projeto.

    Como alternativa, o papel básico de Proprietário do IAM (roles/owner) também inclui permissões para configurar a federação de identidade. Não conceda papéis básicos em um ambiente de produção, recomendamos que você faça isso em um ambiente de desenvolvimento ou teste.

  3. Atualize a política da organização para sua organização para permitir a federação da AWS.

    Também é possível especificar quais IDs de conta da AWS têm permissão para acessar seus recursos do Google Cloud.

  4. Crie um papel da AWS e anote o nome de recurso da Amazon (ARN, na sigla em inglês).

  5. Crie uma conta de serviço do Google Cloud.

  6. Conceda à conta de serviço acesso para chamar as APIs do Google Cloud necessárias à carga de trabalho.

Configurações do provedor de identidade para a AWS

Ao adicionar a AWS como provedor de identidade para seu pool de identidades de carga de trabalho, você precisa fornecer o seguinte:

Também é possível fornecer o seguinte:

  • Um nome de exibição e uma descrição

  • Uma lista de mapeamentos de atributos que mapeiam os atributos em um token da AWS para os atributos em um token do Google. Por padrão, cada pool usa os seguintes mapeamentos de atributos, que abrangem os cenários mais comuns:

    Google AWS Descrição
    google.subject assertion.arn O IAM principal é o de autenticação. Ele também é o assunto que aparece nas entradas de registro do Cloud Logging. Esse mapeamento é preenchido automaticamente com o ARN no formato arn:aws:sts::ACCOUNT_ID:assumed-role/AWS_ROLE/AWS_SESSION_NAME.
    attribute.aws_role Papel da AWS O papel da AWS no formato arn:aws:sts::ACCOUNT_ID:assumed-role/AWS_ROLE.

    Também é possível especificar mapeamentos personalizados, que podem ser referenciados nas vinculações de papéis do IAM. A especificação de um mapeamento personalizado modifica os valores padrão. Use assertion para referenciar a credencial da AWS, google para os atributos do Google e attribute para atributos personalizados.

    Por exemplo, o comando a seguir mapeia google.subject para assertion.arn e attribute.aws_account para assertion.account:

    google.subject=assertion.arn,
    attribute.aws_account=assertion.account
    

    Consulte a documentação de GetCallerIdentity() para uma lista de atributos de tokens da AWS que podem ser referenciados. Os atributos na documentação da AWS usam letras concatenadas, mas o mapeamento de atributos para federação de identidade da carga de trabalho usa letras minúsculas. Por exemplo, Account torna-se assertion.account.

    Para declarações mais complexas, use a Common Expression Language (em inglês). Exemplo:

    attribute.environment=assertion.arn.contains(":instance-profile/Production") ? "prod" : "test"
    

    Para referenciar a uma parte específica de um atributo em uma expressão, use a função extract() da CEL, que extrai um valor de um atributo com base em um modelo que você fornece. Para saber mais sobre extract(), consulte Como extrair valores de atributos.

    Para verificar se uma credencial contém um atributo, use a função has().

  • Uma condição de atributo que especifica aqueles que o principal precisa apresentar. A condição do atributo pode se aplicar a credenciais externas e do Google. Qualquer solicitação que não atenda à condição do atributo será rejeitada.

    As condições do atributo são formatadas como uma expressão CEL que retorna um booleano. Por exemplo, o comando a seguir rejeita solicitações de qualquer identidade que não tenha um papel específico da AWS:

    attribute.aws_role == "ROLE_MAPPING"
    

    Para saber mais sobre casos de uso comuns, consulte Condições de atributo.

Criar um pool de identidades de carga de trabalho e um provedor

Use um pool de identidade de carga de trabalho para organizar e gerenciar identidades externas. Os pools de identidade de carga de trabalho são isolados uns dos outros, mas um único pool pode representar qualquer número de contas de serviço. Em geral, recomendamos a criação de um novo pool para cada um dos ambientes, como desenvolvimento, preparação ou produção, o que geralmente significa um pool por conta da AWS.

Para criar um novo pool de identidades de carga de trabalho, você precisa fornecer um ID. Também é possível fornecer uma description e um nome de exibição opcionais. O ID não pode começar com gcp- porque esse prefixo está reservado para uso do Google.

Depois de criar o pool de identidades da carga de trabalho, é possível adicionar um provedor de pool de identidade de carga de trabalho. Cada provedor de pool de identidades de carga de trabalho representa um provedor de identidade específico, como o AWS. Um único pool pode conter vários provedores. Para criar o provedor, você precisará das informações descritas nesta página em Configurações do provedor de identidade para a AWS.

Console

  1. No Console do Cloud, acesse a página Novo provedor de carga de trabalho e pool.

    Acessar "Novo provedor de carga de trabalho" e "Pool"

  2. Insira um nome para o pool de identidades da carga de trabalho.

    O Console do Cloud usa o nome para criar um ID de pool. Para alterar o ID do pool, clique em Editar. Não será possível alterar o ID do pool depois.

  3. Opcional: insira uma descrição para o pool de identidades da carga de trabalho.

  4. Clique em Continuar.

  5. Na lista suspensa Selecionar um provedor, selecione AWS e clique em Continuar.

  6. Insira o nome do provedor.

    O Console do Cloud usa o nome para criar um ID do provedor. Para alterar o ID do provedor, clique em Editar. Não será possível alterar o ID depois.

  7. Insira o ID da conta da AWS e clique em Continuar.

  8. Opcional: para configurar o mapeamento de atributos, clique em Editar mapeamento.

    O mapeamento de atributos permite usar informações sobre identidades externas para conceder acesso a um subconjunto dessas identidades. Para a AWS, um mapeamento padrão é fornecido.

    Para detalhes, consulte Configurações do provedor de identidade para a AWS nesta página.

  9. Opcional: para fornecer uma condição de atributo, que especifica as identidades que podem ser autenticadas, clique em Adicionar condição e insira uma expressão válida da Common Express Language (CEL). Veja mais detalhes em Condições de atributo.

  10. Clique em Salvar para criar o pool de identidades e o provedor da carga de trabalho.

gcloud

Para criar um pool de identidades de carga de trabalho, use o comando gcloud iam workload-identity-pools create:

gcloud iam workload-identity-pools create POOL_ID \
    --location="global" \
    --description="DESCRIPTION" \
    --display-name="DISPLAY_NAME"

A resposta é semelhante ao exemplo a seguir:

Created workload identity pool [POOL_ID].

Para adicionar um provedor de pool de identidades de carga de trabalho, use o comando gcloud iam workload-identity-pools providers create-aws:

gcloud iam workload-identity-pools providers create-aws PROVIDER_ID \
    --workload-identity-pool="POOL_ID" \
    --account-id="AWS_ACCOUNT_ID" \
    --location="global"

A resposta é semelhante ao exemplo a seguir:

Created workload identity pool provider [PROVIDER_ID].

REST

Para criar um pool de identidades da carga de trabalho, faça o seguinte:

O método projects.locations.workloadIdentityPools.create cria um pool de identidades da carga de trabalho.

Método HTTP e URL:

POST https://iam.googleapis.com/v1/projects/project-id/locations/global/workloadIdentityPools?workloadIdentityPoolId=pool-id

Corpo JSON da solicitação:

{
  "description": "description",
  "display-name": "display-name"
}

Para enviar a solicitação, expanda uma destas opções:

O método retorna uma Operation de longa duração semelhante a esta:

{
  "name": "projects/project-number/locations/global/workloadIdentityPools/pool-id/operations/operation-id"
}

Para adicionar um provedor de pool de identidades de carga de trabalho, faça o seguinte:

O método projects.locations.workloadIdentityPools.providers.create adiciona o AWS como provedor.

Método HTTP e URL:

POST https://iam.googleapis.com/v1/projects/project-id/locations/global/workloadIdentityPools/pool-id/providers?workloadIdentityPoolProviderId=provider-id

Corpo JSON da solicitação:

{
  "aws": {
    "accountId": "aws-account-id"
  }
}

Para enviar a solicitação, expanda uma destas opções:

O método retorna uma Operation de longa duração semelhante a esta:

{
  "name": "projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id/operations/operation-id"
}

Permitir identidades externas para personificar uma conta de serviço

Identidades externas não podem acessar a maioria dos recursos do Google Cloud diretamente. Em vez disso, você permite que as identidades representem uma conta de serviço, concedendo a elas o papel Usuário de identidade da carga de trabalho (roles/iam.workloadIdentityUser) na conta de serviço. Quando as identidades externas personificam uma conta de serviço, elas têm os mesmos papéis e permissões que a conta de serviço.

Para conceder o papel Usuário de identidade da carga de trabalho às identidades da AWS, faça o seguinte:

Console

Antes de conceder o papel de Usuário de identidade da carga de trabalho, decida quais identidades você poderá personificar a conta de serviço. É possível conceder o papel a todas as identidades no pool de identidades de carga de trabalho ou a um subconjunto dessas identidades com base no mapeamento de atributos:

Identidades Nome do atributo Valor do atributo
Um usuário da AWS específico subject

arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/AWS_ROLE_NAME/AWS_SESSION_NAME

Para saber como extrair um nome de sessão de papel da AWS de um ARN da AWS, consulte a documentação da AWS sobre identificadores do IAM.

Todas as identidades com um papel de AWS específico aws_role arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/AWS_ROLE_NAME
Todas as identidades com um valor de atributo específico ATTRIBUTE_NAME ATTRIBUTE_VALUE

Em seguida, conceda acesso à conta de serviço e, opcionalmente, faça o download de um arquivo de configuração para gerar credenciais automaticamente:

  1. No Console do Cloud, acesse a página Pools de identidade da carga de trabalho.

    Acessar pools de Identidade da carga de trabalho

  2. Encontre o pool de identidades da carga de trabalho que contém as identidades da AWS e clique no ícone Editar. O Console do Cloud mostra detalhes sobre o pool de identidades da carga de trabalho.

  3. Clique em CONCEDER ACESSO.

  4. Na lista suspensa Conta de serviço, selecione a conta de serviço que as identidades externas representarão.

  5. Escolha quais identidades no pool podem representar a conta de serviço.

    Para permitir que todas as identidades personifiquem a conta de serviço, selecione Todas as identidades no pool.

    Para permitir que um subconjunto de identidades represente a conta de serviço, selecione Somente identidades correspondentes ao filtro e faça o seguinte:

    1. Na lista suspensa Nome do atributo, selecione o atributo que você quer avaliar.

      Apenas os atributos mapeados aparecem na lista. Os prefixos google. e attribute. não são exibidos.

    2. No campo Valor do atributo, insira o valor esperado do atributo.

  6. Clique em Save.

    Se as identidades já tiverem acesso à conta de serviço, o Console do Cloud mostrará detalhes sobre o pool de identidades da carga de trabalho. É possível pular as etapas restantes.

    Se as identidades tiverem acesso à conta de serviço, o Console do Cloud mostrará a caixa de diálogo Configurar seu aplicativo.

  7. Opcional: para fazer o download de um arquivo de configuração para gerar credenciais automaticamente, faça o seguinte:

    1. Na lista suspensa Provedor, selecione o provedor que contém as identidades da AWS que personificarão a conta de serviço.

    2. Clique em Fazer o download da configuração para fazer o download de um arquivo de configuração JSON.

  8. Clique em Dispensar.

gcloud

Antes de conceder o papel de Usuário de identidade da carga de trabalho, decida quais identidades você poderá representar a conta de serviço. É possível conceder o papel a todas as identidades no pool de identidades de carga de trabalho ou a um subconjunto dessas identidades com base no mapeamento de atributos:

Identidades Formato do identificador
Um usuário da AWS específico

principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/AWS_ROLE_NAME/AWS_SESSION_NAME

Para saber como extrair um nome de sessão de papel da AWS de um ARN da AWS, consulte a documentação da AWS sobre identificadores do IAM.

Todas as identidades com um papel de AWS específico principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_role/arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/AWS_ROLE_NAME
Todas as identidades com um valor de atributo específico principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
Todas as identidades em um pool principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*

Em seguida, execute o comando gcloud iam service-accounts add-iam-policy-binding:

gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
    --role=roles/iam.workloadIdentityUser \
    --member="PRINCIPAL"

Substitua os seguintes valores:

  • SERVICE_ACCOUNT_EMAIL: o endereço de e-mail da conta de serviço padrão.
  • PRINCIPAL: as identidades externas que representarão a conta de serviço.

REST

Antes de conceder o papel de Usuário de identidade da carga de trabalho, decida quais identidades você poderá representar a conta de serviço. É possível conceder o papel a todas as identidades no pool de identidades de carga de trabalho ou a um subconjunto dessas identidades com base no mapeamento de atributos:

Identidades Formato do identificador
Um usuário da AWS específico

principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/AWS_ROLE_NAME/AWS_SESSION_NAME

Para saber como extrair um nome de sessão de papel da AWS de um ARN da AWS, consulte a documentação da AWS sobre identificadores do IAM.

Todas as identidades com um papel de AWS específico principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_role/arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/AWS_ROLE_NAME
Todas as identidades com um valor de atributo específico principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
Todas as identidades em um pool principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*

Em seguida, use o padrão read-modify-write para atualizar a política:

  1. Leia a política do IAM da conta de serviço.
  2. Modifique a política para conceder o papel.
  3. Grave a política atualizada.

Leia a política do IAM da conta de serviço.

O método serviceAccounts.getIamPolicy recebe a política do IAM de uma conta de serviço.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
  • SA_ID: o ID da sua conta de serviço. Pode ser o endereço de e-mail da conta de serviço no formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com ou o ID numérico exclusivo da conta de serviço.

  • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.

Método HTTP e URL:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:getIamPolicy

Corpo JSON da solicitação:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

Quando não houver política, a resposta conterá apenas o padrão etag. Se você receber essa resposta, adicione um campo version, definido como 3 e um campo bindings, definidos como uma matriz vazia.

Modifique a política para conceder os papéis apropriados aos principais.

Para conceder um papel, modifique a matriz bindings do corpo da resposta:

  • Se uma vinculação para o papel não existir, adicione um novo objeto à matriz bindings que defina o papel que você quer conceder e o principal a quem você quer conceder.
  • Se já houver uma vinculação para o papel, adicione o novo principal à lista de existentes.

Exemplo:

Para conceder o papel Usuário de identidade da carga de trabalho (roles/iam.workloadIdentityUser) ao papel s3access da AWS, altere o exemplo mostrado na etapa anterior da seguinte maneira:

{
  "version": 1,
  "etag": "BwUqLaVeua8=",
  "bindings": [
    {
      "role": "roles/iam.workloadIdentityUser",
      "members": [
        "principalSet://iam.googleapis.com/projects/1234567890123/locations/global/workloadIdentityPools/my-pool/attribute.aws_role/arn:aws:iam::123456789012:role/s3access"
      ]
    },
    {
      "role": "roles/iam.serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

Grave a política atualizada.

O método serviceAccounts.setIamPolicy define uma política atualizada do IAM para a conta de serviço.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
  • SA_ID: o ID da sua conta de serviço. Pode ser o endereço de e-mail da conta de serviço no formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com ou o ID numérico exclusivo da conta de serviço.

  • POLICY: uma representação JSON da política que você quer definir. Para mais informações sobre o formato de uma política, consulte a referência da política.

    Por exemplo, para definir a política mostrada na etapa anterior, substitua policy pelo seguinte:

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "role": "roles/iam.workloadIdentityUser",
          "members": [
            "principalSet://iam.googleapis.com/projects/1234567890123/locations/global/workloadIdentityPools/my-pool/attribute.aws_role/arn:aws:iam::123456789012:role/s3access"
          ]
        },
        {
          "role": "roles/iam.serviceAccountAdmin",
          "members": [
            "user:admin@example.com"
          ]
        }
      ]
    }
    

Método HTTP e URL:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:setIamPolicy

Corpo JSON da solicitação:

{
  "policy": POLICY
}

Para enviar a solicitação, expanda uma destas opções:

A resposta contém a política atualizada.

Gerar credenciais do Google

Se você usa uma biblioteca de cliente compatível, pode configurá-la para que ela gere credenciais do Google automaticamente. Outra opção é gerar manualmente as credenciais da AWS e trocá-las pelas credenciais do Google.

Quando possível, recomendamos que você gere credenciais automaticamente. Assim, não é necessário implementar o processo de troca de token por conta própria.

Gerar credenciais automaticamente

Se você acessar o Google Cloud com uma biblioteca de cliente para um dos seguintes idiomas, será possível configurar a biblioteca de cliente para gerar credenciais automaticamente usando federação de identidade:

C++

A maioria das bibliotecas de cliente do Google Cloud para C++ é compatível com a federação de identidade usando um objeto ChannelCredentials, que é criado chamando grpc::GoogleDefaultCredentials(). Para inicializar essa credencial, crie as bibliotecas de cliente com a versão 1.36.0 ou posteriores do gRPC.

A biblioteca de cliente do Cloud Storage para C++ usa a API REST, não a gRPC. Portanto, ela não é compatível com a federação de identidade.

Go

As bibliotecas de cliente do Go são compatíveis com a federação de identidade se usarem a versão v0.0.0-20210218202405-ba52d332ba99 ou posteriores do módulo golang.org/x/oauth2.

Para verificar qual versão deste módulo sua biblioteca de cliente usa, execute os seguintes comandos:

cd $GOPATH/src/cloud.google.com/go
go list -m golang.org/x/oauth2

Java

As bibliotecas de cliente do Java aceitam federação de identidade se usarem a versão 0.24.0 ou posteriores do artefato com.google.auth:google-auth-library-oauth2-http.

Para verificar qual versão desse artefato a biblioteca de cliente usa, execute o seguinte comando do Maven no diretório do aplicativo:

mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http

Node.js

As bibliotecas de cliente do Node.js são compatíveis com a federação de identidade se usarem a versão 7.0.2 ou posteriores do pacote google-auth-library.

Para verificar qual versão desse pacote sua biblioteca de cliente usa, execute o seguinte comando no diretório do seu aplicativo:

npm list google-auth-library

Ao criar um objeto GoogleAuth, é possível especificar um ID de projeto ou permitir que GoogleAuth encontre o ID do projeto automaticamente. Para encontrar o ID do projeto automaticamente, a conta de serviço no arquivo de configuração precisa ter o papel de navegador (roles/browser), ou um papel com permissões equivalentes no projeto. Para ver detalhes, consulte o README do pacote google-auth-library.

Python

As bibliotecas de cliente do Python são compatíveis com a federação de identidade se usarem a versão 1.27.0 ou posteriores do pacote google-auth.

Para verificar qual versão desse pacote sua biblioteca de cliente usa, execute o seguinte comando no ambiente em que o pacote está instalado:

pip show google-auth

Para especificar um ID de projeto para o cliente de autenticação, defina a variável de ambiente GOOGLE_CLOUD_PROJECT ou permita que o cliente encontre o ID do projeto automaticamente. Para encontrar o ID do projeto automaticamente, a conta de serviço no arquivo de configuração precisa ter o papel de Navegador (roles/browser) ou um papel com permissões equivalentes no projeto. Para ver detalhes, consulte o guia do usuário do pacote google-auth.

Para configurar a biblioteca de cliente para gerar credenciais automaticamente, crie um arquivo de configuração JSON. É possível criar esse arquivo com o Console do Cloud ou com a ferramenta gcloud.

Console

Primeiro, siga as instruções nesta página para permitir que identidades externas representem uma conta de serviço. Em seguida, crie um arquivo de configuração JSON para qualquer conta de serviço que as identidades externas possam representar.

Para criar um arquivo de configuração JSON, faça o seguinte:

  1. No Console do Cloud, acesse a página Pools de identidade da carga de trabalho.

    Acessar pools de identidade da carga de trabalho

  2. Encontre o pool de identidades da carga de trabalho que contém o provedor de identidade que você quer usar e clique no ícone Editar. O Console do Cloud mostra detalhes sobre o pool de identidades da carga de trabalho.
  3. Clique em Contas de serviço conectadas
  4. Encontre a conta de serviço que você quer usar e clique em Download
  5. Na lista suspensa Provedor, selecione o provedor que contém as identidades da AWS que representarão a conta de serviço.
  6. Clique em Fazer o download da configuração para fazer o download do arquivo de configuração JSON e clique em Concluído

gcloud

Para criar um arquivo de configuração JSON, execute o comando gcloud iam workload-identity-pools create-cred-config:

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --output-file=FILEPATH \
    --aws

Substitua os seguintes valores:

  • PROJECT_NUMBER: ID numérico do projeto.
  • POOL_ID: ID do pool de identidade da carga de trabalho.
  • PROVIDER_ID: ID do provedor do pool de Identidade da carga de trabalho.
  • SERVICE_ACCOUNT_EMAIL: o endereço de e-mail da conta de serviço a ser personificada.
  • FILEPATH: o caminho do arquivo de configuração.

Depois de gerar o arquivo de configuração, defina a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS como o caminho de arquivo do arquivo de configuração. Essa variável de ambiente instrui a biblioteca de cliente a usar o Application Default Credentials para autenticar. Para detalhes, consulte Como localizar credenciais automaticamente.

Trocar credenciais manualmente

Depois que um papel ou usuário da AWS puder personificar uma conta de serviço, será possível trocar as credenciais da AWS pelas do Google manualmente.

Como parte do processo de troca, você transmite um token GetCallerIdentity para o Serviço de token de segurança. O token GetCallerIdentity contém as informações que você costuma incluir em uma solicitação para o método GetCallerIdentity() da AWS, bem como a assinatura que você teria normalmente geraria para a solicitação. O Google Cloud usa o token GetCallerIdentity para verificar a identidade do principal do AWS e confirmar se o principal tem permissão para personificar uma conta de serviço.

Para trocar credenciais:

  1. Consiga as credenciais temporárias da AWS.

  2. Criar um token GetCallerIdentity O token contém as informações de uma solicitação para o método GetCallerIdentity() da AWS, bem como a assinatura da AWS para as informações da solicitação. Use a versão 4 da assinatura.

    A solicitação contém os seguintes campos:

    • url: o URL do endpoint do AWS STS em GetCallerIdentity(), com o corpo de uma solicitação GetCallerIdentity() padrão anexada como parâmetros de consulta. Por exemplo, https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15. Os endpoints regionais também são compatíveis.
    • method: o método de solicitação HTTP POST.
    • headers: os cabeçalhos da solicitação HTTP, que precisam incluir:

      • Authorization: a assinatura da solicitação.
      • host: nome do host do campo url, por exemplo, sts.amazonaws.com.
      • x-amz-date: o horário em que você enviará a solicitação, formatado como uma string ISO 8601 básica. Esse valor normalmente é definido para a hora atual e é usado para evitar ataques de repetição.
      • x-goog-cloud-target-resource: o nome completo do recurso do provedor de identidade. Exemplo:
      //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
      
      • x-amz-security-token: obrigatório apenas se você estiver usando credenciais de segurança temporárias. O token de sessão da AWS a ser incluído.

    Um token GetCallerIdentity é semelhante a este:

    {
      "url": "https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15",
      "method": "POST",
      "headers": [
        {
          "key": "Authorization",
          "value" : "AWS4-HMAC-SHA256 Credential=AKIASOZTBDV4D7ABCDEDF/20200228/us-east-1/sts/aws4_request, SignedHeaders=host;x-amz-date,Signature=abcedefdfedfd"
        },
        {
          "key": "host",
          "value": "sts.amazonaws.com"
        },
        {
          "key": "x-amz-date",
          "value": "20200228T225005Z"
        },
        {
          "key": "x-goog-cloud-target-resource",
          "value": "//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/my-pool/providers/my-aws-provider"
        },
        {
          "key": "x-amz-security-token",
          "value": "GizFWJTqYX...xJ55YoJ8E9HNU="
        }
      ]
    }
    
  3. Para trocar a credencial da AWS por um token de acesso federado, transmita o token GetCallerIdentity para o método token() do serviço de token de segurança:

    REST

    O método token troca um token de terceiros por um do Google.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_NUMBER: o número do projeto do Google Cloud.
    • POOL_ID: o ID do pool de identidades da carga de trabalho que você criou.
    • PROVIDER_ID: o ID do provedor de identidade da AWS que você configurou.
    • AWS_REQUEST: o token GetCallerIdentity, formatado como JSON com escape de URL.

    Método HTTP e URL:

    POST https://sts.googleapis.com/v1/token

    Corpo JSON da solicitação:

    {
      "audience": "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID",
      "grantType": "urn:ietf:params:oauth:grant-type:token-exchange",
      "requestedTokenType": "urn:ietf:params:oauth:token-type:access_token",
      "scope": "https://www.googleapis.com/auth/cloud-platform",
      "subjectTokenType": "urn:ietf:params:aws:token-type:aws4_request",
      "subjectToken": "AWS_REQUEST"
    }
    

    Para enviar a solicitação, expanda uma destas opções:

     

    O método retorna um token federado.

  4. Para trocar o token federado por um token de acesso de uma conta de serviço, chame o método generateAccessToken(). Um número limitado de APIs do Google Cloud é compatível com tokens federados. Todas as APIs do Google Cloud são compatíveis com tokens de acesso da conta de serviço.

    REST

    O método serviceAccounts.generateAccessToken da API Service Account Credentials gera um token de acesso do OAuth 2.0 para uma conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • SA_ID: o ID da sua conta de serviço. Pode ser o endereço de e-mail da conta de serviço no formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com ou o ID numérico exclusivo da conta de serviço.
    • token: o token de acesso federado.

    Método HTTP e URL:

    POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com:generateAccessToken

    Corpo JSON da solicitação:

    {
      "scope": [
        "https://www.googleapis.com/auth/cloud-platform"
      ]
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Se a solicitação generateAccessToken for bem-sucedida, o corpo da resposta conterá um token de acesso do OAuth 2.0 e um prazo de validade. O accessToken poderá ser usado para autenticar uma solicitação em nome da conta de serviço até que o expireTime seja atingido.

    {
      "accessToken": "eyJ0eXAi...NiJ9",
      "expireTime": "2020-04-07T15:01:23.045123456Z"
    }
    

Quando você tiver um token de acesso para uma conta de serviço, poderá usá-lo para chamar as APIs do Google Cloud incluindo o token no cabeçalho Authorization das suas solicitações:

Authorization: Bearer SERVICE_ACCOUNT_ACCESS_TOKEN

A solicitação está autorizada como a conta de serviço.

A seguir