Configurar a federação de identidade da carga de trabalho com a AWS ou o Azure

Neste guia, descrevemos como usar a federação de identidade da carga de trabalho para permitir que as cargas de trabalho da AWS e do Azure se autentiquem no Google Cloud sem uma chave de conta de serviço.

Usando a federação de identidade de carga de trabalho, as cargas de trabalho executadas no AWS EC2 e Azure podem trocar as credenciais específicas do ambiente por tokens de serviço de token de segurança de curta duração do Google Cloud.

As credenciais específicas do ambiente incluem o seguinte:

Ao configurar a federação de identidade da carga de trabalho, é possível permitir que essas cargas de trabalho troquem essas credenciais específicas do ambiente por credenciais de curta duração do Google Cloud. As cargas de trabalho podem usar essas credenciais de curta duração para acessar as APIs do Google Cloud.

Preparar o provedor de identidade externo

Essas etapas são necessárias apenas uma vez para cada locatário ou conta do AWS AD.

AWS

Não é necessário fazer mudanças na configuração da sua conta da AWS.

Depois de configurar um pool de identidades de carga de trabalho para confiar na sua conta da AWS, permita que os usuários da AWS e os papéis da AWS usem as credenciais de segurança permanentes ou temporárias da AWS para receber credenciais do Google Cloud de curta duração.

Azure

Crie um novo aplicativo do Azure AD no locatário do Azure AD e configure-o para ser usado na federação de identidade da carga de trabalho.

Depois que você configura um pool de identidades de carga de trabalho para confiar no aplicativo, os usuários e os principais de serviços do Azure podem solicitar tokens de acesso para esse aplicativo e trocá-los pelas credenciais de curta duração do Google Cloud.

