Federação de identidade da carga de trabalho

Neste documento, apresentamos uma visão geral da federação de identidade da carga de trabalho. Com a federação de identidade da carga de trabalho, é possível fornecer cargas de trabalho locais ou multicloud com acesso aos recursos do Google Cloud usando identidades federadas no lugar de uma chave de conta de serviço.

É possível usar a federação de identidade da carga de trabalho com cargas de trabalho executadas na Amazon Web Services (AWS) e no Azure, no Active Directory local, em serviços de implantação, como o GitHub e GitLab e com qualquer provedor de identidade (IdP) compatível com o OpenID Connect (OIDC) ou a Linguagem de marcação para autorização de segurança (SAML) V2.0.

Por que a federação de identidade da carga de trabalho?

Geralmente, os aplicativos executados fora do Google Cloud podem usar chaves de conta de serviço para acessar os recursos do Google Cloud. No entanto, as chaves de contas de serviço são credenciais avançadas e podem apresentar um risco de segurança quando não são gerenciadas corretamente. A federação de identidade da carga de trabalho elimina a sobrecarga de manutenção e segurança associada às chaves de contas de serviço.

Com a federação de identidade da carga de trabalho, é possível usar o Identity and Access Management (IAM) para conceder a identidades externas papéis do IAM e acesso direto aos recursos do Google Cloud. Também é possível conceder acesso via identidade temporária de conta de serviço.

Pools de identidade da carga de trabalho

Um pool de identidade de carga de trabalho é uma entidade que permite gerenciar identidades externas.

Em geral, recomendamos a criação de um novo pool para cada ambiente que não seja do Google Cloud que precise acessar os recursos do Google Cloud, como ambientes de desenvolvimento, preparo ou produção.

Provedores de pool de Identidade da carga de trabalho

Um provedor de pool de identidade da carga de trabalho é uma entidade que descreve uma relação entre o Google Cloud e seu IdP, incluindo o seguinte:

  • AWS
  • Microsoft Entra ID
  • GitHub
  • GitLab
  • Clusters do Kubernetes
  • Okta
  • Serviços de federação do Active Directory (AD FS) locais
  • Terraform

A federação de identidade da carga de trabalho segue a especificação de troca de token do OAuth 2.0. Forneça uma credencial do seu IdP ao Serviço de token de segurança, que verifica a identidade na credencial e, em seguida, retorna um token federado em troca.

Provedor OIDC com JWKs locais

Para federar cargas de trabalho que não têm um endpoint OIDC público, faça upload dos conjuntos de chaves da Web JSON do OIDC (JWKS) diretamente no pool. Isso é comum quando você tem o Terraform ou o GitHub Enterprise hospedado no seu próprio ambiente ou tem requisitos regulamentares para não expor URLs públicos. Para mais informações, consulte Gerenciar JWKs do OIDC (opcional).

Mapeamentos de atributos

Os tokens emitidos pelo IdP externo contêm um ou mais atributos. Alguns IdPs se referem a esses atributos como declarações.

Os tokens do Google Security Token Service também contêm um ou mais atributos, conforme listado na tabela a seguir:

Atributo Descrição
google.subject Obrigatório. Um identificador exclusivo do usuário. Esse atributo é usado nas vinculações de papéis principal:// do IAM e aparece nos registros do Cloud Logging. O valor precisa ser exclusivo e não pode exceder 127 caracteres.
google.groups Opcional. Um conjunto de grupos ao qual a identidade pertence. Esse atributo é usado nas vinculações de papéis principalSet:// do IAM para conceder acesso a todos os membros de um grupo.
attribute.NAME Opcional. É possível definir até 50 atributos personalizados e usar esses atributos nas vinculações de papéis principalSet:// do IAM para conceder acesso a todas as identidades com um determinado atributo.

Um mapeamento de atributos define como derivar o valor do atributo de token do Google Security Token Service a partir de um token externo. Para cada atributo de token do Google Security Token Service, é possível definir um mapeamento de atributos, formatado da seguinte maneira:

TARGET_ATTRIBUTE=SOURCE_EXPRESSION

Substitua:

  • TARGET_ATTRIBUTE é um atributo do token do Google Security Token Service
  • SOURCE_EXPRESSION é uma expressão de Common Expression Language (CEL) que transforma um ou mais atributos dos tokens emitidos pelo IdP externo

