Configure a federação de identidade da carga de trabalho com VMs da AWS ou do Azure

Este guia descreve como usar a federação de identidades da carga de trabalho para permitir que as cargas de trabalho de VMs do AWS e do Azure se autentiquem no Trusted Cloud by S3NS sem uma chave de conta de serviço.

Se usar o Amazon Elastic Kubernetes Service (Amazon EKS) ou o Azure Kubernetes Service (AKS), consulte o artigo Configure a federação de identidades da carga de trabalho com o Kubernetes para saber como configurar a federação de identidades da carga de trabalho para os seus clusters. Esta página aborda apenas a configuração da federação de identidade da carga de trabalho para VMs do AWS e Azure.

Ao usar a Workload Identity Federation, as cargas de trabalho executadas no AWS EC2 e nas VMs do Azure podem trocar as respetivas credenciais específicas do ambiente por tokens doTrusted Cloud Security Token Service de curta duração.

As credenciais específicas do ambiente incluem o seguinte:

Ao configurar a Workload Identity Federation, pode permitir que estas cargas de trabalho troquem estas credenciais específicas do ambiente por credenciaisTrusted Cloud de curta duração. As cargas de trabalho podem usar estas credenciais de curta duração para aceder às APIs Trusted Cloud .

Antes de começar

Prepare o seu Fornecedor de identidade externo

Só tem de realizar estes passos uma vez para cada inquilino do Microsoft Entra ID ou conta da AWS.

AWS

Não tem de fazer alterações de configuração na sua conta da AWS.

Depois de configurar um conjunto do Workload Identity para confiar na sua conta da AWS, pode permitir que os utilizadores da AWS e as funções da AWS usem credenciais de segurança da AWS permanentes ou temporárias para obter credenciais Trusted Cloud de curta duração.

Azul-celeste

Tem de criar uma nova aplicação do Microsoft Entra ID no seu inquilino do Microsoft Entra ID e configurá-la para que possa ser usada para a federação de identidades de cargas de trabalho.

Depois de configurar um conjunto de identidades da carga de trabalho para confiar na aplicação, os utilizadores e os principais de serviço do Azure podem pedir tokens de acesso para esta aplicação e trocar estes tokens de acesso por credenciais Trusted Cloud de curta duração.

Para criar a aplicação, faça o seguinte:

  1. Crie uma aplicação e um principal de serviço do Microsoft Entra ID.

  2. Defina um URI do ID da aplicação para a aplicação. Pode usar o URI do ID da aplicação predefinido (APPID) ou especificar um URI personalizado.

    Precisa do URI do ID da aplicação mais tarde quando configurar o fornecedor do conjunto do Workload Identity.

Para permitir que uma aplicação obtenha tokens de acesso para a aplicação Microsoft Entra ID, pode usar identidades geridas:

  1. Crie uma identidade gerida. Anote o ID do objeto da identidade gerida. Precisa dele mais tarde quando configurar a representação.

  2. Atribua a identidade gerida a uma máquina virtual ou a outro recurso que execute a sua aplicação.

Configure a Workload Identity Federation

Só tem de realizar estes passos uma vez por conta da AWS ou inquilino do Microsoft Entra ID. Em seguida, pode usar o mesmo Workload Identity Pool e fornecedor para várias cargas de trabalho e em vários Trusted Cloud projetos.

Para começar a configurar a Workload Identity Federation, faça o seguinte:

  1. In the Trusted Cloud console, go to the project selector page.

    Go to project selector

  2. Select or create a Trusted Cloud project.

  3. É recomendável usar um projeto dedicado para gerir os fornecedores e os conjuntos de identidades de carga de trabalho.

    Verify that billing is enabled for your Trusted Cloud project.

    Enable the IAM, Resource Manager, Service Account Credentials, and Security Token Service APIs.

    Enable the APIs

Defina um mapeamento de atributos e uma condição

As credenciais específicas do ambiente da sua carga de trabalho da AWS ou do Azure contêm vários atributos e tem de decidir que atributo quer usar como identificador do assunto (google.subject) em Trusted Cloud.

Trusted Cloud usa o identificador do assunto nos registos de auditoria do Cloud e nos identificadores principais para identificar de forma exclusiva um utilizador ou uma função do AWS ou Azure.

