Sobre a federação de identidade da carga de trabalho para o GKE

Este documento descreve a federação de identidade da carga de trabalho para o GKE, incluindo como ela funciona, como a ativação afeta seus clusters do GKE e como conceder papéis a entidades do Kubernetes em políticas do Identity and Access Management. Na maioria dos casos, a federação de identidade da carga de trabalho para GKE é a maneira recomendada de proteger e gerenciar como suas cargas de trabalho executadas no GKE acessam os serviços do Google Cloud .

Este documento é destinado a especialistas e operadores de segurança que gerenciam cargas de trabalho no GKE que exigem acesso a outros serviços do Google Cloud. Para saber mais sobre papéis comuns e tarefas de exemplo que mencionamos no conteúdo do Google Cloud , consulte Tarefas e funções de usuário comuns do GKE.

Terminologia

Nesta página, diferenciamos as contas de serviço do Kubernetes das contas de serviço do Identity and Access Management (IAM).

Contas de serviço do Kubernetes
Recursos do Kubernetes que fornecem uma identidade para processos em execução nos pods do GKE.
Contas de serviço do IAM
Recursos do
Google Cloud que permitem que os aplicativos façam chamadas autorizadas para as APIs doGoogle Cloud .

O que é a federação de identidade da carga de trabalho do GKE?

Os aplicativos em execução no GKE talvez precisem de acesso às APIs doGoogle Cloud , como a API Compute Engine, a API BigQuery Storage ou as APIs Machine Learning.

A federação de identidade da carga de trabalho para GKE permite usar políticas do IAM para conceder às cargas de trabalho do Kubernetes no cluster do GKE acesso aGoogle Cloud APIs específicas sem precisar de configuração manual ou métodos menos seguros, como arquivos de chave da conta de serviço. O uso da federação de identidade da carga de trabalho para o GKE permite atribuir identidades e autorizações distintas e refinadas para cada aplicativo no cluster.

A federação de identidade da carga de trabalho do GKE substitui a necessidade de usar a ocultação de metadados. Os metadados confidenciais protegidos por Metadata Concealment também são protegidos pela federação de identidade da carga de trabalho para GKE.

A federação de identidade da carga de trabalho para GKE está disponível por meio da federação de identidade da carga de trabalho do IAM, que fornece identidades para cargas de trabalho executadas em ambientes dentro e fora do Google Cloud. É possível usar a federação de identidade da carga de trabalho do IAM para se autenticar com segurança nas APIs Google Cloud compatíveis de cargas de trabalho em execução, por exemplo, AWS, Azure e Kubernetes autogerenciado. No GKE, Google Cloud gerencia o pool de identidade e o provedor da carga de trabalho para você e não exige um provedor de identidade externo.

Como funciona a federação de identidade da carga de trabalho para o GKE

Quando você ativa a federação de identidade da carga de trabalho para o GKE em um cluster, o GKE faz o seguinte:

  • Cria um pool de identidade da carga de trabalho fixo para o projeto Google Cloud do cluster com o seguinte formato:

    PROJECT_ID.svc.id.goog
    

    O pool de identidades de carga de trabalho apresenta um formato de nomenclatura que permite que o IAM entenda e confie nas credenciais da conta de serviço do Kubernetes. O GKE não exclui esse pool de identidades de carga de trabalho mesmo que você exclua todos os clusters no seu projeto.

  • Registra o cluster do GKE como um provedor de identidade no pool de identidade da carga de trabalho.

  • Implanta o servidor de metadados do GKE, que intercepta solicitações de credenciais das cargas de trabalho em cada nó.

Criar políticas de permissão do IAM em recursos do Google Cloud

Para fornecer acesso com a federação de identidade da carga de trabalho para o GKE, crie uma política de permissão do IAM que conceda acesso a um recurso Google Cloud específico a um principal que corresponda à identidade do seu aplicativo. Por exemplo, é possível conceder permissões de leitura em um bucket do Cloud Storage para todos os pods que usam a conta de serviço database-reader do Kubernetes.