A lista a seguir mostra exemplos de mapeamento de atributos:

  • Atribua o atributo de declaração sub a google.subject:

    google.subject=assertion.sub
    
  • Concatenar vários atributos de declaração:

    google.subject="myprovider::" + assertion.aud + "::" + assertion.sub
    
  • Mapeie um atributo de declaração com valor de GUID workload_id para um nome e atribua o resultado a um atributo personalizado chamado attribute.my_display_name:

    attribute.my_display_name={
      "8bb39bdb-1cc5-4447-b7db-a19e920eb111": "Workload1",
      "55d36609-9bcf-48e0-a366-a3cf19027d2a": "Workload2"
    }[assertion.workload_id]
    
  • Use operadores e funções lógicos do CEL para definir um atributo personalizado chamado attribute.environment como prod ou test, dependendo do nome de recurso da Amazon (ARN, na sigla em inglês) da identidade:

    attribute.environment=assertion.arn.contains(":instance-profile/Production") ? "prod" : "test"
    
  • Use a função extract para preencher um atributo personalizado aws_role com o nome do papel presumido ou, se nenhum papel tiver sido presumido, com o ARN da identidade.

    attribute.aws_role=assertion.arn.contains('assumed-role') ? assertion.arn.extract('{account_arn}assumed-role/') + 'assumed-role/' + assertion.arn.extract('assumed-role/{role_name}/') : assertion.arn
    
  • A função split divide uma string no valor do separador fornecido. Por exemplo, para extrair o atributo username de um atributo de endereço de e-mail dividindo o valor no @ e usando a primeira string, use o seguinte mapeamento de atributo:

    attribute.username=assertion.email.split("@")[0]
    

  • A função join mescla uma lista de strings no valor do separador fornecido. Por exemplo, para preencher o atributo personalizado department concatenando uma lista de strings com . como separador, use o seguinte mapeamento de atributo:

    attribute.department=assertion.department.join(".")
    

No caso da AWS, o Google fornece mapeamentos padrão que abrangem os cenários mais comuns. Também é possível fornecer mapeamentos personalizados.

Para provedores OIDC, você fornece os mapeamentos. Para construir o mapeamento, consulte a documentação do provedor para ver uma lista de atributos nas credenciais.

Para mais detalhes, consulte a documentação da API do campo attributeMapping.

Condições do atributo

Uma condição de atributo é uma expressão CEL que pode verificar atributos de declaração e destino. Se a condição do atributo for avaliada como true para uma determinada credencial, a credencial será aceita. Caso contrário, a credencial será rejeitada.

É possível usar uma condição de atributo para restringir quais identidades podem ser autenticadas usando o pool de identidades da carga de trabalho.

As condições do atributo são úteis em cenários como os seguintes:

  • Se sua carga de trabalho usar um IdP disponível para o público em geral, será possível restringir o acesso para que apenas as identidades escolhidas tenham acesso ao pool de Identidade da carga de trabalho.

  • Se você estiver usando um IdP com várias plataformas em nuvem, poderá impedir que as credenciais destinadas ao uso com outra plataforma sejam usadas com o Google Cloud e vice-versa. Isso ajuda a evitar o problema de confused deputy.

A condição do atributo de um provedor de pool de Identidade da carga de trabalho pode usar a palavra-chave assertion, que se refere a um mapa que representa a credencial de autenticação emitida pelo IdP. Use a notação de ponto para acessar os valores do mapa. Por exemplo, as credenciais da AWS incluem um valor arn, que pode ser acessado como assertion.arn. Além disso, a condição do atributo pode usar qualquer atributo definido no mapeamento de atributos do provedor.

O exemplo a seguir permite apenas solicitações de identidades que tenham um papel específico da AWS:

attribute.aws_role == "ROLE_MAPPING"

Para mais detalhes, consulte a documentação da API do campo attributeCondition.

Gerenciamento de acesso

O fluxo de troca de token retorna um token de acesso federado. Use esse token de acesso federado para conceder acesso à carga de trabalho em nome das identidades dos principais nos recursos do Google Cloud e receber um token de acesso do OAuth 2.0 de curta duração.

Use esse token para conceder acesso ao IAM.

Recomendamos que você use a federação de identidade da carga de trabalho para fornecer acesso diretamente a um recurso do Google Cloud. Embora a maioria das APIs do Google Cloud seja compatível com a federação de identidade da carga de trabalho, algumas APIs têm limitações. Uma alternativa é usar a identidade temporária de conta de serviço.

Com o token de acesso de curta duração, é possível chamar qualquer API do Google Cloud a que o recurso ou a conta de serviço tem acesso.

Acesso direto a recursos

Use o acesso direto a recursos para conceder acesso de identidade externa diretamente em um recurso do Google Cloud usando papéis específicos de recursos.

Alternativa: identidade temporária de conta de serviço

Uma alternativa para fornecer acesso direto a recursos é usar a identidade temporária de conta de serviço.

Conceda à sua conta de serviço o papel de Usuário de Identidade da carga de trabalho (roles/iam.workloadIdentityUser).

Escopos e segurança de principais

Você concede acesso aos principais ou subconjuntos deles usando tipos de principal.

Tipos de principais

A tabela a seguir descreve como definir principais como indivíduos e grupos de identidades:

Identidades Formato do identificador
Identidade única principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
Todas as identidades em um grupo principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP_ID
Todas as identidades com um valor de atributo específico principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE

A seguir