Opcionalmente, pode mapear atributos adicionais. Em seguida, pode consultar estes atributos adicionais quando conceder acesso a recursos.

AWS

O mapeamento de atributos pode usar os campos de resposta para GetCallerIdentity como atributos de origem. Estes 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 de chamada.

Se a sua aplicação for executada numa instância do Amazon Elastic Compute Cloud (EC2) com uma função anexada, pode usar o seguinte mapeamento de atributos:

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:

  • Usa o ARN como identificador do assunto, por exemplo: "arn:aws:sts::000000000000:assumed-role/ec2-my-role/i-00000000000000000
  • Introduz um atributo personalizado account e atribui-lhe o ID da conta da AWS
  • Introduz um atributo personalizado aws_role e atribui-lhe o nome da função da AWS, por exemplo: ec2-my-role
  • Introduz um atributo personalizado aws_ec2_instance e atribui-lhe o ID da instância do EC2. Por exemplo: i-00000000000000000

Com este mapeamento, pode 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 utilizadores e instâncias numa função:

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

Azul-celeste

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

google.subject=assertion.sub
Quando a reivindicação `sub` excede o limite de 127 carateres para google.subject, recomenda-se a utilização de uma [função `extract`](/iam/docs/conditions-attribute-reference#extract) para derivar reivindicações significativas para utilização como identificador do assunto:
google.subject=assertion.sub.extract('/eid1/c/pub/t/{sub_claim}')

Para uma chave de acesso emitida para uma identidade gerida, a reivindicação sub contém o ID do objeto da identidade gerida. Se usar uma reivindicação diferente, certifique-se de que a reivindicação é única e não pode ser reatribuída.

Se não tiver a certeza da lista de reivindicações que pode referenciar, faça o seguinte:

  1. Estabeleça ligação a uma VM do Azure que tenha uma identidade gerida atribuída.

  2. Obtenha um token de acesso do Azure Instance Metadata Service (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
    

    Este comando usa a ferramenta jq. jq está disponível por predefiniçã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 da aplicação da aplicação que configurou para a Workload Identity Federation.

  3. Num navegador de Internet, aceda a https://jwt.ms/ e cole o token de acesso no campo.

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

Para identidades de serviço, normalmente, não é necessário criar um mapeamento para google.groups nem para quaisquer atributos personalizados.

Opcionalmente, defina uma condição de atributo. As condições de atributos são expressões de IEC que podem verificar atributos de afirmação e atributos de destino. Se a condição do atributo for avaliada como true para uma determinada credencial, a credencial é aceite. Caso contrário, a credencial é rejeitada.

AWS

Pode usar uma condição de atributo para restringir os utilizadores e as funções da IAM que podem usar a Federação de identidades de carga de trabalho para obter tokens Trusted Cloud de curta duração.

Por exemplo, a seguinte condição restringe o acesso a funções da AWS e não permite outros identificadores de IAM:

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

Azul-celeste

Pode usar uma condição de atributo para restringir os utilizadores e os responsáveis de serviços que podem usar a Workload Identity Federation para obter tokens Trusted Cloud de curta duração. Em alternativa, pode configurar a sua aplicação do Microsoft Entra ID para usar atribuições de funções da app.

Crie o Workload Identity Pool e o fornecedor

Funções necessárias

Para obter as autorizações de que precisa para configurar a Workload Identity Federation, peça ao seu administrador para lhe conceder as seguintes funções de IAM no projeto:

Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

Em alternativa, a função básica de proprietário da IAM (roles/owner) também inclui autorizações para configurar a federação de identidades. Não deve conceder funções básicas num ambiente de produção, mas pode concedê-las num ambiente de desenvolvimento ou teste.

Agora, recolheu todas as informações necessárias para criar um Workload Identity Pool e um fornecedor:

Consola

  1. Na Trusted Cloud consola, aceda à página Novo fornecedor e conjunto de cargas de trabalho.

    Aceda a Novo fornecedor e Workload Identity Pool

  2. Na secção Crie um Identity Pool, introduza o seguinte:

    • Nome: nome do conjunto. O nome também é usado como ID do conjunto. Não pode alterar o ID do conjunto mais tarde.
    • Descrição: texto que descreve a finalidade do grupo.
  3. Clique em Continuar.

  4. Configure as definições do fornecedor:

    AWS

    Configure as seguintes definições do fornecedor:

    • Selecione um fornecedor: AWS.
    • Nome do fornecedor: o nome do fornecedor. O nome também é usado como o ID do fornecedor. Não pode alterar o ID do fornecedor mais tarde.

    Azul-celeste

    Configure as seguintes definições do fornecedor:

    • Selecione um fornecedor: OpenID Connect (OIDC).
    • Nome do fornecedor: nome do fornecedor. O nome também é usado como o ID do fornecedor. Não pode alterar o ID do fornecedor mais tarde.
    • URL do emissor: https://sts.windows.net/TENANT_ID. Substitua TENANT_ID pelo ID do inquilino (GUID) do seu inquilino do Microsoft Entra ID.
    • Públicos-alvo permitidos: URI do ID da aplicação que usou quando registou a aplicação no Microsoft Entra ID.
  5. Clique em Continuar.

  6. Na secção Configurar atributos do fornecedor, adicione os mapeamentos de atributos que identificou anteriormente.

  7. Na secção Condições de atributos, introduza a condição de atributo que identificou anteriormente. Deixe o campo em branco se não tiver uma condição de atributo.

  8. Clique em Guardar para criar o Workload Identity Pool e o fornecedor.

gcloud

  1. Crie um novo Workload Identity Pool:

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

    Substitua o seguinte:

    • POOL_ID: o ID exclusivo do conjunto.
    • DISPLAY_NAME: o nome do conjunto.
    • DESCRIPTION: a descrição da piscina. Esta descrição é apresentada quando concede acesso a identidades de conjunto.
  2. Adicione um fornecedor do Workload Identity Pool:

    AWS

    Para criar o fornecedor do Workload Identity Pool 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 o seguinte:

    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"

    Azul-celeste

    Para criar o fornecedor do Workload Identity Pool 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 o seguinte:

    • PROVIDER_ID: o ID exclusivo do fornecedor.
    • POOL_ID: o ID do conjunto.
    • ISSUER_URI: o ID do inquilino (GUID) do seu inquilino do Microsoft Entra ID, por vezes formatado como https://sts.windows.net/TENANT_ID. O URI do emissor pode variar e, para encontrar o seu URI do emissor, pode depurar o seu JWT através de JWT.io.
    • APPLICATION_ID_URI: URI do ID da aplicação que usou quando registou a aplicação no Microsoft Entra ID.
    • MAPPINGS: a lista separada por vírgulas de mapeamentos de atributos que identificou anteriormente.
    • CONDITIONS: (Opcional) A condição do atributo que 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"

Autentique uma carga de trabalho

Tem de realizar estes passos uma vez por carga de trabalho.

Permita que a sua carga de trabalho externa aceda aos recursos do Trusted Cloud

Para dar acesso aos recursos à sua carga de trabalho, recomendamos que conceda acesso direto aos recursos ao principal. Trusted Cloud Neste caso, o principal é o utilizador federado. Alguns Trusted Cloud produtos têm limitações da API Google Cloud. Se a sua carga de trabalho chamar um ponto final da API que tenha uma limitação, pode, em alternativa, usar a representação de contas de serviço. Neste caso, o principal é a Trusted Cloud conta de serviço, que funciona como a identidade. Concede acesso à conta de serviço no recurso.

Acesso direto aos recursos

Pode conceder acesso a uma identidade federada diretamente nos recursos através da Trusted Cloud consola ou da CLI gcloud.

Consola

Para usar a Trusted Cloud consola para conceder funções de IAM diretamente num recurso, tem de aceder à página do recurso e, em seguida, conceder a função. O exemplo seguinte mostra como aceder à página do Cloud Storage e conceder a função Storage Object Viewer (roles/storage.objectViewer) a uma identidade federada diretamente num contentor do Cloud Storage.

  1. Na Trusted Cloud consola, aceda à página Recipientes do Cloud Storage.

    Aceda aos contentores

  2. Na lista de contentores, clique no nome do contentor para o qual quer conceder a função.

  3. Selecione o separador Autorizações junto à parte superior da página.

  4. Clique no botão Conceder acesso.

    É apresentada a caixa de diálogo Adicionar responsáveis.

  5. No campo Novos responsáveis, introduza uma ou mais identidades que precisam de acesso ao seu contentor.

    Por assunto

    principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
    

    Substitua o seguinte:

    • PROJECT_NUMBER: o número do projeto
    • POOL_ID: o ID do conjunto de trabalhos
    • SUBJECT: o indivíduo assunto mapeado a partir do seu IdP, por exemplo, administrator@example.com

    Por grupo

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
    

    Substitua o seguinte:

    • PROJECT_NUMBER: o número do projeto
    • WORKLOAD_POOL_ID: o ID do conjunto de trabalhos
    • GROUP: o grupo mapeado a partir do seu IdP, por exemplo: administrator-group@example.com

    Por atributo

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
    

    Substitua o seguinte:

    • PROJECT_NUMBER: o número do projeto
    • WORKLOAD_POOL_ID: o ID do conjunto de trabalhos
    • ATTRIBUTE_NAME: um dos atributos mapeados a partir do seu IdP
    • ATTRIBUTE_VALUE: o valor do atributo
  6. Selecione uma ou mais funções no menu pendente Selecionar uma função. As funções que selecionar aparecem no painel com uma breve descrição das autorizações que concedem.

  7. Clique em Guardar.

gcloud

Para usar a CLI gcloud para conceder funções de IAM num recurso num projeto, faça o seguinte:

  1. Obtenha o número do projeto no qual o recurso está definido.

    gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
    
  2. Conceder acesso ao recurso.

    Para usar a CLI gcloud para conceder a função Storage Object Viewer (roles/storage.objectViewer) a identidades externas que cumprem determinados critérios, execute o seguinte comando.

    Por assunto

    gcloud storage buckets add-iam-policy-binding BUCKET_ID \
        --role=roles/storage.objectViewer \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"

    Por grupo

    gcloud storage buckets add-iam-policy-binding BUCKET_ID \
        --role=roles/storage.objectViewer \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"

    Por atributo

    gcloud storage buckets add-iam-policy-binding BUCKET_ID \
        --role=roles/storage.objectViewer \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"

    Substitua o seguinte:

    • BUCKET_ID: o contentor no qual conceder acesso
    • PROJECT_NUMBER: o número do projeto. do projeto que contém o Workload Identity Pool
    • POOL_ID: o ID do Workload Identity Pool
    • SUBJECT: o valor esperado para o atributo que mapeou para google.subject
    • GROUP: o valor esperado para o atributo que mapeou para google.groups
    • ATTRIBUTE_NAME: o nome de um atributo personalizado no mapeamento de atributos
    • ATTRIBUTE_VALUE: o valor do atributo personalizado no mapeamento de atributos

    Pode conceder funções em qualquer Trusted Cloud recurso que suporte políticas de autorização do IAM.

Simulação de identidade de conta de serviço

  1. Para criar uma conta de serviço para a carga de trabalho externa, faça o seguinte:

    1. Enable the IAM, Security Token Service, and Service Account Credentials APIs.

      Enable the APIs

    2. Crie uma conta de serviço que represente a carga de trabalho. Recomendamos que use uma conta de serviço dedicada para cada carga de trabalho. A conta de serviço não tem de estar no mesmo projeto que o conjunto de identidades de carga de trabalho, mas tem de fazer referência ao projeto que contém a conta de serviço.

    3. Conceda acesso à conta de serviço aos recursos aos quais quer que as identidades externas acedam.

  2. Para permitir que a identidade federada use a identidade da conta de serviço, faça o seguinte:

Consola

Para usar a Trusted Cloud consola para conceder funções do IAM a uma identidade federada com uma conta de serviço, faça o seguinte:

Conta de serviço no mesmo projeto

  1. Para conceder acesso através da representação da conta de serviço para uma conta de serviço no mesmo projeto, faça o seguinte:

    1. Aceda à página Workload Identity Pools.

      Aceda aos Workload Identity Pools

    2. Selecione Conceder acesso.

    3. Na caixa de diálogo Conceder acesso à conta de serviço, selecione Conceder acesso através da simulação da conta de serviço.

    4. Na lista Contas de serviço, selecione a conta de serviço para as identidades externas se fazerem passar por ela e faça o seguinte:

    5. Para escolher que identidades no conjunto podem roubar a identidade da conta de serviço, execute uma das seguintes ações:

      • Para permitir que apenas identidades específicas do conjunto de identidades da carga de trabalho se façam passar pela conta de serviço, selecione Apenas identidades que correspondam ao filtro.

      • Na lista Nome do atributo, selecione o atributo pelo qual quer filtrar.

      • No campo Valor do atributo, introduza o valor esperado do atributo; por exemplo, se usar um mapeamento de atributos google.subject=assertion.sub, defina o nome do atributo como subject e o valor do atributo como o valor da reivindicação sub em tokens emitidos pelo seu fornecedor de identidade externo.

    6. Para guardar a configuração, clique em Guardar e, de seguida, em Ignorar.

Conta de serviço num projeto diferente

  1. Para conceder acesso através da representação de conta de serviço a uma conta de serviço num projeto diferente, faça o seguinte:

    1. Aceda à página Contas de serviço.

      Aceda a Contas de serviço

    2. Selecione a conta de serviço que quer roubar.

    3. Clique em Gerir acesso.

    4. Clique em Adicionar principal.

    5. No campo Novo principal, introduza um dos seguintes identificadores principais para as identidades no seu conjunto que vão roubar a identidade da conta de serviço.

      Por assunto

      principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
      

      Substitua o seguinte:

      • PROJECT_NUMBER: o número do projeto
      • POOL_ID: o ID do conjunto de trabalhos
      • SUBJECT: o indivíduo assunto mapeado a partir do seu IdP, por exemplo, administrator@example.com

      Por grupo

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
      

      Substitua o seguinte:

      • PROJECT_NUMBER: o número do projeto
      • WORKLOAD_POOL_ID: o ID do conjunto de trabalhos
      • GROUP: o grupo mapeado a partir do seu IdP, por exemplo: administrator-group@example.com

      Por atributo

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
      

      Substitua o seguinte:

      • PROJECT_NUMBER: o número do projeto
      • WORKLOAD_POOL_ID: o ID do conjunto de trabalhos
      • ATTRIBUTE_NAME: um dos atributos mapeados a partir do seu IdP
      • ATTRIBUTE_VALUE: o valor do atributo

      Por piscina

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
      

      Substitua o seguinte:

      • PROJECT_NUMBER: o número do projeto
      • WORKLOAD_POOL_ID: o ID do conjunto de trabalhos
    6. Em Selecionar uma função, selecione a função de utilizador da identidade de carga de trabalho (roles/iam.workloadIdentityUser).

    7. Para guardar a configuração, clique em Guardar.

gcloud

Para conceder a função Workload Identity User (roles/iam.workloadIdentityUser) a um conjunto de principais ou um principal federado, execute o seguinte comando. Para saber mais sobre os identificadores de principais da federação de identidades da carga de trabalho, consulte o artigo Tipos de principais.

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 o seguinte:

  • SERVICE_ACCOUNT_EMAIL: o endereço de email da conta de serviço
  • PROJECT_NUMBER: o número do projeto. do projeto que contém o Workload Identity Pool
  • POOL_ID: o ID do Workload Identity Pool
  • SUBJECT: o valor esperado para o atributo que mapeou para google.subject
  • GROUP: o valor esperado para o atributo que mapeou para google.groups
  • ATTRIBUTE_NAME: o nome de um atributo personalizado no mapeamento de atributos
  • ATTRIBUTE_VALUE: o valor do atributo personalizado no mapeamento de atributos

Transfira ou crie uma configuração de credenciais

As bibliotecas cliente do Google Cloud, a CLI gcloud e o Terraform podem obter automaticamente credenciais externas e usar estas credenciais para se fazerem passar por uma conta de serviço. Para permitir que as bibliotecas e as ferramentas concluam este processo, tem de fornecer um ficheiro de configuração de credenciais. Este ficheiro define o seguinte:

  • Onde obter credenciais externas
  • Que Workload Identity Pool e fornecedor usar
  • Que conta de serviço usar como identidade

Para criar um ficheiro de configuração de credenciais, faça o seguinte:

Consola

Para transferir um ficheiro de configuração de credenciais na Trusted Cloud consola, faça o seguinte:

  1. Na Trusted Cloud consola, aceda à página Workload Identity Pools.

    Aceda aos Workload Identity Pools

  2. Localize o Workload Identity Pool para o IdP que quer usar e clique nele.

  3. Se optou por usar o acesso direto aos recursos, faça o seguinte:

    1. Clique em Conceder acesso.

    2. Selecione Conceder acesso através de identidades federadas (recomendado).

    3. Clique em Transferir.

    4. Continue com as instruções para configurar a caixa de diálogo da aplicação, mais adiante neste procedimento.

  4. Se optou por usar a simulação da conta de serviço, faça o seguinte:

    1. Selecione Contas de serviço associadas.

    2. Encontre a conta de serviço que quer usar e clique em Transferir.

    3. Continue com as instruções para configurar a caixa de diálogo da aplicação, mais adiante neste procedimento.

  5. Na caixa de diálogo Configure a sua aplicação, selecione o fornecedor que contém as identidades externas.

  6. Indique as seguintes definições adicionais:

    AWS

    Não são necessárias definições adicionais.

    Azul-celeste

    URL do ID da aplicação: URI do ID da aplicação da aplicação Azure

  7. Selecione Transferir config para transferir o ficheiro de configuração de credenciais e, de seguida, clique em Ignorar.

gcloud

Para criar um ficheiro de configuração de credenciais através de gcloud iam workload-identity-pools create-cred-config, faça o seguinte:

AWS

Para criar um ficheiro de configuração de credenciais que permita à biblioteca obter um token de acesso a partir dos 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 o seguinte:

  • PROJECT_NUMBER: o número do projeto do projeto que contém o Workload Identity Pool
  • POOL_ID: o ID do Workload Identity Pool.
  • PROVIDER_ID: o ID do fornecedor do Workload Identity Pool.
  • SERVICE_ACCOUNT_EMAIL: se usar a simulação de conta de serviço, substitua-o pelo endereço de email da conta de serviço. Omita este sinalizador se não usar a simulação da conta de serviço.
  • SERVICE_ACCOUNT_TOKEN_LIFETIME: se usar a representação da conta de serviço, substitua-o pela duração total da chave de acesso da conta de serviço, em segundos. Por predefinição, é de uma hora quando não é fornecido. Omita este sinalizador se não usar a simulação da conta de serviço. Para especificar uma duração total superior a uma hora, tem de configurar a restrição da política organizacional constraints/iam.allowServiceAccountCredentialLifetimeExtension .
  • FILEPATH: O ficheiro para guardar a configuração.

Se usar o AWS IMDSv2, tem de adicionar uma flag adicional --enable-imdsv2 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 a utilização do servidor de metadados da AWS não for uma opção, pode fornecer credenciais de segurança da AWS através das seguintes variáveis de ambiente da AWS:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • Uma das seguintes opções: AWS_REGION ou AWS_DEFAULT_REGION
  • Opcional: AWS_SESSION_TOKEN

A CLI gcloud e as bibliotecas usam estas variáveis de ambiente da AWS quando o servidor de metadados da AWS não está disponível.

Azul-celeste

Crie um ficheiro de configuração de credenciais que permita à biblioteca obter um token de acesso do Azure Instance Metadata Service (IMDS):

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 o seguinte:

  • PROJECT_NUMBER: o número do projeto do projeto que contém o Workload Identity Pool.
  • POOL_ID: o ID do Workload Identity Pool.
  • PROVIDER_ID: o ID do fornecedor do Workload Identity Pool.
  • SERVICE_ACCOUNT_EMAIL: se usar a simulação de conta de serviço, substitua-o pelo endereço de email da conta de serviço. Omita este sinalizador se não usar a simulação da conta de serviço.
  • APPLICATION_ID_URI: o URI do ID da aplicação da aplicação Azure.
  • SERVICE_ACCOUNT_TOKEN_LIFETIME: se usar a representação da conta de serviço,a duração total da chave de acesso da conta de serviço, em segundos. O valor predefinido é uma hora quando não é fornecido. Omita este sinalizador se não usar a simulação da conta de serviço. Para especificar uma duração total superior a uma hora, tem de configurar a constraints/iam.allowServiceAccountCredentialLifetimeExtension restrição da política organizacional.
  • FILEPATH: O ficheiro para guardar a configuração.

Use a configuração de credenciais para aceder a Trusted Cloud

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

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

    Bash

      export GOOGLE_APPLICATION_CREDENTIALS=`pwd`/FILEPATH.json
      
    onde FILEPATH é o caminho relativo para o ficheiro de configuração das credenciais.

    PowerShell

      $env:GOOGLE_APPLICATION_CREDENTIALS = Resolve-Path 'FILEPATH.json'
      
    onde FILEPATH é o caminho relativo para o ficheiro de configuração das credenciais.
  2. Use uma biblioteca ou uma ferramenta de cliente que suporte a federação de identidades da carga de trabalho e que possa encontrar credenciais automaticamente:

    C++

    As Trusted Cloud bibliotecas cliente para C++ suportam a federação de identidades da carga de trabalho desde a versão v2.6.0. Para usar a Workload Identity Federation, tem de criar as bibliotecas de cliente com a versão 1.36.0 ou posterior do gRPC.

    Ir

    As bibliotecas cliente para Go suportam a federação de identidades da carga de trabalho se usarem a versão v0.0.0-20210218202405-ba52d332ba99 ou posterior do módulo golang.org/x/oauth2.

    Para verificar que versão deste módulo a 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 cliente para Java suportam a Workload Identity Federation se usarem a versão 0.24.0 ou posterior do artefacto com.google.auth:google-auth-library-oauth2-http.

    Para verificar que versão deste artefacto a sua biblioteca de cliente usa, execute o seguinte comando Maven no diretório da aplicação:

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

    Node.js

    As bibliotecas de cliente para Node.js suportam a Federação de identidades da carga de trabalho se usarem a versão 7.0.2 ou posterior do pacote google-auth-library.

    Para verificar que versão deste pacote a sua biblioteca de cliente usa, execute o seguinte comando no diretório da aplicação:

    npm list google-auth-library
    

    Quando cria um objeto GoogleAuth, pode especificar um ID do projeto ou permitir que a GoogleAuth encontre o ID do projeto automaticamente. Para encontrar o ID do projeto automaticamente, a conta de serviço no ficheiro de configuração tem de ter a função Navegador (roles/browser) ou uma função com autorizações equivalentes no seu projeto. Para obter detalhes, consulte o README para o pacote google-auth-library.

    Python

    As bibliotecas cliente para Python suportam a Federação de identidades de carga de trabalho se usarem a versão 1.27.0 ou posterior do pacote google-auth.

    Para verificar que versão deste pacote a sua biblioteca de cliente usa, execute o seguinte comando no ambiente onde o pacote está instalado:

    pip show google-auth
    

    Para especificar um ID do projeto para o cliente de autenticação, pode definir a variável de ambiente GOOGLE_CLOUD_PROJECT ou permitir que o cliente encontre o ID do projeto automaticamente. Para encontrar o ID do projeto automaticamente, a conta de serviço no ficheiro de configuração tem de ter a função de navegador (roles/browser) ou uma função com autorizações equivalentes no seu projeto. Para obter detalhes, consulte o manual do utilizador do pacote google-auth.

    gcloud

    Para autenticar com a Workload Identity Federation, use o comando gcloud auth login:

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

    Substitua FILEPATH pelo caminho para o ficheiro de configuração das credenciais.

    O suporte para a Workload Identity Federation na CLI gcloud está disponível na versão 363.0.0 e versões posteriores da CLI gcloud.

    Terraform

    O Trusted Cloud fornecedor suporta a Workload Identity Federation se usar a versão 3.61.0 ou posterior:

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

    bq

    Para autenticar através da Workload Identity Federation, use o comando gcloud auth login, da seguinte forma:

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

    Substitua FILEPATH pelo caminho para o ficheiro de configuração das credenciais.

    O suporte para a Workload Identity Federation no bq está disponível na versão 390.0.0 e versões posteriores da CLI gcloud.

    Se não conseguir usar uma biblioteca cliente que suporte a Workload Identity Federation, pode autenticar programaticamente através da API REST.

Cenários avançados

Autentique uma carga de trabalho através da API REST

Se não conseguir usar as bibliotecas cliente, pode seguir estes passos para permitir que uma carga de trabalho externa obtenha um token de acesso de curta duração através da API REST:

  1. Obtenha credenciais do seu IdP externo:

    AWS

    Crie um documento JSON que contenha as informações que normalmente incluiria num pedido ao ponto final da AWS GetCallerIdentity(), incluindo uma assinatura de pedido válida.

    A federação de identidades da carga de trabalho refere-se a este documento JSON como um token.GetCallerIdentity O token permite que a Workload Identity Federation valide a identidade sem revelar a chave de acesso secreta da AWS.

    Um token GetCallerIdentity tem um aspeto semelhante ao seguinte:

    {
      "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 ponto final do AWS STS para GetCallerIdentity(), com o corpo de um pedido GetCallerIdentity() padrão anexado como parâmetros de consulta. Por exemplo, https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15. Recomendamos que use pontos finais do STS regionais e conceba uma infraestrutura fiável para as suas cargas de trabalho. Para mais informações, consulte o artigo Pontos finais regionais do AWS STS.
    • method: O método de pedido HTTP: POST.
    • headers: Os cabeçalhos do pedido HTTP, que têm de incluir:
      • Authorization: a assinatura solicitada.
      • host: o nome de anfitrião do campo url; por exemplo, sts.amazonaws.com.
      • x-amz-date: a hora em que envia o pedido, formatada como uma string ISO 8601 Basic. Normalmente, este valor é definido como a hora atual e é usado para ajudar a evitar ataques de repetição.
      • x-goog-cloud-target-resource: o nome completo do recurso do fornecedor de identidade sem um prefixo https:. Por exemplo:
        //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
        
      • x-amz-security-token: token da sessão. Só é necessário se estiver a usar credenciais de segurança temporárias.

    O exemplo seguinte cria um símbolo GetCallerIdentity codificado em URL. Extraia o token codificado por URL para utilização posterior. Também cria um token legível por 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"
    

    Onde TOKEN é o token codificado por URL GetCallerIdentity que foi gerado pelo script.

    Azul-celeste

    Ligue-se a uma VM do Azure que tenha uma identidade gerida atribuída e obtenha um token de acesso do serviço de metadados de instâncias (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
    

    Este comando usa a ferramenta jq. jq está disponível por predefiniçã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 da aplicação da aplicação que configurou para a federação de identidade da força 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: número do projeto que contém o Workload Identity Pool
    • POOL_ID: ID do Workload Identity Pool
    • PROVIDER_ID: ID do fornecedor do Workload Identity Pool
  3. Se usar a representação da conta de serviço, use o token do Security Token Service para invocar o método generateAccessToken da API IAM Service Account Credentials para obter uma chave de acesso.

Tokens para serviços do Cloud Run

Quando acede a um serviço do Cloud Run, tem de usar um token de ID.

Bash

TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateIdToken \
    -H "Content-Type: text/json; charset=utf-8" \
    -H "Authorization: Bearer $STS_TOKEN" \
    -d @- <<EOF | jq -r .token
    {
        "audience": "SERVICE_URL"
    }
EOF
)
echo $TOKEN

PowerShell

$Token = (Invoke-RestMethod `
    -Method POST `
    -Uri "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateIdToken" `
    -Headers @{ "Authorization" = "Bearer $StsToken" } `
    -ContentType "application/json" `
    -Body (@{
        "audience" = "SERVICE_URL"
    } | ConvertTo-Json)).token
Write-Host $Token

Substitua o seguinte:

  • SERVICE_ACCOUNT_EMAIL: o endereço de email da conta de serviço.
  • SERVICE_URL: o URL do serviço, por exemplo, https://my-service-12345-us-central1.run.app. Também pode defini-lo para o seu ponto final de serviço personalizado. Para mais informações, consulte o artigo Compreender os públicos-alvo personalizados.

Tokens para outras plataformas

Quando acede a outro serviço, tem de usar uma chave de acesso.

Bash

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 $TOKEN

PowerShell

$Token = (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 $Token

Substitua o seguinte:

  • SERVICE_ACCOUNT_EMAIL: o endereço de email da conta de serviço.

O que se segue?