Nesta página, mostramos como configurar seus aplicativos para autenticação nas APIs do Google Cloud, como a API Compute Engine ou a API AI Platform, usando a Federação de Identidade da Carga de Trabalho da frota.
O que é a federação de identidade da carga de trabalho da frota?
A Federação de identidade da carga de trabalho permite que as cargas de trabalho nos clusters sejam autenticadas no Google Cloud sem que você precise fazer o download, alternar manualmente e gerenciar credenciais. Em vez disso, as cargas de trabalho são autenticadas usando tokens de curta duração gerados pelo Google Cloud.
A federação de identidade da carga de trabalho para o GKE fornece um pool de identidade da carga de trabalho em todo o projeto, do qual os aplicativos em execução nos clusters do GKE recebem identidades. A federação de identidade da carga de trabalho da frota estende a federação de identidade da carga de trabalho para o GKE a todos os clusters de membros da frota, independentemente de estarem em projetos diferentes ou fora do Google Cloud. Os clusters registrados com a federação de identidade da carga de trabalho ativada na assinatura da frota recebem identidades usando um pool de identidades de carga de trabalho em toda a frota, que permite configurar a autenticação nas APIs do Google Cloud e em outros serviços em toda a frota, até mesmo em vários projetos.
O agente do Connect também pode usar a Federação de identidade da carga de trabalho da frota em alguns tipos de cluster para autenticação no Google como parte da associação da frota. Ela também é necessária para usar alguns recursos do GKE Enterprise que funcionam em vários projetos, como o Cloud Service Mesh.
Pools de federação de identidade da carga de trabalho e identidade idêntica
Com a federação de identidade da carga de trabalho da frota, cada aplicativo na frota recebe uma identidade federada distinta que pode ser usada para autenticação no Google Cloud e em outros serviços que você desenvolve. Os aplicativos recebem um identificador principal que o IAM pode reconhecer. Esse identificador usa a seguinte sintaxe:
PREFIX://iam.googleapis.com/projects/FLEET_PROJECT_NUMBER/locations/global/workloadIdentityPools/FLEET_PROJECT_ID.svc.id.goog/SELECTOR
Essa sintaxe tem os seguintes campos:
PREFIX
: oprincipal
ouprincipalSet
do IAM, dependendo do recurso selecionado.FLEET_PROJECT_ID.svc.id.goog
: o pool de identidade da carga de trabalho da frota. Cada frota tem um único pool de identidade de carga de trabalho fixo criado para você.FLEET_PROJECT_NUMBER
: o número do projeto host da frota.SELECTOR
: o seletor de recursos. Para uma lista de seletores compatíveis, consulte Identificadores principais compatíveis.
A frota inteira compartilha um pool de identidade da carga de trabalho da frota. Assim, você pode conceder a aplicativos em qualquer lugar da frota, incluindo em outros projetos ou nuvens, acesso aos mesmos recursos sem precisar gerenciar esse acesso para cada cluster. Assim como outros recursos ativados para a frota, a Federação de identidade de carga de trabalho da frota depende do princípio da semelhança, em que objetos do Kubernetes com o mesmo nome e namespace em clusters diferentes são tratados como a mesma coisa.
Por exemplo, se você tiver um aplicativo com um back-end implantado em vários
clusters na mesma frota e que precisa ser autenticado em uma API do Google Cloud,
será fácil configurá-lo para que todas as cargas de trabalho no namespace backend
possam acessar essa API. Para mais informações sobre como as frotas usam a semelhança,
incluindo a identidade, consulte
Como as frotas funcionam.
Depois de ativar a federação de identidade da carga de trabalho da frota, é possível fazer referência a principais na frota em políticas de permissão do IAM especificando o identificador principal correspondente. Por exemplo, você pode fazer referência a um ServiceAccount específico em um namespace específico do Kubernetes na sua política de permissão. Todos os aplicativos que usam essa conta de serviço podem acessar o recurso do Google Cloud a que a política de permissão do IAM se aplica.
Fluxo de credenciais
Para permitir que aplicativos em um namespace específico se autentiquem usando a federação de identidade da carga de trabalho da frota, faça o seguinte:
Implante um ConfigMap nesse namespace com as seguintes informações:
- O pool de identidade da carga de trabalho e o provedor de identidade do cluster.
- O caminho em cada pod em que o Kubernetes monta um token da conta de serviço. Esse token é um JSON Web Token (JWT) assinado.
Esse ConfigMap funciona como o arquivo de credenciais padrão do aplicativo (ADC) para cargas de trabalho.
Crie uma política de permissão do IAM que conceda acesso a recursos específicos do Google Cloud ao identificador principal nos clusters, como uma conta de serviço no namespace.
Verifique se a carga de trabalho no namespace tem as seguintes configurações na especificação do pod:
- A variável de ambiente
GOOGLE_APPLICATION_CREDENTIALS
definida como o caminho de montagem do ConfigMap no pod. - Um volume projetado que contém o token da conta de serviço e o ConfigMap que você criou, montado no mesmo caminho especificado na variável de ambiente
GOOGLE_APPLICATION_CREDENTIALS
. - Uma montagem de volume no contêiner que faz referência ao volume projetado.
- A variável de ambiente
Quando a carga de trabalho faz uma chamada para a API do Google Cloud, as seguintes etapas acontecem:
- As bibliotecas de autenticação do Google Cloud usam credenciais padrão
do aplicativo (ADC) para encontrar credenciais. O ADC verifica o caminho que você
especificou na variável de ambiente
GOOGLE_APPLICATION_CREDENTIALS
para procurar um token de autenticação. - A biblioteca de autenticação ADC usa os dados no ConfigMap para trocar o JWT da conta de serviço que você montou no pod por um token federado de curta duração do Serviço de token de segurança que faz referência ao identificador principal da carga de trabalho.
- O ADC inclui o token federado com a solicitação da API.
- A política de permissão do IAM autoriza o identificador principal a realizar a operação solicitada no recurso do Google Cloud.
Identificadores principais com suporte para a federação de identidade da carga de trabalho da frota
A tabela a seguir descreve os seletores que podem ser usados em políticas de permissão do IAM para referenciar principais em frotas:
Tipo de identificador principal | Sintaxe |
---|---|
Todos os pods que usam uma conta de serviço específica do Kubernetes | Selecione a conta de serviço pelo nome:
principal://iam.googleapis.com/projects/ Substitua:
Selecionar a ServiceAccount pelo UID: principal://iam.googleapis.com/projects/ Substitua:
|
Antes de começar
Verifique se você tem as seguintes ferramentas de linha de comando instaladas:
- A versão mais recente da Google Cloud CLI, que inclui
gcloud
, a ferramenta de linha de comando para interagir com o Google Cloud. kubectl
Se você estiver usando o Cloud Shell como ambiente shell para interagir com o Google Cloud, essas ferramentas estarão instaladas.
- A versão mais recente da Google Cloud CLI, que inclui
Verifique se você inicializou a CLI gcloud para usar com seu projeto.
Prepare seus clusters
Antes que os aplicativos da sua frota recebam uma identidade federada, os clusters em que eles são executados precisam ser registrados para sua frota e configurados corretamente para usar a federação de identidade da carga de trabalho da frota. As seções a seguir descrevem como configurar a federação de identidade da carga de trabalho da frota para diferentes tipos de clusters.
GKE
Para clusters do GKE, faça o seguinte:
- Ative a federação de identidade da carga de trabalho do GKE no cluster do Google Kubernetes Engine, se ela ainda não estiver ativada.
- Registre o cluster na frota.
Também é possível ativar a federação de identidade da carga de trabalho para o GKE durante o processo de criação de cluster e registro de frota.
Clusters fora do Google Cloud
Os seguintes tipos de cluster ativam automaticamente a Federação de identidade da carga de trabalho da frota e são registrados na frota durante a criação do cluster:
- Google Distributed Cloud (somente software) no VMware
- Google Distributed Cloud (somente software) em bare metal
- GKE na AWS
- GKE no Azure
Clusters anexados
Os clusters anexados do EKS e do AKS registrados usando a GKE Multi-cloud são registrados com a federação de identidade da carga de trabalho da frota ativada por padrão. Os clusters anexados podem ser registrados com a federação de identidade da carga de trabalho da frota ativada se atenderem aos requisitos necessários. Siga as instruções para o tipo de cluster em Como registrar um cluster.
Usar a federação de identidade da carga de trabalho da frota em aplicativos
As etapas a seguir mostram como configurar uma carga de trabalho em um cluster registrado para usar a federação de identidade da carga de trabalho da frota:
Encontre o nome do pool de identidades e do provedor de identidade da carga de trabalho do cluster:
gcloud container fleet memberships describe MEMBERSHIP_ID \ --project=FLEET_PROJECT_ID \ --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
Substitua:
MEMBERSHIP_ID
: o nome da assinatura do cluster. Geralmente é o nome do cluster.FLEET_PROJECT_ID
: o ID do projeto host da frota.
O resultado será assim:
IDENTITY_PROVIDER: IDENTITY_PROVIDER WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_ID
Essa saída contém as seguintes informações:
IDENTITY_PROVIDER
: o provedor de identidade do cluster.MEMBERSHIP_LOCATION
: o local da assinatura da frota. Geralmente, é igual ao local do cluster.WORKLOAD_IDENTITY_POOL
: o nome do pool de identidade da carga de trabalho associado à sua frota. Esse valor tem a sintaxeFLEET_PROJECT_ID.svc.id.goog
.
Crie um namespace do Kubernetes. Também é possível usar qualquer namespace existente, incluindo o namespace
default
.kubectl create namespace NAMESPACE
Substitua
NAMESPACE
pelo nome do namespace.Crie uma nova conta de serviço do Kubernetes no namespace: Também é possível usar qualquer ServiceAccount atual, incluindo a
default
no namespace.kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
Substitua
KSA_NAME
pelo nome da conta de serviço.Salve o seguinte manifesto
adc-config-map.yaml
como : Esse ConfigMap contém a configuração do ADC para cargas de trabalho.kind: ConfigMap apiVersion: v1 metadata: namespace: NAMESPACE name: my-cloudsdk-config data: config: | { "type": "external_account", "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "credential_source": { "file": "/var/run/secrets/tokens/gcp-ksa/token" } }
Implante o ConfigMap:
kubectl create -f adc-config-map.yaml
Salve o seguinte manifesto como
workload-config.yaml
:apiVersion: v1 kind: Pod metadata: name: my-pod namespace: NAMESPACE spec: serviceAccountName: KSA_NAME containers: - name: sample-container image: google/cloud-sdk:slim command: ["sleep","infinity"] env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json volumeMounts: - name: gcp-ksa mountPath: /var/run/secrets/tokens/gcp-ksa readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 420 sources: - serviceAccountToken: path: token audience: WORKLOAD_IDENTITY_POOL expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json"
Quando você implanta essa carga de trabalho, o volume
gcp-ksa
no pod contém os seguintes dados:- Os dados no ConfigMap que você implantou como um arquivo chamado
google-application-credentials.json
. Esse arquivo é um arquivo de configuração de credenciais do ADC. - O token da conta de serviço do Kubernetes como
token
. O Kubernetes monta um JWT assinado para a conta de serviço como um arquivo de token de conta de serviço projetado.
O contêiner no pod monta o volume
gcp-ksa
no caminho/var/run/secrets/tokens/gcp-ksa
e configura o ADC para procurar o arquivo JSON de configuração de credenciais nesse caminho.- Os dados no ConfigMap que você implantou como um arquivo chamado
Implantar a carga de trabalho:
kubectl apply -f workload-config.yaml
Alternativa: representar uma conta de serviço do IAM
Como alternativa, é possível configurar as contas de serviço do Kubernetes nos clusters para imitar as contas de serviço do IAM e realizar todas as ações autorizadas que elas podem realizar. Essa abordagem pode aumentar a sobrecarga de manutenção, porque você precisa gerenciar os pares de contas de serviço no IAM e no Kubernetes.
Na maioria dos casos, recomendamos que você faça referência direta aos principais do Kubernetes nas políticas de permissão do IAM para conceder acesso aos recursos do Google Cloud seguindo as instruções em Usar a federação de identidade da carga de trabalho da frota em aplicativos.
Encontre o nome do pool de identidades e do provedor de identidade da carga de trabalho do cluster:
gcloud container fleet memberships describe MEMBERSHIP_ID \ --project=FLEET_PROJECT_ID \ --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
Substitua:
MEMBERSHIP_ID
: o nome da assinatura do cluster. Geralmente é o nome do cluster.FLEET_PROJECT_ID
: o ID do projeto host da frota.
O resultado será assim:
IDENTITY_PROVIDER: IDENTITY_PROVIDER WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_ID
Essa saída contém as seguintes informações:
IDENTITY_PROVIDER
: o provedor de identidade do cluster.MEMBERSHIP_LOCATION
: o local da assinatura. Geralmente, é igual ao local do cluster.WORKLOAD_IDENTITY_POOL
: o nome do pool de identidade da carga de trabalho associado à sua frota. Esse valor tem a sintaxeFLEET_PROJECT_ID.svc.id.goog
.
Crie uma conta de serviço do IAM que seu aplicativo possa imitar. Também é possível usar qualquer conta de serviço do IAM.
gcloud iam service-accounts create IAM_SA_NAME \ --project=IAM_SA_PROJECT_ID
Substitua:
IAM_SA_NAME
: o nome da sua conta de serviço do IAM.IAM_SA_PROJECT_ID
: o ID do projeto que contém sua conta de serviço do IAM. Ele pode ser diferente do seu projeto host da frota.
Conceda à conta de serviço do IAM todas as permissões necessárias para acessar as APIs do Google Cloud adicionando as políticas de permissão do IAM necessárias. Para isso, use
gcloud iam service-accounts add-iam-policy-binding
ou outro método. Descubra quais permissões são necessárias para usar as APIs do Google Cloud na documentação de cada serviço e consulte uma lista completa de papéis predefinidos com as permissões necessárias em Noções básicas sobre papéis.Crie uma conta de serviço do Kubernetes em um namespace. Também é possível usar uma Kubernetes ServiceAccount e qualquer namespace, incluindo a
default
ServiceAccount e o namespacedefault
.kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
Substitua:
KSA_NAME
: o nome da ServiceAccount.NAMESPACE
: o nome do namespace.
Crie uma política de permissão do IAM que permita que uma ServiceAccount do Kubernetes em um namespace específico no cluster personifique a conta de serviço do IAM:
gcloud iam service-accounts add-iam-policy-binding IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com \ --project=IAM_SA_PROJECT_ID \ --role=roles/iam.workloadIdentityUser \ --member="serviceAccount:WORKLOAD_IDENTITY_POOL[NAMESPACE/KSA_NAME]"
Substitua
WORKLOAD_IDENTITY_POOL
pelo nome do pool de identidade da carga de trabalho.Salve o seguinte manifesto
adc-config-map.yaml
como : Esse ConfigMap contém a configuração do ADC para cargas de trabalho.kind: ConfigMap apiVersion: v1 metadata: namespace: K8S_NAMESPACE name: my-cloudsdk-config data: config: | { "type": "external_account", "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/IAM_SA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com:generateAccessToken", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "credential_source": { "file": "/var/run/secrets/tokens/gcp-ksa/token" } }
Substitua:
IAM_SA_NAME
: o nome da conta de serviço do IAM a ser imitada.IAM_SA_PROJECT_ID
, o ID do projeto da conta de serviço do IAM.
Salve o seguinte manifesto como
workload-config.yaml
:apiVersion: v1 kind: Pod metadata: name: my-pod namespace: K8S_NAMESPACE spec: serviceAccountName: KSA_NAME containers: - name: my-container image: my-image command: ["sleep","infinity"] env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json volumeMounts: - name: gcp-ksa mountPath: /var/run/secrets/tokens/gcp-ksa readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 420 sources: - serviceAccountToken: path: token audience: WORKLOAD_IDENTITY_POOL expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json"
Quando você implanta essa carga de trabalho, o volume
gcp-ksa
no pod contém os seguintes dados:- Os dados no ConfigMap que você implantou como um arquivo chamado
google-application-credentials.json
. Esse arquivo é um arquivo de configuração de credenciais do ADC. - O token da conta de serviço do Kubernetes como
token
. O Kubernetes monta um JWT assinado para a conta de serviço como um arquivo de token de conta de serviço projetado.
O contêiner no pod monta o volume
gcp-ksa
no caminho/var/run/secrets/tokens/gcp-ksa
e configura o ADC para procurar o arquivo JSON de configuração de credenciais nesse caminho.- Os dados no ConfigMap que você implantou como um arquivo chamado
Implantar a carga de trabalho:
kubectl apply -f workload-config.yaml
Verificar a configuração da federação de identidade da carga de trabalho da frota
Nesta seção, você vai criar um bucket do Cloud Storage e acessá-lo em um pod que usa a federação de identidade da carga de trabalho da frota. Antes de realizar essas etapas, verifique se você configurou a federação de identidade da carga de trabalho seguindo as instruções na seção Usar a federação de identidade da carga de trabalho da frota em aplicativos.
Esta seção não mostra como verificar a federação de identidade da carga de trabalho usando o método de personificação da conta de serviço do IAM.
Encontre o número do projeto:
gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)"
O resultado será assim:
1234567890
Crie um bucket do Cloud Storage:
gcloud storage buckets create gs://FLEET_PROJECT_ID-test-bucket \ --location=LOCATION
Substitua
LOCATION
por um local do Google Cloud.Crie uma política de permissão do IAM que conceda acesso ao bucket à conta de serviço criada:
gcloud storage buckets add-iam-policy-binding gs://FLEET_PROJECT_ID-test-bucket \ --condition=None \ --role=roles/storage.objectViewer \ --member=principal://iam.googleapis.com/projects/FLEET_PROJECT_NUMBER/locations/global/workloadIdentityPools/FLEET_PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME
Substitua:
FLEET_PROJECT_NUMBER
: o número numérico do projeto.FLEET_PROJECT_ID
: o ID do projeto.NAMESPACE
: o nome do namespace do Kubernetes que executa seu pod da seção anterior.KSA_NAME
: o nome da ServiceAccount do Kubernetes que o pod da seção anterior usa.
Abra uma sessão do shell no pod:
kubectl exec -it pods/my-pod --namespace=NAMESPACE -- /bin/bash
Tente listar os objetos no bucket:
curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://storage.googleapis.com/storage/v1/b/test-bucket/o"
A saída é esta:
{ "kind": "storage#objects" }
Autenticar a partir do seu código
Quando você usa as bibliotecas de cliente do Cloud, as bibliotecas de autenticação usam automaticamente o ADC para procurar credenciais para autenticar nos serviços do Google Cloud. Use as bibliotecas de cliente do Cloud compatíveis com a federação de identidade da carga de trabalho. Veja a seguir o mínimo necessário de versões das bibliotecas de cliente do Cloud, além de instruções sobre como verificar a versão atual:
C++
A maioria das
bibliotecas de cliente do Google Cloud para C++
é compatível com a federação de identidade usando um objeto ChannelCredentials
, que é
criado chamando grpc::GoogleDefaultCredentials()
. Para inicializar essa
credencial, crie as bibliotecas de cliente com a versão 1.36.0 ou posteriores do
gRPC.
A biblioteca de cliente do Cloud Storage para C++ usa a API REST, não a gRPC. Portanto, ela não é compatível com a federação de identidade.
Go
As bibliotecas de cliente do Go são compatíveis com a federação de identidade se usarem a versão
v0.0.0-20210218202405-ba52d332ba99 ou posteriores do módulo golang.org/x/oauth2
.
Para verificar qual versão deste módulo sua biblioteca de cliente usa, execute os seguintes comandos:
cd $GOPATH/src/cloud.google.com/go
go list -m golang.org/x/oauth2
Java
As bibliotecas de cliente do Java aceitam federação de identidade se usarem a versão 0.24.0
ou posteriores do
artefato com.google.auth:google-auth-library-oauth2-http
.
Para verificar qual versão desse artefato a biblioteca de cliente usa, execute o seguinte comando do Maven no diretório do aplicativo:
mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http
Node.js
As bibliotecas de cliente do Node.js são compatíveis com a federação de identidade se usarem a versão
7.0.2 ou posteriores do
pacote google-auth-library
.
Para verificar qual versão desse pacote sua biblioteca de cliente usa, execute o seguinte comando no diretório do seu aplicativo:
npm list google-auth-library
Ao criar um objeto GoogleAuth
, é possível especificar um ID de projeto ou
permitir que GoogleAuth
encontre o ID do projeto automaticamente. Para encontrar o ID do projeto
automaticamente, a conta de serviço no arquivo de configuração precisa ter o
papel de navegador (roles/browser
), ou um papel com permissões equivalentes no
projeto. Para ver detalhes, consulte o
README
do pacote google-auth-library
.
Python
As bibliotecas de cliente do Python são compatíveis com a federação de identidade se usarem a versão
1.27.0 ou posteriores do
pacote google-auth
.
Para verificar qual versão desse pacote sua biblioteca de cliente usa, execute o seguinte comando no ambiente em que o pacote está instalado:
pip show google-auth
Para especificar um ID de projeto para o cliente de autenticação, defina a
variável de ambiente GOOGLE_CLOUD_PROJECT
ou permita que o cliente encontre
o ID do projeto automaticamente. Para encontrar o ID do projeto automaticamente, a conta de
serviço no arquivo de configuração precisa ter o papel de Navegador (roles/browser
)
ou um papel com permissões equivalentes no projeto. Para ver detalhes, consulte o
guia do usuário do pacote google-auth
.
A seguir
Conheça as práticas recomendadas para organizar suas frotas ao usar a federação de identidade da carga de trabalho da frota.