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) no local
- 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
agoogle.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 chamadoattribute.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
comoprod
outest
, 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 personalizadoaws_role
com o nome do papel presumido ou, se nenhum papel tiver sido presumido, com o da identidade ARNattribute.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 atributousername
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 personalizadodepartment
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/
|
Todas as identidades em um grupo |
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/
|
Todas as identidades com um valor de atributo específico |
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/
|
A seguir
Use a federação de identidade para acessar recursos da AWS, do Microsoft Azure de um provedor OIDC ou de um provedor SAML 2.0 .
Saiba como gerenciar pools de identidades da carga de trabalho usando a CLI do Google Cloud ou a API REST.