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


A federação de identidade da carga de trabalho para GKE é a maneira recomendada para que suas cargas de trabalho em execução no Google Kubernetes Engine (GKE) acessem os serviços do Google Cloud de maneira segura e gerenciável.

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 do Google Cloud compatíveis de cargas de trabalho em execução, por exemplo, AWS, Azure e Kubernetes autogerenciado. No GKE, o 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.

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 do Google 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 do Google 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 a APIs específicas do Google Cloud 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.

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 do 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.

  • 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 nos 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 específico do Google Cloud 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: é seu ID do projeto no 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: é seu ID do projeto no 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: é seu ID do projeto no 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: é seu ID do projeto no 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 do Google Cloud, por exemplo, ao usar uma biblioteca de cliente do 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 identidade federado com a federação de identidade da carga de trabalho para o GKE.
  1. O Application Default Credentials (ADC) solicita um token de acesso do 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 do Google Cloud de curta duração que faz referência à identidade da carga de trabalho do Kubernetes.
  4. O servidor de metadados do GKE fornece o token de acesso federado à carga de trabalho.

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

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 do 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. O 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 acessando as 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 do 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.

Noções básicas do servidor de metadados do GKE

Cada nó em um GKE com federação de identidade da carga de trabalho para GKE ativado armazena os metadados dele 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.

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.

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 no Google Cloud.

numeric-project-id

Seu número do projeto do Google Cloud.

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

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

  • 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.

  • 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 200 conexões com o servidor de metadados do GKE para cada nó, evitando problemas de memória. Expirações de tempo limite podem acontecer se os nós excederem esse limite.

  • A federação de identidade da carga de trabalho para nós do Windows Server está disponível nas versões do GKE 1.18.16-gke.1200, 1.19.8-gke.1300, 1.20.4-gke.1500 e posteriores.

  • 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.

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 do Google 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