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 da carga de trabalho, as cargas de trabalho executadas no AWS EC2 e Azure podem trocar as credenciais específicas do ambiente por tokens de curta duração do Google Cloud Security Token Service.
As credenciais específicas do ambiente incluem o seguinte:
- As instâncias do AWS EC2 podem usar perfis de instância para solicitar credenciais temporárias.
- As VMs do Azure podem usar identidades gerenciadas para receber tokens de acesso do Azure.
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.
Antes de começar
Configure a autenticação.
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Python
Para usar os exemplos Python desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local na documentação de autenticação do Google Cloud.
Preparar o provedor de identidade externo
Você só precisa realizar essas etapas uma vez para cada locatário do ID do Microsoft Entra ou conta da AWS.
AWS
Não é necessário fazer mudanças na configuração da sua conta da AWS.
Depois de configurar um pool de identidades da 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 Microsoft Entra ID no seu locatário do Microsoft Entra ID e configure-o para ser usado na federação de identidade da carga de trabalho.
Depois que você configura um pool de identidades da 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:
Crie um aplicativo do Microsoft Entra ID e uma entidade de serviço.
Defina o URI do ID do aplicativo. É possível usar o URI padrão do ID do aplicativo (
APPID
) ou especificar um URI personalizado.Você precisará do URI do ID do aplicativo mais tarde, quando configurar o provedor do pool de Identidade da carga de trabalho
Para permitir que um aplicativo receba tokens de acesso para o aplicativo Microsoft Entra ID, use as identidades gerenciadas:
Crie uma identidade gerenciada. Anote o ID do objeto da identidade gerenciada. Você precisará dele posteriormente ao configurar a representação.
Atribua a identidade gerenciada a uma máquina virtual ou a outro recurso que execute o aplicativo.
Configurar a federação de identidade da carga de trabalho
Você só precisa realizar essas etapas uma vez por conta da AWS ou locatário do Microsoft Entra ID. É 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 isto:
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
É melhor
usar um projeto dedicado para gerenciar pools e provedores de identidade da carga de trabalho
-
Make sure that billing is enabled for your Google Cloud project.
Enable the IAM, Resource Manager, Service Account Credentials, and Security Token Service 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:
- Usa o ARN como identificador do sujeito, por exemplo:
"arn:aws:sts::000000000000:assumed-role/ec2-my-role/i-00000000000000000
- Apresenta um atributo personalizado
account
e atribui a ele o ID da conta da AWS - Apresenta um atributo personalizado
aws_role
e atribui a ele o nome do papel da AWS, por exemplo:ec2-my-role
- Apresenta um atributo personalizado
aws_ec2_instance
e atribui a ele o ID da instância do EC2, por 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:
Conecte-se a uma VM do Azure com uma identidade gerenciada atribuída.
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.Em um navegador da Web, acesse
https://jwt.ms/
e cole o token de acesso no campo.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 de curta duração do Google Cloud.
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 Microsoft Entra ID para usar atribuições de papel do app.
Criar um pool de identidade e um pol de Identidade da 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:
-
Administrador de pool de Identidade da carga de trabalho (
roles/iam.workloadIdentityPoolAdmin
) -
Administrador da conta de serviço (
roles/iam.serviceAccountAdmin
)
Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.
Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de 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
No Console do Google Cloud, acesse a página Novo provedor de carga de trabalho e pool.
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.
Clique em Continuar.
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
. SubstituaTENANT_ID
pelo ID do locatário (GUID) do locatário do Microsoft Entra ID. - Públicos-alvo permitidos: o URI do ID do aplicativo que você usou quando registrou o aplicativo no Microsoft Entra ID.
Clique em Continuar.
Na seção Configurar atributos do provedor, adicione os mapeamentos de atributos identificados anteriormente.
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.
Clique em Salvar para criar o pool de identidades e o provedor da carga de trabalho.
gcloud
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.
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:
PROVIDER_ID
: o ID exclusivo do fornecedor.POOL_ID
: o ID do pool.ACCOUNT_ID
: o número de 12 dígitos que identifica sua conta da AWS.MAPPINGS
: lista separada por vírgulas de mapeamentos de atributos identificados anteriormente.CONDITIONS
: condição de atributo que você identificou anteriormente. Remova o parâmetro se você não tiver uma condição de atributo.
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 Microsoft Entra ID, às vezes formatado comohttps://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 ID do Microsoft Entra.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.
Permitir que a carga de trabalho externa acesse recursos do Google Cloud
Para fornecer à sua carga de trabalho acesso aos recursos do Google Cloud, recomendamos que você conceda ao principal acesso direto aos recursos. Nesse caso, o principal é o usuário federado. Alguns produtos do Google Cloud têm limitações de APIs do Google Cloud. Se sua carga de trabalho chamar um endpoint de API que apresenta limitação, será possível usar a identidade temporária de conta de serviço. Nesse caso, o principal é a conta de serviço do Google Cloud, que atua como a identidade. Você concede acesso à conta de serviço no recurso.
Acesso direto a recursos
É possível conceder acesso a uma identidade federada diretamente nos recursos usando o console do Google Cloud ou a gcloud CLI.
Console
Para usar o console do Google Cloud para conceder papéis do IAM diretamente em um recurso, acesse a página do recurso e conceda o papel. O exemplo a seguir mostra como acessar a página do Cloud Storage e conceder o papel Leitor de objetos do Storage (
roles/storage.objectViewer
) a uma identidade federada diretamente em um bucket do Cloud Storage.- No Console do Google Cloud, acesse a página Buckets do Cloud Storage.
Na lista de buckets, clique no nome do bucket ao qual você quer conceder o papel.
Selecione a guia Permissões na parte superior da página.
Clique no botão add_boxPermitir acesso.
A caixa de diálogo Adicionar principais será exibida.
No campo Novos principais, insira uma ou mais identidades que precisam acessar seu bucket.
Por assunto
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
Substitua:
PROJECT_NUMBER
: o número do projetoPOOL_ID
: o ID do pool de carga de trabalhoSUBJECT
: o sujeito individual mapeado do IdP, por exemplo,administrator@example.com
Por grupo
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
Substitua:
PROJECT_NUMBER
: o número do projetoWORKLOAD_POOL_ID
: o ID do pool de carga de trabalhoGROUP
: o grupo mapeado do 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:
PROJECT_NUMBER
: o número do projetoWORKLOAD_POOL_ID
: o ID do pool de carga de trabalhoATTRIBUTE_NAME
: um dos atributos que foi mapeado do IdPATTRIBUTE_VALUE
: o valor do atributo
Escolha um papel ou mais no menu suspenso Selecionar um papel. Os papéis selecionados são exibidos no painel com uma breve descrição das permissões que eles concedem.
Clique em Salvar.
gcloud
Para usar a gcloud CLI a fim de conceder papéis do IAM em um recurso de um projeto, faça isto:
Consiga o número do projeto em que o recurso está definido.
gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
Conceda acesso ao recurso.
Para usar a gcloud CLI para conceder o papel de leitor de objetos de armazenamento (
roles/storage.objectViewer
) a identidades externas que atendam a determinados critérios, execute o comando a seguir.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:
BUCKET_ID
: o bucket em que o acesso será concedidoPROJECT_NUMBER
: o número do projeto que contém o pool de Identidade da carga de trabalhoPOOL_ID
: o ID do pool de identidade da carga de trabalhoSUBJECT
: o valor esperado do atributo mapeado paragoogle.subject
GROUP
: o valor esperado do atributo mapeado paragoogle.groups
ATTRIBUTE_NAME
: o nome de um atributo personalizado no seu mapeamento de atributosATTRIBUTE_VALUE
: o valor do atributo personalizado no seu mapeamento de atributos
É possível conceder papéis em qualquer recurso do Google Cloud compatível com políticas de permissão do IAM.
Identidade temporária de conta de serviço
Para criar uma conta de serviço para a carga de trabalho externa, faça isto:
Enable the IAM, Security Token Service, and Service Account Credentials APIs.
Crie uma conta de serviço que represente a carga de trabalho. Recomendamos que você use 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 Identidade da carga de trabalho, mas você precisa se referir ao projeto que contém a conta de serviço.
Conceda à conta de serviço acesso a recursos que você quer que as identidades externas acessem.
Conceda a função do usuário de Identidade da carga de trabalho (
roles/iam.workloadIdentityUser
) à conta de serviço:
Para conceder acesso a uma identidade federada usando a identidade temporária de conta de serviço pelo console do Google Cloud ou pela gcloud CLI:
Console
Para usar o console do Google Cloud para conceder papéis do IAM a uma identidade federada com conta de serviço, faça isto:
Conta de serviço no mesmo projeto
Para conceder acesso usando a identidade temporária de conta de serviço no mesmo projeto, faça o seguinte:
Acesse a página pools de Identidade da carga de trabalho.
Selecione Conceder acesso.
Na caixa de diálogo Conceder acesso à conta de serviço, selecione Conceder acesso usando a identidade temporária de conta de serviço.
Na lista Contas de serviço, selecione a conta de serviço para as identidades externas que serão representadas e faça isto:
Para escolher quais identidades no pool podem representar a conta de serviço, realize uma das seguintes ações:
Para permitir que apenas identidades específicas do pool de Identidade da carga de trabalho representem 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
google.subject=assertion.sub
de mapeamento de atributos, defina o nome do Atributo comsubject
e o Valor do atributo com o valor da declaraçãosub
em tokens emitidos pelo seu provedor de identidade externo.
Para salvar a configuração, clique em Salvar e em Dispensar.
Conta de serviço em um projeto diferente
Para conceder acesso usando a identidade temporária de conta de serviço em um projeto diferente, faça o seguinte:
Acesse a página Contas de serviço.
Selecione a conta de serviço que você quer representar.
Clique em Gerenciar acesso.
Clique em Adicionar principal.
No campo Novo principal, insira um dos seguintes identificadores principais para as identidades no pool que vão representar a identidade da conta de serviço.
Por assunto
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
Substitua:
PROJECT_NUMBER
: o número do projetoPOOL_ID
: o ID do pool de carga de trabalhoSUBJECT
: o sujeito individual mapeado do IdP, por exemplo,administrator@example.com
Por grupo
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
Substitua:
PROJECT_NUMBER
: o número do projetoWORKLOAD_POOL_ID
: o ID do pool de carga de trabalhoGROUP
: o grupo mapeado do 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:
PROJECT_NUMBER
: o número do projetoWORKLOAD_POOL_ID
: o ID do pool de carga de trabalhoATTRIBUTE_NAME
: um dos atributos que foi mapeado do IdPATTRIBUTE_VALUE
: o valor do atributo
Por pool
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
Substitua:
PROJECT_NUMBER
: o número do projetoWORKLOAD_POOL_ID
: o ID do pool de carga de trabalho
Em Selecionar um papel, selecione a função de usuário da Identidade da carga de trabalho (
roles/iam.workloadIdentityUser
).Para salvar a configuração, clique em Salvar.
gcloud
Para usar a gcloud CLI para conceder o papel Usuário de Identidade da carga de trabalho (
roles/iam.workloadIdentityUser
) a identidades externas que atendam a determinados critérios, execute o comando a seguir.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çoPROJECT_NUMBER
: o número do projeto que contém o pool de Identidade da carga de trabalhoPOOL_ID
: o ID do pool de identidade da carga de trabalhoSUBJECT
: o valor esperado do atributo mapeado paragoogle.subject
GROUP
: o valor esperado do atributo mapeado paragoogle.groups
ATTRIBUTE_NAME
: o nome de um atributo personalizado no seu mapeamento de atributosATTRIBUTE_VALUE
: o valor do atributo personalizado no seu mapeamento de atributos
Baixar ou criar uma configuração de credencial
As bibliotecas de cliente do Cloud, a gcloud CLI 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
Para fazer o download de um arquivo de configuração de credenciais no console do Google Cloud, faça isto:
No Console do Google Cloud, acesse a página Pools de Identidades da carga de trabalho.
Encontre o pool de Identidade da carga de trabalho para o IdP que você quer usar e clique nele.
Se você escolheu usar o acesso direto a recursos, faça isto:
Clique em Conceder acesso.
Selecione Conceder acesso usando identidades federadas (recomendado).
Clique em Fazer download.
Continue com as instruções na caixa de diálogo Configurar seu aplicativo, mais tarde neste procedimento.
Se você escolheu usar a identidade temporária de conta de serviço, faça isto:
Selecione Contas de serviço conectadas.
Encontre a conta de serviço que você quer usar e clique em
Download.Continue com as instruções na caixa de diálogo Configurar seu aplicativo, mais tarde neste procedimento.
Na caixa de diálogo Configurar seu aplicativo, selecione o provedor que contém as identidades externas.
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
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 trabalhoPOOL_ID
: o ID do pool de Identidade da carga de trabalhoPROVIDER_ID
: o ID do provedor do pool de Identidade da carga de trabalhoSERVICE_ACCOUNT_EMAIL
: se você usa a identidade temporária de conta de serviço, substitua pelo endereço de e-mail da conta de serviço. Omita essa flag se você não usa a identidade temporária de conta de serviço.SERVICE_ACCOUNT_TOKEN_LIFETIME
: se você usa a identidade temporária de conta de serviço, substitua pelo ciclo de vida do token de acesso à conta de serviço, em segundos. Quando não informado, o padrão é uma hora. Omita essa flag se você não usa a identidade temporária de conta de serviço. Para especificar um ciclo de vida com mais de uma hora, configure a restrição da política organizacionalconstraints/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 comandogcloud 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
ouAWS_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 Identidade da carga de trabalhoPOOL_ID
: o ID do pool de Identidade da carga de trabalhoPROVIDER_ID
: o ID do provedor do pool de Identidade da carga de trabalhoSERVICE_ACCOUNT_EMAIL
: se você usa a identidade temporária de conta de serviço, substitua pelo endereço de e-mail da conta de serviço. Omita essa flag se você não usa a identidade temporária de conta de serviço.APPLICATION_ID_URI
: o URI do ID do aplicativo do Azure.SERVICE_ACCOUNT_TOKEN_LIFETIME
: se você usa a identidade temporária de conta de serviço, substitua pelo ciclo de vida do token de acesso à conta de serviço, em segundos. Quando não informado, o padrão é uma hora. Omita essa flag se você não usa a identidade temporária de conta de serviço. Para especificar um ciclo de vida com mais de uma hora, configure a restrição da política organizacionalconstraints/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:
Inicialize uma variável de ambiente
GOOGLE_APPLICATION_CREDENTIALS
e aponte-a para o arquivo de configuração de credenciais:Bash
em queexport GOOGLE_APPLICATION_CREDENTIALS=`pwd`/FILEPATH.json
FILEPATH
é o caminho relativo do arquivo de configuração de credenciais.PowerShell
em que$env:GOOGLE_APPLICATION_CREDENTIALS = Resolve-Path 'FILEPATH.json'
FILEPATH
é o caminho relativo do arquivo de configuração de credenciais.Use uma biblioteca de cliente ou ferramenta compatível com a federação de identidade da carga de trabalho e que possa encontrar credenciais automaticamente:
C++
As bibliotecas de cliente do Google Cloud para C++ são compatíveis com a federação de identidade da carga de trabalho desde a versão v2.6.0. Para usar a federação de identidade da carga de trabalho, crie as bibliotecas de cliente com a versão 1.36.0 ou mais recente do gRPC.
Go
As bibliotecas de cliente do Go são compatíveis com a federação de identidade da carga de trabalho 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 da carga de trabalho 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 da 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 queGoogleAuth
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 oREADME
do pacotegoogle-auth-library
.Python
As bibliotecas de cliente do Python são compatíveis com a federação de identidade da carga de trabalho 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 pacotegoogle-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 para o arquivo de configuração de credencial.O suporte para a federação de identidade da carga de trabalho na gcloud CLI está disponível na versão 363.0.0 e posteriores da gcloud CLI.
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" } } }
bq
Para autenticar usando a federação de identidade da carga de trabalho, use o comando
gcloud auth login
da seguinte maneira:gcloud auth login --cred-file=FILEPATH.json
Substitua
FILEPATH
pelo caminho para o arquivo de configuração de credencial.O suporte para a federação de identidade da carga de trabalho no bq está disponível na versão 390.0.0 e posteriores da gcloud CLI.
Se não for possível usar uma biblioteca de cliente compatível com a federação de identidade da carga de trabalho, faça a autenticação de forma programática 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:
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.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 emGetCallerIdentity()
, com o corpo de uma solicitaçãoGetCallerIdentity()
padrão anexado como parâmetros de consulta. Por exemplo,https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15
. Recomendamos que você use endpoints STS regionais e projete uma infraestrutura confiável para suas cargas de trabalho. Para mais informações, consulte Endpoints STS regionais da AWS.method
: o método de solicitação HTTPPOST
.headers
: os cabeçalhos da solicitação HTTP, que precisam incluir:Authorization
: a assinatura da solicitação.host
: nome do host do campourl
, 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 prefixohttps:
. Por 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 de segurança temporárias.
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: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 tokenGetCallerIdentity
codificado da URL que foi gerado pelo script.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.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 trabalhoPOOL_ID
: ID do pool de identidades da carga de trabalhoPROVIDER_ID
: ID do provedor do pool de identidades de carga de trabalho
Se você usa a identidade temporária de conta de serviço, use o token do Security Token Service para invocar o método
generateAccessToken
da API Service Account Credentials do IAM para receber um token de acesso:
Tokens para serviços do Cloud Run
Ao acessar um serviço do Cloud Run, você precisa 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:
-
SERVICE_ACCOUNT_EMAIL
: o endereço de e-mail da conta de serviço. -
SERVICE_URL
: o URL do serviço, por exemplo,https://my-service-12345-us-central1.run.app
. Também é possível definir o endpoint do atendimento ao cliente. Para mais informações, consulte Noções básicas sobre públicos-alvo personalizados.
Tokens para outras plataformas
Ao acessar outro serviço, use um token 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:
-
SERVICE_ACCOUNT_EMAIL
: o endereço de e-mail da conta de serviço.
A seguir
- Leia mais sobre a federação de identidade da carga de trabalho.
- Conheça as práticas recomendadas para usar a federação de identidade da carga de trabalho.
- Veja como gerenciar pools e provedores de identidade de carga de trabalho.
Exceto em caso de indicação contrária, o conteúdo desta página é licenciado de acordo com a Licença de atribuição 4.0 do Creative Commons, e as amostras de código são licenciadas de acordo com a Licença Apache 2.0. Para mais detalhes, consulte as políticas do site do Google Developers. Java é uma marca registrada da Oracle e/ou afiliadas.
Última atualização 2024-12-22 UTC.