Para criar o aplicativo, siga estas etapas:

  1. Crie um aplicativo do Azure AD e a entidade de serviço.

  2. Defina o URI do ID do aplicativo. É possível usar o URI padrão do ID do aplicativo (api://APPID) ou especificar um URI personalizado.

    Você precisará do URI do ID do aplicativo mais tarde, quando configurar o provedor de pools de Identidade da carga de trabalho.

Para permitir que um aplicativo consiga tokens de acesso para o aplicativo Azure AD, use as identidades gerenciadas:

  1. Crie uma identidade gerenciada. Anote o ID do objeto da identidade gerenciada. Você precisará dele posteriormente ao configurar a representação.

  2. Atribua a identidade gerenciada a uma máquina virtual ou a outro recurso que execute o aplicativo.

Configurar a federação de identidade da força de trabalho

Você só precisa executar essas etapas uma vez por conta da AWS ou locatário do Azure AD. É possível, então, usar o mesmo pool de identidade de carga de trabalho e servidor em várias cargas de trabalho e em vários projetos do Google Cloud.

Para começar a configurar a federação de identidade da carga de trabalho, faça o seguinte:

  1. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  2. É melhor usar um projeto dedicado para gerenciar pools e provedores de identidade da carga de trabalho
  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative as APIs IAM, Resource Manager, Service Account Credentials, and Security Token Service.

    Ative as APIs

Definir um mapeamento e uma condição de atributo

As credenciais específicas do ambiente da carga de trabalho da AWS ou do Azure contêm vários atributos, e você precisa decidir qual atributo quer usar como identificador do assunto (google.subject) no Google Cloud.

O Google Cloud usa o identificador de assunto nos Registros de auditoria do Cloud e nos identificadores principais para identificar exclusivamente um usuário ou papel da AWS ou do Azure.

Também é possível mapear outros atributos. Consulte esses atributos adicionais ao conceder acesso aos recursos.

AWS

O mapeamento de atributos pode usar os campos de resposta para GetCallerIdentity como atributos de origem. Esses campos incluem o seguinte:

  • account: o número da conta da AWS.
  • arn: o ARN da AWS da entidade externa.
  • userid: o identificador exclusivo da entidade autora de chamadas.

Se o aplicativo for executado em uma instância do Amazon Elastic Compute Cloud (EC2) com um papel anexado, use o seguinte mapeamento de atributo:

google.subject=assertion.arn
attribute.account=assertion.account
attribute.aws_role=assertion.arn.extract('assumed-role/{role}/')
attribute.aws_ec2_instance=assertion.arn.extract('assumed-role/{role_and_session}').extract('/{session}')

O mapeamento faz o seguinte:

  • Use o ARN como identificador do assunto (exemplo: "arn:aws:sts::000000000000:assumed-role/ec2-my-role/i-00000000000000000)
  • Apresentar um atributo personalizado account e atribuir a ele o ID da conta da AWS
  • Introduza um atributo personalizado aws_role e atribua a ele o nome do papel da AWS (exemplo: ec2-my-role)
  • Introduza um atributo personalizado aws_ec2_instance e atribua a ele o ID da instância EC2 (exemplo: i-00000000000000000)

Com esse mapeamento, é possível conceder acesso a:

  • Uma instância EC2 específica:

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_ec2_instance/EC2_INSTANCE_ID
    

  • Todos os usuários e instâncias em um papel:

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_role/ROLE_NAME
    

Azure

Os mapeamentos de atributos podem usar as declarações incorporadas aos tokens de acesso do Azure, incluindo declarações personalizadas, como atributos de origem. Na maioria dos casos, é melhor usar a declaração sub como identificador de assunto:

google.subject=assertion.sub

Para um token de acesso emitido para uma identidade gerenciada, a declaração sub contém o ID do objeto da identidade gerenciada. Se você usar uma declaração diferente, verifique se ela é exclusiva e não pode ser reatribuída.

Caso não tenha certeza sobre a lista de reivindicações que você pode usar, faça o seguinte:

  1. Conecte-se a uma VM do Azure com uma identidade gerenciada atribuída.

  2. Consiga um token de acesso do Serviço de metadados de instância do Azure (IMDS):

    Bash

    curl \
      "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \
      -H "Metadata: true" | jq -r .access_token
    

    Esse comando usa a ferramenta jq. jq está disponível por padrão no Cloud Shell.

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
      -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" `
      -Headers @{Metadata="true"}).access_token
    Write-Host $SubjectToken
    

    Substitua APP_ID_URI pelo URI do ID do aplicativo que você configurou para a federação de identidade da carga de trabalho.

  3. Em um navegador da Web, acesse https://jwt.ms/ e cole o token de acesso na caixa de texto.

  4. Clique em Reivindicações para ver a lista de reivindicações incorporadas no token de acesso.

Para identidades de serviço, geralmente não é necessário criar um mapeamento para google.groups ou qualquer atributo personalizado.

Também é possível definir uma condição de atributo. As condições do atributo são expressões CEL que podem verificar atributos de declaração e atributos de destino. Se a condição do atributo for avaliada como true para uma determinada credencial, a credencial será aceita. Caso contrário, a credencial será rejeitada.

AWS

Use uma condição de atributo para restringir quais usuários e papéis do IAM podem usar a federação de identidade da carga de trabalho para receber tokens do Google Cloud de curta duração.

Por exemplo, a condição a seguir restringe o acesso aos papéis da AWS e impede outros identificadores do IAM:

assertion.arn.startsWith('arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/')

Azure

É possível usar uma condição de atributo para restringir quais usuários e principais de serviço podem usar a federação de identidade da carga de trabalho para conseguir tokens de curta duração do Google Cloud. Como alternativa, é possível configurar o aplicativo do Azure AD para usar atribuições de papel do app.

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

Funções exigidas

Para receber as permissões necessárias para configurar a federação de identidade da carga de trabalho, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:

Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.

Também é possível conseguir as permissões necessárias com papéis personalizados ou outros papéis predefinidos.

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.

Agora que você coletou todas as informações necessárias para criar um pool e um provedor de identidade de carga de trabalho:

Console

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

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

  2. Na seção Criar um pool de identidades, insira o seguinte:

    • Nome: o nome do pool. O nome também é usado como o ID do pool. Não será possível alterar o ID do pool posteriormente.
    • Descrição: texto que descreve a finalidade do pool.
  3. Clique em Continuar.

  4. Defina as configurações do provedor:

    AWS

    Defina as seguintes configurações do provedor:

    • Selecione um provedor: AWS.
    • Nome do provedor: nome do provedor. O nome também é usado como o ID do provedor. Não será possível alterar o ID depois.

    Azure

    Defina as seguintes configurações do provedor:

    • Selecione um provedor: OpenID Connect (OIDC).
    • Nome do provedor: nome do provedor. O nome também é usado como o ID do provedor. Não será possível alterar o ID depois.
    • URL do emissor: https://sts.windows.net/TENANT_ID. Substitua TENANT_ID pelo ID do locatário (GUID) do locatário do Azure AD.
    • Públicos-alvo permitidos: o URI do ID do aplicativo que você usou quando registrou o aplicativo no Azure AD.
  5. Clique em Continuar.

  6. Na seção Configurar atributos do provedor, adicione os mapeamentos de atributos identificados anteriormente.

  7. Na seção Condições de atributo, insira a condição de atributo identificada anteriormente. Deixe o campo em branco se não houver uma condição de atributo.

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

gcloud

  1. Crie um novo pool de identidades de carga de trabalho:

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

    Substitua:

    • POOL_ID: o ID exclusivo do pool.
    • DISPLAY_NAME: o nome do pool.
    • DESCRIPTION: a descrição do pool Essa descrição aparece ao conceder acesso às identidades do pool.
  2. Adicione um provedor de pool de identidades de carga de trabalho:

    AWS

    Para criar o provedor de pool de identidades de carga de trabalho para a AWS, execute o seguinte comando:

    gcloud iam workload-identity-pools providers create-aws PROVIDER_ID \
      --location="global"  \
      --workload-identity-pool="POOL_ID" \
      --account-id="ACCOUNT_ID" \
      --attribute-mapping="MAPPINGS" \
      --attribute-condition="CONDITIONS"
    

    Substitua:

    Exemplo:

    gcloud iam workload-identity-pools providers create-aws example-provider \
      --location="global"  \
      --workload-identity-pool="pool-1" \
      --account-id="123456789000" \
      --attribute-mapping="google.subject=assertion.arn"
    

    Azure

    Para criar o provedor de pool de identidade da carga de trabalho para o Azure, execute o seguinte comando:

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER_URI" \
        --allowed-audiences="APPLICATION_ID_URI" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    Substitua:

    • PROVIDER_ID: o ID exclusivo do fornecedor.
    • POOL_ID: o ID do pool.
    • ISSUER_URI: o ID do locatário (GUID) do locatário do Azure AD, às vezes formatado como https://sts.windows.net/TENANT_ID. O URI do emissor pode variar e, para encontrar o URI do emissor, depure o JWT usando JWT.io.
    • APPLICATION_ID_URI: URI do ID do aplicativo que você usou quando registrou o aplicativo no Azure AD.
    • MAPPINGS: a lista separada por vírgulas de mapeamentos de atributos identificados anteriormente.
    • CONDITIONS: a condição do atributo (opcional) que você identificou anteriormente.

    Exemplo:

    gcloud iam workload-identity-pools providers create-oidc example-provider \
        --location="global" \
        --workload-identity-pool="pool-1" \
        --issuer-uri="https://sts.windows.net/00000000-1111-2222-3333-444444444444" \
        --allowed-audiences="api://my-app" \
        --attribute-mapping="google.subject=assertion.sub,google.groups=assertion.groups"
    

Autenticar uma carga de trabalho

É necessário realizar essas etapas uma vez por carga de trabalho.

Criar uma conta de serviço para a carga de trabalho externa

  1. Ative as APIs IAM, Security Token Service, and Service Account Credentials.

    Ative as APIs

  2. Crie uma conta de serviço que represente a carga de trabalho. Recomendamos usar uma conta de serviço dedicada para cada carga de trabalho.

    A conta de serviço não precisa estar no mesmo projeto que o pool de identidades da carga de trabalho.

  3. Conceda à conta de serviço acesso a recursos que você quer que as identidades externas acessem.

Permitir que a carga de trabalho externa represente a conta de serviço

Para permitir que identidades externas personifiquem uma conta de serviço, você precisa conceder a elas o papel de usuário de identidade da carga de trabalho (roles/iam.workloadIdentityUser) na conta de serviço. É possível conceder o papel a uma identidade externa específica ou a várias identidades externas:

  • Para uma identidade externa específica, escreva uma condição de atributo que verifique o atributo google.subject.
  • Para um grupo de identidades externas, escreva uma condição de atributo que verifique o atributo google.groups ou um atributo personalizado attribute.NAME.

Console

Para permitir que identidades externas representem uma conta de serviço usando o console do Google Cloud, faça o seguinte:

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

    Acesse Pools de identidade da carga de trabalho

  2. Encontre o pool de identidades da carga de trabalho que você quer atualizar e selecione-o.

  3. Para conceder acesso ao pool de identidades da carga de trabalho selecionado, clique em Conceder acesso.

  4. Na lista Conta de serviço, selecione a conta de serviço para as identidades externas a serem personificadas.

  5. Para escolher quais identidades no pool podem representar a conta de serviço, execute uma das seguintes ações:

    • Para permitir que apenas identidades específicas do pool de identidades de carga de trabalho personifiquem a conta de serviço, selecione Somente identidades correspondentes ao filtro.

      Na lista Nome do atributo, selecione o atributo que você quer filtrar.

      No campo Valor do atributo, insira o valor esperado do atributo. Por exemplo, se você usar um mapeamento de atributo google.subject=assertion.sub, defina o nome do Atributo como subject e o Valor do atributo para o valor da declaração sub em tokens emitidos pelo seu provedor de identidade externo.

  6. Para salvar a configuração, clique em Salvar e em Dispensar.

gcloud

Para permitir que identidades externas representem uma conta de serviço usando a CLI gcloud, faça o seguinte:

  1. Para ver o número do projeto, execute o seguinte comando:

    gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
    
  2. Para conceder o papel de usuário da Identidade da carga de trabalho (roles/iam.workloadIdentityUser) a identidades externas que atendam a um determinado critério:

    Por assunto

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"
    

    Por grupo

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"
    

    Por atributo

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"
    

    Substitua:

    • SERVICE_ACCOUNT_EMAIL: o endereço de e-mail da conta de serviço.
    • PROJECT_NUMBER: o número do projeto que contém o pool de identidade da carga de trabalho
    • POOL_ID: o ID do pool de identidade da carga de trabalho
    • SUBJECT: o valor esperado do atributo mapeado para google.subject
    • GROUP: o valor esperado do atributo mapeado para google.groups
    • ATTRIBUTE_NAME: o nome de um atributo personalizado no seu mapeamento de atributos

Criar uma configuração de credencial

As bibliotecas de cliente do Cloud, a CLI gcloud e o Terraform podem receber automaticamente credenciais externas e usá-las para representar uma conta de serviço. Para permitir que bibliotecas e ferramentas concluam esse processo, você precisa fornecer um arquivo de configuração de credenciais. Esse arquivo define o seguinte:

  • De onde receber credenciais externas
  • Qual pool de identidades de carga de trabalho e provedor usar
  • Qual conta de serviço representar

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

Console

Faça o download de um arquivo de configuração de credencial no Console do Google Cloud:

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

    Acesse Pools de identidade da carga de trabalho

  2. Encontre o pool de identidades de carga de trabalho que contém o IdP que você quer usar e clique nele.

  3. Selecione Contas de serviço conectadas.

  4. Encontre a conta de serviço que você quer usar e clique em Download.

  5. Na caixa de diálogo Configurar seu aplicativo, selecione o provedor que contém as identidades externas que personificarão a conta de serviço.

  6. Forneça as configurações extras a seguir:

    AWS

    Nenhuma configuração adicional é necessária.

    Azure

    URL do ID do aplicativo: URI do ID do aplicativo do Azure

  7. Selecione Fazer download da configuração para fazer o download do arquivo de configuração de credenciais e clique em Dispensar.

gcloud

Para criar um arquivo de configuração de credenciais usando gcloud iam workload-identity-pools create-cred-config, faça o seguinte:

AWS

Para criar um arquivo de configuração de credenciais que permita à biblioteca conseguir um token de acesso de metadados da instância do EC2, faça o seguinte:

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

Substitua:

  • PROJECT_NUMBER: o número do projeto que contém o pool de identidade da carga de trabalho
  • POOL_ID: o ID do pool de identidade da carga de trabalho
  • PROVIDER_ID: o 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.
  • SERVICE_ACCOUNT_TOKEN_LIFETIME: ciclo de vida do token de acesso da conta de serviço, em segundos. O padrão é uma hora quando não é fornecido. Para especificar um ciclo de vida com mais de uma hora, configure a restrição da política organizacional constraints/iam.allowServiceAccountCredentialLifetimeExtension.
  • FILEPATH: o arquivo em que a configuração será salva

Se você usar o AWS IMDSv2, uma sinalização adicional --enable-imdsv2 precisará ser adicionada ao 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 \
    --aws \
    --enable-imdsv2 \
    --output-file=FILEPATH.json

Se o servidor de metadados da AWS não for uma opção, será possível fornecer credenciais de segurança da AWS pelas seguintes variáveis de ambiente da AWS:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_REGION ou AWS_DEFAULT_REGION
  • Opcional: AWS_SESSION_TOKEN

A CLI gcloud e as bibliotecas usam essas variáveis de ambiente da AWS quando o servidor de metadados da AWS está indisponível.

Azure

Crie um arquivo de configuração de credenciais que permita que a biblioteca receba um token de acesso do Serviço de metadados de instância (IMDS) do Azure:

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
    --azure \
    --app-id-uri APPLICATION_ID_URI \
    --output-file=FILEPATH.json

Substitua:

  • PROJECT_NUMBER: o número do projeto que contém o pool de identidades da carga de trabalho
  • POOL_ID: o ID do pool de identidade da carga de trabalho
  • PROVIDER_ID: o 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.
  • APPLICATION_ID_URI: o URI do ID do aplicativo do Azure
  • SERVICE_ACCOUNT_TOKEN_LIFETIME: ciclo de vida do token de acesso da conta de serviço, em segundos. O padrão é uma hora quando não é fornecido. Para especificar um ciclo de vida com mais de uma hora, configure a restrição da política organizacional constraints/iam.allowServiceAccountCredentialLifetimeExtension.
  • FILEPATH: o arquivo em que a configuração será salva

Usar a configuração de credencial para acessar o Google Cloud

Para permitir que as ferramentas e as bibliotecas de cliente usem a configuração de credenciais, faça o seguinte no ambiente da AWS ou do Azure:

  1. Inicialize uma variável de ambiente GOOGLE_APPLICATION_CREDENTIALS e aponte-a para o arquivo de configuração de credenciais:

    Bash

      export GOOGLE_APPLICATION_CREDENTIALS=`pwd`/FILEPATH.json
      
    em que FILEPATH é o caminho de arquivo relativo do arquivo de configuração de credenciais.

    PowerShell

      $env:GOOGLE_APPLICATION_CREDENTIALS = Resolve-Path 'FILEPATH.json'
      
    em que FILEPATH é o caminho de arquivo relativo do arquivo de configuração de credenciais.
  2. Use uma biblioteca ou ferramenta de cliente compatível com a federação de identidade de carga de trabalho e que possa encontrar credenciais automaticamente:

    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 o 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 de carga de trabalho 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.

    gcloud

    Para autenticar usando a federação de identidade da carga de trabalho, use o comando gcloud auth login:

    gcloud auth login --cred-file=FILEPATH.json
    

    Substitua FILEPATH pelo caminho do arquivo de configuração de credencial.

    O suporte para a federação de identidade de carga de trabalho na CLI gcloud está disponível na versão 363.0.0 e posteriores da CLI gcloud.

    Terraform

    O provedor do Google Cloud é compatível com a federação de identidade da carga de trabalho se você usar a versão 3.61.0 ou posterior:

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = "~> 3.61.0"
        }
      }
    }
    

    gsutil

    Para autenticar usando a federação de identidade da carga de trabalho, use um dos seguintes métodos:

    Quando você usar a gsutil com a gcloud, faça login normalmente:

    gcloud auth login --cred-file=FILEPATH.json
    

    Ao usar a gsutil como um aplicativo de linha de comando autônomo, edite o arquivo .boto para incluir a seguinte seção:

    [Credentials]
    gs_external_account_file = FILEPATH
    

    Substitua FILEPATH, em ambos os casos, pelo caminho do arquivo para a configuração da credencial.

    O suporte para a federação de identidade de carga de trabalho na gsutil está disponível na versão 379.0.0 e posteriores da CLI gcloud.

    bq

    Para autenticar usando a federação de identidade de carga de trabalho, use o comando gcloud auth login da seguinte maneira:

    gcloud auth login --cred-file=FILEPATH.json
    

    Substitua FILEPATH pelo caminho do arquivo de configuração de credencial.

    O suporte para a federação de identidade de carga de trabalho no bq está disponível na versão 390.0.0 e posteriores da CLI gcloud.

    Se não for possível usar uma biblioteca de cliente compatível com a federação de identidade de carga de trabalho, você poderá autenticar programaticamente usando a API REST.

