Federação de identidade da carga de trabalho

Neste documento, você encontra uma visão geral da federação de identidade das cargas de trabalho externas. Usando a federação de identidade, é possível conceder às cargas de trabalho locais ou em várias nuvens acesso aos recursos do Google Cloud, sem usar uma chave de conta de serviço.

É possível usar a federação de identidade com a Amazon Web Services (AWS) ou qualquer provedor de identidade (IdP) compatível com o OpenID Connect (OIDC), como o Microsoft Azure ou o SAML 2.0.

Por que federação de identidade?

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 da conta 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 permite usar o gerenciamento de identidade e acesso (IAM) para conceder papéis do IAM a identidades externas, incluindo a capacidade de representar contas de serviço. Essa abordagem elimina a sobrecarga de manutenção e segurança associada às chaves da 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
  • Azure Active Directory
  • Serviços de federação do Active Directory (AD FS) locais
  • Okta
  • Clusters do Kubernetes

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 IdP ao Serviço de token de segurança, que verifica a identidade na credencial e 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 se 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 provedor de identidade externo contêm um ou mais atributos. Alguns provedores de identidade se referem a esses atributos como declarações.

Os tokens STS do Google 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 atributo define como derivar o valor do atributo de token STS do Google de um token externo. Para cada atributo de token STS do Google , é possível definir um mapeamento de atributo, formatado da seguinte maneira:

TARGET_ATTRIBUTE=SOURCE_EXPRESSION

Substitua:

  • TARGET_ATTRIBUTE é um atributo do token STS do Google.
  • SOURCE_EXPRESSION é uma expressão de Common Expression Language (CEL) que transforma um ou mais atributos dos tokens emitidos pelo provedor de identidade 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 da identidade ARN

    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 provedor de identidade disponível para o público em geral, é possível restringir o acesso para que apenas as identidades escolhidas tenham acesso ao pool de identidades da carga de trabalho.

  • Se você estiver usando um provedor de identidade 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 identidades de carga de trabalho pode usar a palavra-chave assertion, que se refere a um mapa que representa a credencial de autenticação emitida pelo provedor de identidade. 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.

Representação da conta de serviço:

O fluxo de troca de token retorna um token de acesso federado. É possível usar esse token para imitar uma conta de serviço e receber um token de acesso do OAuth 2.0 de curta duração. Com o token de acesso de curta duração, é possível chamar qualquer API do Google Cloud a que a conta de serviço tenha acesso.

Para representar uma conta de serviço, conceda à sua identidade externa o papel de Usuário da Identidade da carga de trabalho (roles/iam.workloadIdentityUser) em uma conta de serviço com os papéis exigidos pela carga de trabalho. É possível conceder um papel a todas as identidades em um pool de identidades da carga de trabalho ou a identidades externas específicas com base nos atributos delas.

Na tabela a seguir, descrevemos cenários comuns para a concessão de papéis:

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