Para ver uma lista de recursos compatíveis com políticas de permissão, consulte Tipos de recursos que aceitam políticas de permissão.

Usar condições em políticas do IAM

Também é possível limitar o escopo do acesso definindo conditions nas políticas de permissão. As condições são um método extensível de especificação de quando uma política de permissão precisa ser aplicada. Por exemplo, é possível usar condições para conceder acesso temporário a uma carga de trabalho em um recurso específico do Google Cloud , eliminando a necessidade de gerenciar esse acesso manualmente.

As condições também podem ser úteis se você definir as políticas de permissão no nível do projeto, da pasta ou da organização em vez de recursos específicos, como segredos do Secret Manager ou buckets do Cloud Storage.

Para adicionar uma condição à sua política de permissão, use estes recursos:

Os exemplos de expressões a seguir são para cenários comuns em que você pode usar condições. Para uma lista de atributos disponíveis em expressões, consulte Referência de atributo para condições do IAM.

Exemplo de expressões condicionais
Permitir acesso antes do horário especificado
request.time < timestamp('TIMESTAMP')

Substitua TIMESTAMP por um carimbo de data/hora em UTC, como 2024-08-30T00:00:00.000Z.

Permitir acesso se o recurso na solicitação tiver a tag especificada
resource.matchTag('TAG_KEY', 'TAG_VALUE')

Substitua:

  • TAG_KEY: a chave da tag a ser correspondida, como env
  • TAG_VALUE: o valor da tag, como dev.

Referenciar recursos do Kubernetes nas políticas do IAM

Na política do IAM, você faz referência a um recurso do Kubernetes usando um identificador principal do IAM para selecionar o recurso. Esse identificador tem a seguinte sintaxe:

PREFIX://iam.googleapis.com/projects/1234567890/locations/global/workloadIdentityPools/example-project.svc.id.goog/SELECTOR

Neste exemplo, considere os seguintes campos:

  • PREFIX: precisa ser principal ou principalSet, dependendo do recurso selecionado. principal serve para um recurso específico, como uma única ServiceAccount. principalSet serve para vários recursos que pertencem ao recurso especificado, como todos os pods em um cluster específico.
  • SELECTOR: uma string que seleciona um tipo de principal. Por exemplo, kubernetes.serviceaccount.uid/SERVICEACCOUNT_UID seleciona uma ServiceAccount pelo UID.

A tabela a seguir mostra os tipos de principais compatíveis com o GKE:

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/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT

Substitua:

  • PROJECT_NUMBER: o número numérico do projeto. Para conseguir o número do projeto, consulte Identificar projetos.
  • PROJECT_ID: o ID do projeto Google Cloud .
  • NAMESPACE: o namespace do Kubernetes.
  • SERVICEACCOUNT: nome da conta de serviço do Kubernetes.

Selecionar a ServiceAccount pelo UID:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/kubernetes.serviceaccount.uid/SERVICEACCOUNT_UID

Substitua:

  • PROJECT_NUMBER: o número numérico do projeto. Para conseguir o número do projeto, consulte Identificar projetos.
  • PROJECT_ID: o ID do projeto Google Cloud .
  • SERVICEACCOUNT_UID: o UID do objeto ServiceAccount no servidor da API.
Todos os pods em um namespace, independentemente da conta de serviço ou do cluster
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/namespace/NAMESPACE

Substitua:

  • PROJECT_NUMBER: o número numérico do projeto. Para conseguir o número do projeto, consulte Identificar projetos.
  • PROJECT_ID: o ID do projeto Google Cloud .
  • NAMESPACE: o namespace do Kubernetes.
Todos os pods em um cluster específico
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/kubernetes.cluster/https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME

