Esta página mostra como configurar as suas aplicações para autenticação em Google Cloud APIs como a API Compute Engine ou a API AI Platform a partir de frotas que têm um modelo de confiança partilhado na frota. Se a sua frota tiver um modelo de confiança mista na frota, consulte o artigo Autenticar em Google Cloud APIs a partir de cargas de trabalho de frotas de confiança mista (Pré-visualização).
Esta página destina-se a administradores e operadores da plataforma, bem como a engenheiros de segurança que pretendem autenticar programaticamente a partir de cargas de trabalho da frota para Google Cloud APIs. Para saber mais acerca das funções de utilizador e das tarefas de exemplo a que fazemos referência na Google Cloud documentação, consulte Funções e tarefas comuns de utilizador do GKE.
Antes de ler esta página, certifique-se de que conhece os seguintes conceitos:
- Acerca da federação de identidades da carga de trabalho da frota
- ConfigMaps do Kubernetes
- Políticas de autorização da gestão de identidade e de acesso (IAM)
Acerca da federação de identidade da carga de trabalho da frota para ambientes de confiança partilhada
A federação do Workload Identity da frota permite-lhe autenticar a partir de cargas de trabalho da frota para Google Cloud APIs através de mecanismos de autenticação Google Cloud incorporados e do Kubernetes. A Federação de identidades de workload da frota elimina a necessidade de usar métodos menos seguros, como montar tokens de acesso em pods ou armazenar credenciais de longa duração.
Por predefinição, o projeto anfitrião da frota usa um conjunto de identidades de carga de trabalho gerido pela Google para aprovisionar identidades para entidades na frota. Qualquer entidade na frota ou no projeto anfitrião da frota que tenha o mesmo identificador IAM é considerada a mesma coisa pelo IAM. Esta igualdade de identidade implícita é útil quando concede acesso em grande escala em ambientes de fidedignidade partilhada, como frotas de inquilino único, onde não importa se outras entidades recebem involuntariamente autorizações semelhantes nos recursos.
Antes de começar
Certifique-se de que tem as seguintes ferramentas de linha de comandos instaladas:
- A versão mais recente da CLI do Google Cloud, que inclui o
gcloud
, a ferramenta de linha de comandos para interagir com Google Cloud. kubectl
Se estiver a usar o Cloud Shell como ambiente de shell para interagir com o Google Cloud, estas ferramentas são instaladas automaticamente.
- A versão mais recente da CLI do Google Cloud, que inclui o
Certifique-se de que inicializou a CLI gcloud para utilização com o seu projeto.
Prepare os seus clusters
Antes de as aplicações na sua frota poderem receber uma identidade federada, os clusters em que são executadas têm de estar registados na sua frota e configurados corretamente para usar a Federação de identidades de cargas de trabalho da frota. As secções seguintes descrevem como configurar a Federação de identidades de cargas de trabalho da frota para diferentes tipos de clusters.
GKE
Para clusters do GKE, faça o seguinte:
- Ative a Workload Identity Federation para o GKE no seu cluster do Google Kubernetes Engine, se ainda não estiver ativada.
- Registe o cluster na frota.
Também pode ativar a federação de identidade da carga de trabalho para o GKE durante o processo de criação do cluster e registo da frota.
Clusters fora de Google Cloud
Os seguintes tipos de clusters ativam automaticamente a Federação de identidades de cargas de trabalho e são registados na sua frota durante a criação do cluster:
- Google Distributed Cloud (apenas software) no VMware
- Google Distributed Cloud (apenas software) em bare metal
- GKE no AWS
- GKE no Azure
Clusters anexados
Os clusters anexados do EKS e do AKS registados através da API GKE Multi-Cloud são registados com a Workload Identity Federation da frota ativada por predefinição. Outros clusters anexados podem ser registados com a Workload Identity Federation da frota ativada se cumprirem os requisitos necessários. Siga as instruções para o seu tipo de cluster em Registar um cluster.
Use a federação de identidade da carga de trabalho da frota em aplicações
Os passos seguintes mostram como configurar uma carga de trabalho num cluster registado para usar a Workload Identity Federation da frota:
Encontre o nome do Workload Identity Pool e do fornecedor de identidade do cluster:
gcloud container fleet memberships describe MEMBERSHIP_ID \ --project=FLEET_PROJECT_ID \ --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
Substitua o seguinte:
MEMBERSHIP_ID
: o nome do membro do cluster. Este é, muitas vezes, o nome do seu cluster.FLEET_PROJECT_ID
: o ID do projeto do projeto anfitrião do grupo de veículos.
O resultado é semelhante ao seguinte:
IDENTITY_PROVIDER: IDENTITY_PROVIDER WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_ID
Este resultado contém as seguintes informações:
IDENTITY_PROVIDER
: o fornecedor de identidade do cluster.MEMBERSHIP_LOCATION
: a localização da subscrição da frota. Normalmente, é igual à localização do cluster.WORKLOAD_IDENTITY_POOL
: o nome do Workload Identity Pool associado à sua frota. Este valor tem a sintaxeFLEET_PROJECT_ID.svc.id.goog
.
Crie um espaço de nomes do Kubernetes. Também pode usar qualquer espaço de nomes existente, incluindo o espaço de nomes
default
.kubectl create namespace NAMESPACE
Substitua
NAMESPACE
pelo nome do espaço de nomes.Crie uma nova ServiceAccount do Kubernetes no espaço de nomes. Também pode usar qualquer ServiceAccount existente, incluindo o ServiceAccount
default
no espaço de nomes.kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
Substitua
KSA_NAME
pelo nome da ServiceAccount.Guarde o seguinte manifesto como
adc-config-map.yaml
. Este 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" } }
Implemente o ConfigMap:
kubectl create -f adc-config-map.yaml
Guarde 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 implementa esta carga de trabalho, o volume
gcp-ksa
no pod contém os seguintes dados:- Os dados no ConfigMap que implementou como um ficheiro denominado
google-application-credentials.json
. Este ficheiro é um ficheiro de configuração de credenciais da ADC. - O token ServiceAccount do Kubernetes como
token
. O Kubernetes monta um JWT assinado para a conta de serviço como um ficheiro de token de conta de serviço projetado.
O contentor no pod monta o volume
gcp-ksa
no caminho/var/run/secrets/tokens/gcp-ksa
e configura o ADC para procurar o ficheiro JSON de configuração de credenciais nesse caminho.- Os dados no ConfigMap que implementou como um ficheiro denominado
Implemente a carga de trabalho:
kubectl apply -f workload-config.yaml
Alternativa: use a identidade de uma conta de serviço do IAM
Em alternativa, pode configurar contas de serviço do Kubernetes nos seus clusters para se fazerem passar por contas de serviço do IAM e realizar quaisquer ações autorizadas que as contas de serviço do IAM possam realizar. Esta abordagem pode aumentar os custos gerais de manutenção, porque tem de gerir as associações de contas de serviço no IAM e no Kubernetes.
Na maioria dos cenários, recomendamos que faça referência diretamente aos principais do Kubernetes nas políticas de autorização da IAM para conceder acesso aosGoogle Cloud recursos seguindo as instruções em Use a federação de identidade de cargas de trabalho da frota em aplicações.
Encontre o nome do Workload Identity Pool e do fornecedor de identidade do cluster:
gcloud container fleet memberships describe MEMBERSHIP_ID \ --project=FLEET_PROJECT_ID \ --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
Substitua o seguinte:
MEMBERSHIP_ID
: o nome do membro do cluster. Este é, muitas vezes, o nome do seu cluster.FLEET_PROJECT_ID
: o ID do projeto do projeto anfitrião do grupo de veículos.
O resultado é semelhante ao seguinte:
IDENTITY_PROVIDER: IDENTITY_PROVIDER WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_ID
Este resultado contém as seguintes informações:
IDENTITY_PROVIDER
: o fornecedor de identidade do cluster.MEMBERSHIP_LOCATION
: a localização da subscrição. Normalmente, é igual à localização do cluster.WORKLOAD_IDENTITY_POOL
: o nome do Workload Identity Pool associado à sua frota. Este valor tem a sintaxeFLEET_PROJECT_ID.svc.id.goog
.
Crie uma conta de serviço da IAM que a sua aplicação possa representar. Também pode usar qualquer conta de serviço do IAM existente.
gcloud iam service-accounts create IAM_SA_NAME \ --project=IAM_SA_PROJECT_ID
Substitua o seguinte:
IAM_SA_NAME
: o nome da sua conta de serviço de IAM.IAM_SA_PROJECT_ID
: o ID do projeto que contém a sua conta de serviço de IAM. Este pode ser diferente do projeto anfitrião da sua frota.
Conceda à conta de serviço do IAM todas as autorizações de que necessita para aceder às Google Cloud APIs adicionando as políticas de autorização do IAM necessárias. Pode fazê-lo através de
gcloud iam service-accounts add-iam-policy-binding
ou outro método. Pode saber que autorizações são necessárias para usar as Google Cloud APIs na documentação de cada serviço e ver uma lista completa de funções predefinidas com as autorizações necessárias em Compreender as funções.Crie uma conta de serviço do Kubernetes num espaço de nomes. Também pode usar uma conta de serviço do Kubernetes existente e qualquer espaço de nomes, incluindo a conta de serviço
default
e o espaço de nomesdefault
.kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
Substitua o seguinte:
KSA_NAME
: o nome da ServiceAccount.NAMESPACE
: o nome do espaço de nomes.
Crie uma política de autorização da IAM que permita a uma conta de serviço do Kubernetes num espaço de nomes específico no seu cluster representar a conta de serviço da 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 Workload Identity Pool.Guarde o seguinte manifesto como
adc-config-map.yaml
. Este 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 o seguinte:
IAM_SA_NAME
: o nome da conta de serviço de IAM cuja identidade vai ser usada.IAM_SA_PROJECT_ID
: o ID do projeto da conta de serviço de IAM.
Guarde 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 implementa esta carga de trabalho, o volume
gcp-ksa
no pod contém os seguintes dados:- Os dados no ConfigMap que implementou como um ficheiro denominado
google-application-credentials.json
. Este ficheiro é um ficheiro de configuração de credenciais da ADC. - O token ServiceAccount do Kubernetes como
token
. O Kubernetes monta um JWT assinado para a conta de serviço como um ficheiro de token de conta de serviço projetado.
O contentor no pod monta o volume
gcp-ksa
no caminho/var/run/secrets/tokens/gcp-ksa
e configura o ADC para procurar o ficheiro JSON de configuração de credenciais nesse caminho.- Os dados no ConfigMap que implementou como um ficheiro denominado
Implemente a carga de trabalho:
kubectl apply -f workload-config.yaml
Valide a configuração da federação de identidade da carga de trabalho da frota
Nesta secção, cria um contentor do Cloud Storage e acede ao mesmo a partir de um pod que usa a Workload Identity Federation da frota. Antes de executar estes passos, certifique-se de que configurou a Workload Identity Federation seguindo as instruções na secção Use a Workload Identity Federation em aplicações.
Esta secção não mostra como validar a Workload Identity Federation através do método de simulação da conta de serviço do IAM.
Encontre o número do projeto numérico:
gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)"
O resultado é semelhante ao seguinte:
1234567890
Crie um contentor do Cloud Storage:
gcloud storage buckets create gs://FLEET_PROJECT_ID-test-bucket \ --location=LOCATION
Substituir
LOCATION
por uma Google Cloud localização.Crie uma política de autorização de IAM que conceda acesso ao contentor à conta de serviço que criou:
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 o seguinte:
FLEET_PROJECT_NUMBER
: o número do projeto numérico.FLEET_PROJECT_ID
: o ID do seu projeto.NAMESPACE
: o nome do namespace do Kubernetes que executa o seu pod da secção anterior.KSA_NAME
: o nome da Kubernetes ServiceAccount que o seu pod da secção anterior usa.
Crie uma sessão de shell no seu Pod:
kubectl exec -it pods/my-pod --namespace=NAMESPACE -- /bin/bash
Tente listar os objetos no contentor:
curl -X GET -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://storage.googleapis.com/storage/v1/b/FLEET_PROJECT_ID-test-bucket/o"
O resultado é o seguinte:
{ "kind": "storage#objects" }
Autentique a partir do seu código
Quando usa as bibliotecas cliente do Google Cloud, as bibliotecas de autenticação usam automaticamente o ADC para procurar credenciais para autenticar em serviços Google Cloud . Tem de usar bibliotecas de cliente da Google Cloud que suportem a Workload Identity Federation. Segue-se a indicação das versões mínimas necessárias das bibliotecas de cliente da Google Cloud, bem como instruções sobre como verificar a sua versão atual:
C++
A maioria das
Google Cloud bibliotecas de cliente para C++
suporta a federação de identidades através da utilização de um objeto ChannelCredentials
, que é
criado através da chamada de grpc::GoogleDefaultCredentials()
. Para inicializar esta credencial, tem de criar as bibliotecas de cliente com a versão 1.36.0 ou posterior do gRPC.
A biblioteca cliente do Cloud Storage para C++ usa a API REST, não o gRPC, pelo que não suporta a federação de identidades.
Go
As bibliotecas cliente para Go suportam a federação de identidades 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 federação de identidades 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 cliente para Node.js suportam a federação de identidades 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 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
.
O que se segue?
Saiba quais são as práticas recomendadas para organizar as suas frotas quando usa a Workload Identity Federation de frotas.