Cenários avançados

Autenticar uma carga de trabalho usando a API REST

Se não for possível usar as bibliotecas de cliente, siga estas etapas para permitir que uma carga de trabalho externa receba um token de acesso de curta duração usando a API REST:

  1. Consiga credenciais do IdP externo:

    AWS

    Crie um documento JSON com as informações que normalmente seriam incluídas em uma solicitação para o endpoint GetCallerIdentity() da AWS, incluindo uma assinatura de solicitação válida. de dados.

    A federação de identidade da carga de trabalho se refere a esse documento JSON como um token GetCallerIdentity. O token permite que a federação de identidade da carga de trabalho verifique a identidade sem revelar a chave de acesso secreta da AWS.

    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="
        }
      ]
    }
    

    O token 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 sem um prefixo https:. Exemplo:
        //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
        
      • x-amz-security-token: Token da sessão. Necessário apenas se você estiver usando credenciais temporárias de segurança.

    No exemplo a seguir, é criado um token GetCallerIdentity codificado por URL. Extraia o token codificado por URL para uso posterior. Ele também cria um token legívelpor humanos apenas para sua referência:

    import json
    import urllib
    
    import boto3
    from botocore.auth import SigV4Auth
    from botocore.awsrequest import AWSRequest
    
    def create_token_aws(project_number: str, pool_id: str, provider_id: str) -> None:
        # Prepare a GetCallerIdentity request.
        request = AWSRequest(
            method="POST",
            url="https://sts.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15",
            headers={
                "Host": "sts.amazonaws.com",
                "x-goog-cloud-target-resource": f"//iam.googleapis.com/projects/{project_number}/locations/global/workloadIdentityPools/{pool_id}/providers/{provider_id}",
            },
        )
    
        # Set the session credentials and Sign the request.
        # get_credentials loads the required credentials as environment variables.
        # Refer:
        # https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html
        SigV4Auth(boto3.Session().get_credentials(), "sts", "us-east-1").add_auth(request)
    
        # Create token from signed request.
        token = {"url": request.url, "method": request.method, "headers": []}
        for key, value in request.headers.items():
            token["headers"].append({"key": key, "value": value})
    
        # The token lets workload identity federation verify the identity without revealing the AWS secret access key.
        print("Token:\n%s" % json.dumps(token, indent=2, sort_keys=True))
        print("URL encoded token:\n%s" % urllib.parse.quote(json.dumps(token)))
    
    def main() -> None:
        # TODO(Developer): Replace the below credentials.
        # project_number: Google Project number (not the project id)
        project_number = "my-project-number"
        pool_id = "my-pool-id"
        provider_id = "my-provider-id"
    
        create_token_aws(project_number, pool_id, provider_id)
    
    if __name__ == "__main__":
        main()

    Inicialize as seguintes variáveis:

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:aws:token-type:aws4_request"
    SUBJECT_TOKEN=TOKEN
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:aws:token-type:aws4_request"
    $SubjectToken = "TOKEN"
    

    Em que TOKEN é o token GetCallerIdentity codificado da URL que foi gerado pelo script acima.

    Azure

    Conecte-se a uma VM do Azure que tenha uma identidade gerenciada atribuída e consiga um token de acesso do Serviço de metadados de instância (IMDS) do Azure:

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:jwt"
    SUBJECT_TOKEN=$(curl \
      "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \
      -H "Metadata: true" | jq -r .access_token)
    echo $SUBJECT_TOKEN
    

    Esse comando usa a ferramenta jq. jq está disponível por padrão no Cloud Shell.

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
      -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" `
      -Headers @{Metadata="true"}).access_token
    Write-Host $SubjectToken
    

    Em que APP_ID_URI é o URI do ID do aplicativo que você configurou para a federação de identidade da carga de trabalho.

  2. Use a API Security Token Service para trocar a credencial por um token de acesso de curta duração:

    Bash

    STS_TOKEN=$(curl https://sts.googleapis.com/v1/token \
        --data-urlencode "audience=//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID" \
        --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
        --data-urlencode "requested_token_type=urn:ietf:params:oauth:token-type:access_token" \
        --data-urlencode "scope=https://www.googleapis.com/auth/cloud-platform" \
        --data-urlencode "subject_token_type=$SUBJECT_TOKEN_TYPE" \
        --data-urlencode "subject_token=$SUBJECT_TOKEN" | jq -r .access_token)
    echo $STS_TOKEN
    

    PowerShell

    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
    $StsToken = (Invoke-RestMethod `
        -Method POST `
        -Uri "https://sts.googleapis.com/v1/token" `
        -ContentType "application/json" `
        -Body (@{
            "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"   = $SubjectTokenType
            "subjectToken"       = $SubjectToken
        } | ConvertTo-Json)).access_token
    Write-Host $StsToken
    

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto que contém o pool de identidades da carga de trabalho
    • POOL_ID: ID do pool de identidades da carga de trabalho
    • PROVIDER_ID: ID do provedor do pool de identidades de carga de trabalho
  3. Use o token do Security Token Service para invocar o método generateAccessToken da API IAM Service Account Credentials para receber um acesso. token:

Bash

ACCESS_TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken \
    -H "Content-Type: text/json; charset=utf-8" \
    -H "Authorization: Bearer $STS_TOKEN" \
    -d @- <<EOF | jq -r .accessToken
    {
        "scope": [ "https://www.googleapis.com/auth/cloud-platform" ]
    }
EOF
)
echo $ACCESS_TOKEN

PowerShell

$AccessToken = (Invoke-RestMethod `
    -Method POST `
    -Uri "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken" `
    -Headers @{ "Authorization" = "Bearer $StsToken" } `
    -ContentType "application/json" `
    -Body (@{
        "scope" = , "https://www.googleapis.com/auth/cloud-platform"
    } | ConvertTo-Json)).accessToken
Write-Host $AccessToken

Substitua SERVICE_ACCOUNT_EMAIL pelo endereço de e-mail da conta de serviço

A seguir