Substitua:

  • PROJECT_NUMBER: o número numérico do projeto. Para conseguir o número do projeto, consulte Identificar projetos.
  • PROJECT_ID: o ID do projeto Google Cloud .
  • CLUSTER_NAME: o nome do cluster do GKE.
  • LOCATION: o local do cluster.

Fluxo de credenciais

Quando uma carga de trabalho envia uma solicitação para acessar uma API Google Cloud , por exemplo, ao usar uma biblioteca de cliente Google Cloud , ocorrem as seguintes etapas de autenticação:

Como uma carga de trabalho recebe um token da conta de serviço do IAM com a Identidade da carga de trabalho.
Figura 1:como uma carga de trabalho recebe um token de acesso federado com a federação de identidade da carga de trabalho para o GKE.
  1. As credenciais padrão do aplicativo (ADC) solicitam um token de acesso Google Cloud do servidor de metadados do Compute Engine executado na VM.
  2. O servidor de metadados do GKE intercepta a solicitação de token e solicita ao servidor da API Kubernetes um token da conta de serviço do Kubernetes que identifique a carga de trabalho solicitante. Essa credencial é um JSON Web Token (JWT) assinado pelo servidor da API.
  3. O servidor de metadados do GKE usa o Serviço de token de segurança para trocar o JWT por um token de acesso federado de curta duração que faz referência à identidade da carga de trabalho do Kubernetes.

O token de acesso federado retornado pelo Security Token Service pode ter limitações ao tentar acessar alguns serviços do Google Cloud , conforme descrito em Produtos e limitações compatíveis. Se o serviço Google Cloud selecionado tiver limitações, você poderá configurar a personificação da conta de serviço. Esse método resulta em um token de acesso para uma conta de serviço do IAM que sua carga de trabalho pode usar para acessar o serviço de destino. Para mais detalhes, consulte vincular contas de serviço do Kubernetes ao IAM.

A carga de trabalho pode acessar as APIs do Google Cloud que o identificador do IAM principal da carga de trabalho pode acessar. Google Cloud

Cota da API Exchange Token no Security Token Service

A API Exchange Token no Security Token Service tem um limite de cota de 6.000 solicitações por minuto. Se você encontrar erros QUOTA_EXCEEDED, poderá solicitar um aumento na cota de Token exchange requests per minute na página Cotas e limites do sistema.

Semelhança de identidade

Se os metadados no identificador do principal forem os mesmos para cargas de trabalho em vários clusters que compartilham um pool de Identidade da carga de trabalho por pertencerem ao mesmo projeto Google Cloud , o IAM identificará essas cargas como sendo as mesmas. Por exemplo, se você tiver o mesmo namespace em dois clusters e conceder acesso a esse namespace no IAM, as cargas de trabalho nesse namespace em ambos os clusters terão esse acesso. É possível limitar esse acesso a clusters específicos usando políticas condicionais do IAM.

Por exemplo, considere o diagrama a seguir. Os clusters A e B pertencem ao mesmo pool de Identidade da carga de trabalho. Google Cloud identifica aplicativos que usam a ServiceAccount back-ksa no namespace backend do Cluster A e do Cluster B como a mesma identidade. O IAM não faz distinção entre os clusters que fazem as chamadas.

Diagrama ilustrando a semelhança de identidade em um pool de identidades de carga de trabalho
Figura 2 : semelhança de identidade ao acessar APIs do Google Cloud com a federação de identidade da carga de trabalho para o GKE.

Essa semelhança de identidade também significa que você precisa confiar em todos os clusters em um pool de identidades de carga de trabalho específico. Por exemplo, se um novo cluster, o Cluster C no exemplo anterior, fosse de uma equipe não confiável, ela poderia criar um namespace backend e acessar as APIs Google Cloud usando a ServiceAccount back-ksa, assim como os Clusters A e B.

Para evitar o acesso não confiável, coloque os clusters em projetos separados para garantir que eles tenham pools de identidade de carga de trabalho diferentes ou que os nomes de namespace sejam diferentes para evitar um identificador principal comum.

