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

Neste documento, diferenciamos as contas de serviço do Kubernetes das contas de serviço de gerenciamento de identidade e acesso (IAM).

Contas de Serviço 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.

Também é possível limitar o escopo do acesso definindo conditions nas políticas de permissão. Por exemplo, se você quiser conceder acesso de leitura em um bucket apenas a pods que usam a conta de serviço database-reader no cluster mysql, defina essa condição na política de permissão. Para saber mais sobre o uso de condições em políticas de permissão, consulte Gerenciar vinculações de papéis condicionais.

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 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:

  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 pela autoridade certificadora (CA, na sigla em inglês) do cluster.
  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 principal forem os mesmos para cargas de trabalho em vários clusters que compartilham um pool de identidades de cargas de trabalho, o IAM identificará essas cargas de trabalho como iguais. 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, B e C pertencem ao mesmo projeto do Google Cloud e, portanto, ao mesmo pool de identidades de carga de trabalho. O Google Cloud identifica aplicativos que usam a conta de serviço 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
Semelhança de identidade ao acessar APIs do Google Cloud com a federação de identidade da carga de trabalho para 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 o Cluster C no exemplo anterior pertencesse a uma equipe não confiável, seria possível 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 GKE exige a configuração manual do Cloud Run for Anthos para continuar 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