Servidor de metadados do GKE

Quando você ativa a federação de identidade da carga de trabalho para o GKE em um cluster, cada nó do cluster armazena metadados no servidor de metadados do GKE. O servidor de metadados do GKE é um subconjunto dos endpoints do servidor de metadados do Compute Engine necessários para as cargas de trabalho do Kubernetes.

O servidor de metadados do GKE é executado como um DaemonSet, com um pod em cada nó do Linux ou um serviço do Windows nativo em cada nó do Windows no cluster. O servidor de metadados intercepta solicitações HTTP para http://metadata.google.internal (169.254.169.254:80). Por exemplo, a solicitação GET /computeMetadata/v1/instance/service-accounts/default/token recupera um token para a conta de serviço do IAM que o pod está configurado para personificar. O tráfego para o servidor de metadados nunca sai da instância de VM que hospeda o pod.

Ciclo de vida do token

Por padrão, o token de acesso retornado tem uma vida útil de 1 hora (3.600 segundos). Para reduzir a latência do cliente, o servidor de metadados do GKE armazena em cache os tokens de acesso. Em algumas situações, o token em cache retornado pelo servidor de metadados pode estar perto do prazo de validade.

As bibliotecas de cliente do Cloud têm uma lógica integrada que, por padrão, verifica se o token de acesso expira nos próximos 3 minutos e 45 segundos. Se o token estiver dentro do período de validade, o GKE vai atualizar o token. Chamadas de API consecutivas podem usar o token atualizado.

Se você usar seu próprio código para acessar diretamente as APIs Google Cloud , implemente uma lógica semelhante para processar a expiração do token. O código precisa fazer o seguinte:

  1. Verifique se o token de acesso expira após um período de 3 minutos e 45 segundos. O parâmetro exp no payload do token indica o carimbo de data/hora de expiração do token.
  2. Se o token estiver definido para expirar nos próximos 3 minutos e 45 segundos, faça uma solicitação de token.

Veja nas tabelas a seguir o subconjunto de endpoints do servidor de metadados do Compute Engine disponíveis com o servidor de metadados do GKE. Para uma lista completa de endpoints disponíveis no servidor de metadados do Compute Engine, consulte Valores de metadados da VM padrão.

Metadados de instância

Os metadados da instância são armazenados no diretório a seguir.

http://metadata.google.internal/computeMetadata/v1/instance/

Entrada Descrição
hostname

O nome do host do nó.

id

O ID exclusivo do seu nó.

service-accounts/

Um diretório das contas de serviço associadas à instância. As seguintes informações estão disponíveis para cada conta de serviço:

  • aliases
  • email: o endereço de e-mail da conta de serviço,
  • identity: um JSON Web Token (JWT) exclusivo para o nó. Você precisa incluir o parâmetro audience na solicitação. Por exemplo, ?audience=http://www.example.com.
  • scopes: os escopos de acesso atribuídos à conta de serviço.
  • token: o token de acesso do OAuth 2.0 para autenticar suas cargas de trabalho.
zone

A zona do Compute Engine do seu nó do GKE.

Atributos da instância

Os atributos da instância são armazenados no seguinte diretório.

http://metadata.google.internal/computeMetadata/v1/instance/attributes/

Entrada Descrição
cluster-location

A zona ou a região do Compute Engine do cluster.

cluster-name

: o nome do cluster do GKE.

cluster-uid

O UID do seu cluster do GKE.

Os atributos listados na tabela são os únicos compatíveis. Se você tentar acessar atributos não compatíveis, o pod gke-metadata-server no namespace kube-system vai gerar e registrar um erro 404. O erro é semelhante a este:

HTTP/404: generic::not_found: no child "", Reason: "NOT_FOUND", UserMessage: "Not Found"

Se você estiver usando o istio-proxy, vai encontrar uma mensagem de erro como esta:

Error fetching GCP Metadata property gcp_gce_instance_template: metadata: GCE metadata "instance/attributes/UNSUPPORTED_ATTRIBUTE" not defined

Metadados do projeto

Os metadados do projeto de cluster são armazenados no diretório a seguir.

http://metadata.google.internal/computeMetadata/v1/project/

Entrada Descrição
project-id

O ID do seu projeto Google Cloud .

numeric-project-id

O número do seu projeto Google Cloud .

Restrições da federação de identidade da carga de trabalho para o GKE

  • Não é possível mudar o nome do pool de identidades da carga de trabalho que o GKE cria para o projeto Google Cloud .

  • Se você vincular contas de serviço do Kubernetes a contas de serviço do IAM para configurar a Federação de Identidade da Carga de Trabalho para GKE, o servidor de metadados do GKE vai retornar um valor de SERVICEACCOUNT_NAME.svc.id.goog como o identificador da conta de serviço. Esse identificador não usa a sintaxe padrão de identificador principal do IAM, o que pode causar erros em algumas operações programáticas. Para receber o identificador da conta de serviço como um identificador principal do IAM, adicione a anotação iam.gke.io/return-principal-id-as-email: "true" à sua ServiceAccount do Kubernetes.

  • Quando o GKE ativa o servidor de metadados do GKE em um pool de nós, os pods não podem mais acessar o servidor de metadados do Compute Engine. Em vez disso, o servidor de metadados do GKE intercepta solicitações feitas desses pods para endpoints de metadados, com exceção dos pods em execução na rede do host.

  • Ao usar o driver CSI do Cloud Storage FUSE com clusters padrão do GKE na versão 1.33.3-gke.1226000 ou mais recente, os pods em execução na rede do host (hostNetwork: true) podem se autenticar usando a própria conta de serviço do Kubernetes. Para mais informações, consulte Configurar o acesso para pods com rede de host.

  • O servidor de metadados do GKE leva alguns segundos para começar a aceitar solicitações em um pod recém-criado. Portanto, as tentativas de autenticação usando a federação de identidade da carga de trabalho para o GKE nos primeiros segundos da vida útil de um pod podem falhar. Tentar novamente a chamada resolverá o problema. Consulte Solução de problemas para mais detalhes.

  • Os agentes integrados de geração de registros e monitoramento do GKE continuarão a usar a conta de serviço do nó.

  • A federação de identidade da carga de trabalho para o GKE exige a configuração manual para que Knative serving continue lançando métricas de solicitação.

  • A federação de identidade da carga de trabalho para GKE define um limite de 500 conexões simultâneas com o servidor de metadados do GKE para cada nó. Outras chamadas simultâneas que excedem esse limite são colocadas em uma fila de espera para processamento posterior. Esse mecanismo de enfileiramento pode causar erros de HTTP/499 se o tempo limite do cliente for atingido antes que o servidor de metadados do GKE possa processar a solicitação.

  • O servidor de metadados do GKE usa recursos de memória proporcionalmente ao número total de contas de serviço do Kubernetes no seu cluster. Se o cluster tiver mais de 3.000 contas de serviço do Kubernetes, o kubelet poderá encerrar os pods do servidor de metadados. Para mitigações, consulte Solução de problemas.

  • A federação de identidade da carga de trabalho para GKE opera em um perímetro do VPC Service Controls, permitindo o acesso a recursos dentro dele. No entanto, o VPC Service Controls não aplica o controle de acesso para solicitações entre perímetros com base nessas identidades federadas. É possível usar a identidade temporária de conta de serviço para acessar recursos em um perímetro diferente.

Alternativas à federação de identidade da carga de trabalho do GKE

É possível usar uma das seguintes alternativas à federação de identidade da carga de trabalho para que o GKE acesse as APIs doGoogle Cloud pelo GKE. Recomendamos que você use a federação de identidade da carga de trabalho para o GKE porque essas alternativas exigem que você faça alguns compromissos de segurança.

A seguir