Configurar a federação de identidade da carga de trabalho com pipelines de implantação

Neste guia, descrevemos como usar a federação de identidade da carga de trabalho para permitir que os pipelines de implantação sejam autenticados no Google Cloud.

Dependendo do sistema de CI/CD usado, os pipelines de implantação podem ter acesso a credenciais de ambiente específicas para o ambiente. Exemplo:

  • Os pipelines do Azure DevOps podem usar uma conexão de serviço de federação de identidade da carga de trabalho do Microsoft Entra para receber um token de ID que identifique de maneira exclusiva o projeto do Azure DevOps.
  • Os fluxos de trabalho do GitHub Actions podem receber um token OIDC do GitHub que identifica exclusivamente o fluxo de trabalho e o repositório dele.
  • O GitLab SaaS permite que jobs de CI/CD acessem um token de ID que identifica de maneira exclusiva o job e seu projeto, ambiente e repositório.
  • O Terraform Cloud pode fornecer um token OIDC para a configuração do Terraform que identifica exclusivamente o espaço de trabalho e o ambiente.

É possível configurar seus pipelines de implantação para usar essas credenciais para autenticação no Google Cloud usando a federação de identidade da carga de trabalho. Essa abordagem elimina a sobrecarga de manutenção e segurança associada às chaves da conta de serviço.

Antes de começar

Configurar a autenticação

Select the tab for how you plan to use the samples on this page:

Console

When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

gcloud

In the Google Cloud console, activate Cloud Shell.

Activate Cloud Shell

At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

Python

Para usar os exemplos Python desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.

  1. Install the Google Cloud CLI.
  2. To initialize the gcloud CLI, run the following command:

    gcloud init
  3. If you're using a local shell, then create local authentication credentials for your user account:

    gcloud auth application-default login

    You don't need to do this if you're using Cloud Shell.

Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local na documentação de autenticação do Google Cloud.

Funções exigidas

Para receber as permissões necessárias para configurar a federação de identidade da carga de trabalho, peça ao administrador para conceder a você o papel do IAM Administrador de pool de Identidade da carga de trabalho (roles/iam.workloadIdentityPoolAdmin) no projeto. Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.

Como alternativa, o papel básico de Proprietário do IAM (roles/owner) também inclui permissões para configurar a federação de identidade. Não conceda papéis básicos em um ambiente de produção, recomendamos que você faça isso em um ambiente de desenvolvimento ou teste.

Preparar seu IdP externo

DevOps do Azure

Para permitir que um pipeline do Azure DevOps seja autenticado no Google Cloud, primeiro configure uma conexão de serviço para o Azure Resource Manager. Essa conexão permite que o pipeline receba um token de ID, que pode ser trocado por credenciais do Google Cloud.

Para criar uma conexão de serviço para o Azure Resource Manager, faça o seguinte:

  1. No Azure DevOps, abra seu projeto e acesse Project Settings.
  2. Acesse Pipelines > Service Conexões.
  3. Clique em Criar conexão de serviço.
  4. Selecione Azure Resource Manager.
  5. Clique em Próxima.
  6. Selecione Federação de Identidade da carga de trabalho (automática).
  7. Clique em Próxima.
  8. Defina as configurações a seguir:

    • Nível do escopo: selecione uma assinatura.

      Selecione uma assinatura mesmo que você não pretenda usar a conexão de serviço para acessar os recursos do Azure.

    • Nome da conexão de serviço: digite um nome como google-cloud.

  9. Clique em Salvar.

Em uma etapa posterior, você precisará do emissor e do identificador do assunto da conexão de serviço. Para procurar esses detalhes, faça o seguinte:

  1. Clique na conexão de serviço que você acabou de criar.
  2. Clique em Gerenciar principal de serviço.
  3. Acesse Certificados e secrets > Credenciais federadas.
  4. Clique na credencial federada.
  5. Na página Editar uma credencial, encontre os seguintes identificadores:

    • Emissor: identifica exclusivamente a organização do Azure DevOps
    • Identificador de assunto: identifica exclusivamente a conexão de serviço.

O Azure DevOps concede automaticamente acesso na assinatura selecionada como escopo à principal de serviço associada à nova conexão de serviço. Como você não planeja usar a conexão de serviço para acessar recursos do Azure, revogue esse acesso fazendo o seguinte:

  1. No portal do Azure, abra a assinatura selecionada como escopo.
  2. Acesse Controle de acesso (IAM) > Atribuições de função.
  3. Encontre e remova a atribuição de papel para a conexão de serviço.

Ações do GitHub

Não é necessário fazer alterações na configuração da sua conta do GitHub.

Depois de configurar um pool de identidades de carga de trabalho para confiar no repositório do GitHub, permita que os fluxos de trabalho nesse repositório usem o token OIDC do GitHub para receber credenciais do Google Cloud de curta duração.

SaaS do GitLab

Não é necessário fazer alterações na configuração da sua conta do GitLab.

Depois de configurar um pool de Identidade da carga de trabalho para confiar no grupo do GitLab, ative a federação de identidade da carga de trabalho para jobs individuais de CI/CD.

Terraform Cloud

Não é necessário fazer alterações de configuração na sua conta do Terraform Cloud.

Depois de configurar um pool de Identidade da carga de trabalho para confiar no Terraform Cloud, é possível ativar a federação de identidade da carga de trabalho para espaços de trabalho individuais.

Configurar a federação de identidade da carga de trabalho

É necessário seguir estas etapas para cada organização do GitHub, grupo do GitLab ou organização do Terraform Cloud.

Para começar a configurar a federação de identidade da carga de trabalho, faça isto:

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. É melhor usar um projeto dedicado para gerenciar pools e provedores de identidade da carga de trabalho
  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the IAM, Resource Manager, Service Account Credentials, and Security Token Service APIs.

    Enable the APIs

Definir um mapeamento de atributos

As credenciais específicas do ambiente do pipeline de implantação contêm vários atributos, e você precisa decidir qual atributo quer usar como identificador do assunto (google.subject) no Google Cloud.

Também é possível mapear outros atributos. Você pode consultar esses atributos adicionais ao conceder acesso aos recursos.

DevOps do Azure

O token de ID do Azure DevOps inclui uma declaração sub que contém o identificador de assunto da sua conexão de serviço. O identificador de assunto usa o seguinte formato:

sc://ORGANIZATION/PROJECT/CONNECTION

Use o mapeamento de atributos a seguir a fim de mapear esse identificador para google.subject:

google.subject=assertion.sub

Ações do GitHub

Os mapeamentos de atributos podem usar qualquer uma das declarações no token OIDC do Actions do GitHub. Essas chaves de reivindicação de token e os respectivos valores são controlados pelo GitHub. No mínimo, é necessário mapear google.subject para assertion.sub, que corresponde ao assunto do token OIDC do Actions do GitHub:

google.subject=assertion.sub

O valor do assunto do token OIDC do GitHub Actions pode variar dependendo do evento de origem. Outros atributos de reivindicação podem incluir:

  • repository: contém o nome do proprietário e do repositório, por exemplo, "google/guava".

  • repository_id: contém o ID de repositório exclusivo, por exemplo, "20300177".

  • repository_owner: contém o proprietário, que pode ser um nome de usuário ou o nome de uma organização do GitHub, por exemplo, "google".

  • repository_owner_id: contém o ID exclusivo do proprietário, por exemplo, "1342004".

A lista é um subconjunto das possíveis declarações. Consulte a documentação do GitHub sobre declarações de exemplo para ver uma lista completa. Certifique-se de mapear todas as reivindicações que planeja usar como condições de atributo ou como parte de uma condição principalSet futura.

SaaS do GitLab

Os mapeamentos de atributos podem usar as declarações incorporadas no token de ID do GitLab como atributos de origem, incluindo:

  • sub: o nome do projeto e a referência do Git, por exemplo, project_path:groupname/projectname:ref_type:branch:ref:main.
  • namespace_id: o ID exclusivo do grupo;
  • project_id: o ID exclusivo do projeto;
  • user_id: o ID de usuário único;
  • environment: o ambiente ao qual o job se aplica;
  • ref_path: a referência do Git, por exemplo, refs/heads/main.

O mapeamento de atributo a seguir define google.subject como a declaração sub do token de ID do GitLab. Como a declaração sub contém o nome do projeto e a referência do Git, esse mapeamento permite controlar o acesso por repositório e ramificação:

google.subject=assertion.sub

O controle de acesso por repositório e branch pode ser útil se determinados branches (por exemplo, main) precisarem de acesso diferente aos recursos de outros branches, por exemplo, branches de recursos.

Em alguns casos, pode ser suficiente diferenciar apenas o acesso por projeto ou grupo. Portanto, o mapeamento a seguir inclui dois atributos adicionais que contêm o project_id e o namespace_id do GitLab:

google.subject=assertion.sub
attribute.project_id=assertion.project_id
attribute.namespace_id=assertion.namespace_id

Terraform Cloud

Os mapeamentos de atributos podem usar as declarações incorporadas no token do Cloud OIDC do Terraform, incluindo as seguintes:

  • terraform_organization_id: contém o ID exclusivo da organização, por exemplo, org-xxxxxxxxxxxxxxxx.
  • terraform_workspace_id: contém o ID exclusivo do espaço de trabalho, por exemplo, ws-xxxxxxxxxxxxxxxx.
  • terraform_workspace_name: contém o nome de exibição do espaço de trabalho.
  • sub: contém o nome de exibição da organização, do espaço de trabalho e da fase, por exemplo, organization:example-org:workspace:example-workspace:run_phase:apply.

O mapeamento de atributo a seguir define google.subject para a declaração terraform_workspace_id do token OIDC do Terraform Cloud:

google.subject=assertion.terraform_workspace_id

Esse mapeamento permite controlar o acesso aos recursos do Google Cloud por espaço de trabalho.

Definir uma condição de atributo

As condições do atributo são expressões CEL que podem verificar atributos de declaração e atributos de 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. Você precisa ter um mapeamento de atributos para todos os campos de condição do atributo.

DevOps do Azure

Opcionalmente, use uma condição de atributo para restringir o acesso a determinadas conexões de serviço. Por exemplo, a condição a seguir limita o acesso a conexões em um determinado projeto do Azure DevOps:

assertion.sub.startsWith('sc://ORGANIZATION/PROJECT/')

Substitua:

  • ORGANIZATION: o nome da organização do Azure DevOps.
  • PROJECT: o nome do projeto do Azure DevOps.

Ações do GitHub

Use a seguinte condição de atributo para restringir o acesso a tokens emitidos pela organização do GitHub:

assertion.repository_owner=='ORGANIZATION'

Substitua ORGANIZATION pelo nome da sua organização do GitHub.

Se quiser, estenda a condição do atributo para restringir o acesso a um subconjunto de fluxos de trabalho ou ramificações. Por exemplo, a condição a seguir limita o acesso a fluxos de trabalho que usam a ramificação Git main:

assertion.repository_owner=='ORGANIZATION' && assertion.ref=='refs/heads/main'

SaaS do GitLab

Use a seguinte condição de atributo para restringir o acesso a tokens emitidos pelo grupo do GitLab.

assertion.namespace_id=='GROUP_ID'

Substitua GROUP_ID pelo ID do grupo mostrado na página inicial do grupo do GitLab.

Se quiser, estenda a condição do atributo para restringir o acesso a um subconjunto de projetos, branches ou ambientes. Por exemplo, a condição a seguir limita o acesso a jobs que usam o ambiente production:

assertion.namespace_id=='GROUP_ID' && assertion.environment=='production'

Terraform Cloud

Use a condição de atributo a seguir para restringir o acesso aos tokens emitidos pela organização do Terraform para o Cloud:

assertion.terraform_organization_id=='ORGANIZATION_ID'

Substitua ORGANIZATION_ID pelo ID exclusivo da sua organização, por exemplo, org-xxxxxxxxxxxxxxxx. Se quiser, estenda a condição do atributo para restringir o acesso a um subconjunto de fluxos de trabalho ou ramificações. Por exemplo, a condição de atributo a seguir limita o acesso a um espaço de trabalho específico:

assertion.terraform_organization_id=='ORGANIZATION_ID' && assertion.terraform_workspace_id=='WORKSPACE_ID'

Crie um pool de identidades e um provedor de carga de trabalho

Coletamos todas as informações necessárias para criar um pool de identidades e um provedor de carga de trabalho:

Console

  1. No Console do Google Cloud, acesse a página Novo provedor de carga de trabalho e pool.

    Acessar "Novo provedor de carga de trabalho" e "Pool"

  2. Em Criar um pool de identidades, digite o seguinte:

    • Nome: o nome do pool. O nome também é usado como o ID do pool. Não será possível alterar o ID do pool posteriormente.
    • Descrição: texto que descreve a finalidade do pool.
  3. Clique em Continuar.

  4. Defina as configurações do provedor:

    DevOps do Azure

    • Selecione um provedor: OpenID Connect (OIDC).
    • Nome do provedor: o nome do projeto do Azure DevOps ou um nome personalizado.
    • ID do provedor: o nome do projeto do Azure DevOps ou uma ID personalizada. Não será possível alterar o ID depois.
    • URL do emissor: o emissor da conexão de serviço que você pesquisou anteriormente.
    • Públicos-alvo: selecione Públicos-alvo permitidos e cole o valor a seguir.

      api://AzureADTokenExchange
      

    Ações do GitHub

    • Selecione um provedor: OpenID Connect (OIDC).
    • Nome do provedor: nome do provedor.
    • Provider ID: ID do provedor. Não será possível alterar o ID depois.
    • URL do emissor: https://token.actions.githubusercontent.com/
    • Públicos-alvo: padrão

    SaaS do GitLab

    • Selecione um provedor: OpenID Connect (OIDC).
    • Nome do provedor: nome do provedor.
    • Provider ID: ID do provedor. Não será possível alterar o ID depois.
    • URL do emissor: https://gitlab.com
    • Públicos-alvo: padrão

    Terraform Cloud

    • Selecione um provedor: OpenID Connect (OIDC).
    • Nome do provedor: nome do provedor.
    • Provider ID: ID do provedor. Não será possível alterar o ID depois.
    • URL do emissor: https://app.terraform.io
    • Públicos-alvo: padrão
  5. Clique em Continuar.

  6. Em Configurar atributos do provedor, adicione os mapeamentos de atributos identificados anteriormente.

  7. Em Condições de atributo, digite a condição do atributo que você identificou anteriormente.

  8. Clique em Salvar para criar o pool de identidades e o provedor da carga de trabalho.

gcloud

  1. Crie um novo pool de identidades de carga de trabalho:

    gcloud iam workload-identity-pools create POOL_ID \
        --location="global" \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"
    

    Substitua os seguintes valores:

    • POOL_ID: o ID exclusivo do pool
    • DISPLAY_NAME: o nome do pool
    • DESCRIPTION: a descrição do pool Essa descrição aparece ao conceder acesso às identidades do pool
  2. Adicione um provedor de pool de identidades de carga de trabalho:

    DevOps do Azure

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    Substitua os seguintes valores:

    Ações do GitHub

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="https://token.actions.githubusercontent.com/" \
        --allowed-audiences="api://AzureADTokenExchange" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    Substitua os seguintes valores:

    SaaS do GitLab

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="https://gitlab.com" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    Substitua os seguintes valores:

    Terraform Cloud

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="https://app.terraform.io" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    Substitua os seguintes valores:

Atualizar a condição do atributo em um provedor de identidade da carga de trabalho

Nesta seção, descrevemos como atualizar a condição do atributo em um provedor de pool de identidade de carga de trabalho atual para restringir o acesso a tokens emitidos pela organização do GitHub, pelo grupo do GitLab ou pela organização do Terraform Cloud.

Para encontrar a condição de atributo recomendada para o pipeline, consulte Definir uma condição de atributo.

Console

  1. No Console do Google Cloud, acesse a página Pools de Identidades da carga de trabalho.

    Acesse Pools de identidade da carga de trabalho

  2. Encontre o pool de identidades da carga de trabalho que contém o provedor e clique no ícone Expandir nó do pool.

  3. Encontre o provedor do pool de identidade da carga de trabalho que você quer editar e clique em Editar.

  4. Em Condições de atributo, digite a condição do atributo que você identificou anteriormente.

  5. Para atualizar o pool de identidades e o provedor de carga de trabalho, clique em Salvar.

gcloud

Para atualizar o provedor do pool de identidades de cargas de trabalho, execute o seguinte comando:

gcloud iam workload-identity-pools providers update-oidc PROVIDER_ID \
    --location="global" \
    --workload-identity-pool="POOL_ID" \
    --attribute-condition="CONDITIONS"

Substitua os seguintes valores:

Autenticar um pipeline de implantação

Realize essas etapas para cada fluxo de trabalho do GitHub Actions ou do espaço de trabalho do Terraform Cloud.

Permitir que a carga de trabalho externa acesse recursos do Google Cloud

Para concluir as instruções mais tarde neste guia, você precisa configurar a identidade temporária de conta de serviço conforme descrito nesta seção.

Para fornecer à sua carga de trabalho acesso aos recursos do Google Cloud, recomendamos que você conceda ao principal acesso direto aos recursos. Nesse caso, o principal é o usuário federado. Alguns produtos do Google Cloud têm limitações de APIs do Google Cloud. Se sua carga de trabalho chamar um endpoint de API que apresenta limitação, será possível usar a identidade temporária de conta de serviço. Nesse caso, o principal é a conta de serviço do Google Cloud, que atua como a identidade. Você concede acesso à conta de serviço no recurso.

Acesso direto a recursos

É possível conceder acesso a uma identidade federada diretamente nos recursos usando o console do Google Cloud ou a gcloud CLI.

Console

Para usar o console do Google Cloud para conceder papéis do IAM diretamente em um recurso, acesse a página do recurso e conceda o papel. O exemplo a seguir mostra como acessar a página do Cloud Storage e conceder o papel Leitor de objetos do Storage (roles/storage.objectViewer) a uma identidade federada diretamente em um bucket do Cloud Storage.

  1. No Console do Google Cloud, acesse a página Buckets do Cloud Storage.

    Acessar buckets

  2. Na lista de buckets, clique no nome do bucket ao qual você quer conceder o papel.

  3. Selecione a guia Permissões na parte superior da página.

  4. Clique no botão Permitir acesso.

    A caixa de diálogo Adicionar principais será exibida.

  5. No campo Novos principais, insira uma ou mais identidades que precisam acessar seu bucket.

    Por assunto

    principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
    

    Substitua:

    • PROJECT_NUMBER: o número do projeto
    • POOL_ID: o ID do pool de carga de trabalho
    • SUBJECT: o sujeito individual mapeado do IdP, por exemplo, administrator@example.com

    Por grupo

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
    

    Substitua:

    • PROJECT_NUMBER: o número do projeto
    • WORKLOAD_POOL_ID: o ID do pool de carga de trabalho
    • GROUP: o grupo mapeado do IdP, por exemplo: administrator-group@example.com

    Por atributo

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
    

    Substitua:

    • PROJECT_NUMBER: o número do projeto
    • WORKLOAD_POOL_ID: o ID do pool de carga de trabalho
    • ATTRIBUTE_NAME: um dos atributos que foi mapeado do IdP
    • ATTRIBUTE_VALUE: o valor do atributo
  6. Escolha um papel ou mais no menu suspenso Selecionar um papel. Os papéis selecionados são exibidos no painel com uma breve descrição das permissões que eles concedem.

  7. Clique em Salvar.

gcloud

Para usar a gcloud CLI a fim de conceder papéis do IAM em um recurso de um projeto, faça isto:

  1. Consiga o número do projeto em que o recurso está definido.

    gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
    
  2. Conceda acesso ao recurso.

    Para usar a gcloud CLI para conceder o papel de leitor de objetos de armazenamento (roles/storage.objectViewer) a identidades externas que atendam a determinados critérios, execute o comando a seguir.

    Por assunto

    gcloud storage buckets add-iam-policy-binding BUCKET_ID \
        --role=roles/storage.objectViewer \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"

    Por grupo

    gcloud storage buckets add-iam-policy-binding BUCKET_ID \
        --role=roles/storage.objectViewer \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"

    Por atributo

    gcloud storage buckets add-iam-policy-binding BUCKET_ID \
        --role=roles/storage.objectViewer \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"

    Substitua:

    • BUCKET_ID: o bucket em que o acesso será concedido
    • PROJECT_NUMBER: o número do projeto que contém o pool de Identidade da carga de trabalho
    • POOL_ID: o ID do pool de identidade da carga de trabalho
    • SUBJECT: o valor esperado do atributo mapeado para google.subject
    • GROUP: o valor esperado do atributo mapeado para google.groups
    • ATTRIBUTE_NAME: o nome de um atributo personalizado no seu mapeamento de atributos
    • ATTRIBUTE_VALUE: o valor do atributo personalizado no seu mapeamento de atributos

    É possível conceder papéis em qualquer recurso do Google Cloud compatível com políticas de permissão do IAM.

Identidade temporária de conta de serviço

  1. Para criar uma conta de serviço para a carga de trabalho externa, faça isto:

    1. Enable the IAM, Security Token Service, and Service Account Credentials APIs.

      Enable the APIs

    2. Crie uma conta de serviço que represente a carga de trabalho. Recomendamos que você use uma conta de serviço dedicada para cada carga de trabalho. A conta de serviço não precisa estar no mesmo projeto que o pool de Identidade da carga de trabalho, mas você precisa se referir ao projeto que contém a conta de serviço.

    3. Conceda à conta de serviço acesso a recursos que você quer que as identidades externas acessem.

    4. Conceda a função do usuário de Identidade da carga de trabalho (roles/iam.workloadIdentityUser) à conta de serviço:

  2. Para conceder acesso a uma identidade federada usando a identidade temporária de conta de serviço pelo console do Google Cloud ou pela gcloud CLI:

Console

Para usar o console do Google Cloud para conceder papéis do IAM a uma identidade federada com conta de serviço, faça isto:

Conta de serviço no mesmo projeto

  1. Para conceder acesso usando a identidade temporária de conta de serviço no mesmo projeto, faça o seguinte:

    1. Acesse a página pools de Identidade da carga de trabalho.

      Acesse Pools de identidade da carga de trabalho

    2. Selecione Conceder acesso.

    3. Na caixa de diálogo Conceder acesso à conta de serviço, selecione Conceder acesso usando a identidade temporária de conta de serviço.

    4. Na lista Contas de serviço, selecione a conta de serviço para as identidades externas que serão representadas e faça isto:

    5. Para escolher quais identidades no pool podem representar a conta de serviço, realize uma das seguintes ações:

      • Para permitir que apenas identidades específicas do pool de Identidade da carga de trabalho representem a conta de serviço, selecione Somente identidades correspondentes ao filtro.

      • Na lista Nome do atributo, selecione o atributo que você quer filtrar.

      • No campo Valor do atributo, insira o valor esperado do atributo. Por exemplo, se você usar um google.subject=assertion.sub de mapeamento de atributos, defina o nome do Atributo com subject e o Valor do atributo com o valor da declaração sub em tokens emitidos pelo seu provedor de identidade externo.

    6. Para salvar a configuração, clique em Salvar e em Dispensar.

Conta de serviço em um projeto diferente

  1. Para conceder acesso usando a identidade temporária de conta de serviço em um projeto diferente, faça o seguinte:

    1. Acesse a página Contas de serviço.

      Acessar a página "Contas de serviço"

    2. Selecione a conta de serviço que você quer representar.

    3. Clique em Gerenciar acesso.

    4. Clique em Adicionar principal.

    5. No campo Novo principal, insira um dos seguintes identificadores principais para as identidades no pool que vão representar a identidade da conta de serviço.

      Por assunto

      principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
      

      Substitua:

      • PROJECT_NUMBER: o número do projeto
      • POOL_ID: o ID do pool de carga de trabalho
      • SUBJECT: o sujeito individual mapeado do IdP, por exemplo, administrator@example.com

      Por grupo

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
      

      Substitua:

      • PROJECT_NUMBER: o número do projeto
      • WORKLOAD_POOL_ID: o ID do pool de carga de trabalho
      • GROUP: o grupo mapeado do IdP, por exemplo: administrator-group@example.com

      Por atributo

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
      

      Substitua:

      • PROJECT_NUMBER: o número do projeto
      • WORKLOAD_POOL_ID: o ID do pool de carga de trabalho
      • ATTRIBUTE_NAME: um dos atributos que foi mapeado do IdP
      • ATTRIBUTE_VALUE: o valor do atributo

      Por pool

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
      

      Substitua:

      • PROJECT_NUMBER: o número do projeto
      • WORKLOAD_POOL_ID: o ID do pool de carga de trabalho
    6. Em Selecionar um papel, selecione a função de usuário da Identidade da carga de trabalho (roles/iam.workloadIdentityUser).

    7. Para salvar a configuração, clique em Salvar.

gcloud

Para usar a gcloud CLI para conceder o papel Usuário de Identidade da carga de trabalho (roles/iam.workloadIdentityUser) a identidades externas que atendam a determinados critérios, execute o comando a seguir.

Por assunto

gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
    --role=roles/iam.workloadIdentityUser \
    --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"

Por grupo

gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
    --role=roles/iam.workloadIdentityUser \
    --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"

Por atributo

gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
    --role=roles/iam.workloadIdentityUser \
    --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"

Substitua:

  • SERVICE_ACCOUNT_EMAIL: o endereço de e-mail da conta de serviço
  • PROJECT_NUMBER: o número do projeto que contém o pool de Identidade da carga de trabalho
  • POOL_ID: o ID do pool de identidade da carga de trabalho
  • SUBJECT: o valor esperado do atributo mapeado para google.subject
  • GROUP: o valor esperado do atributo mapeado para google.groups
  • ATTRIBUTE_NAME: o nome de um atributo personalizado no seu mapeamento de atributos
  • ATTRIBUTE_VALUE: o valor do atributo personalizado no seu mapeamento de atributos

Configurar o pipeline de implantação

Nesta seção, descrevemos como usar a federação de identidade da carga de trabalho no pipeline de implantação. As instruções nesta seção consideram que suas cargas de trabalho usam a identidade temporária de conta de serviço para acessar os recursos do Google Cloud.

DevOps do Azure

Edite o arquivo azure-pipelines.yml e adicione o seguinte à configuração do job:

variables:
- name: Azure.WorkloadIdentity.Connection
  value: CONNECTION
- name: GoogleCloud.WorkloadIdentity.ProjectNumber
  value: PROJECT_NUMBER
- name: GoogleCloud.WorkloadIdentity.Pool
  value: POOL_ID
- name: GoogleCloud.WorkloadIdentity.Provider
  value: PROVIDER_ID
- name: GoogleCloud.WorkloadIdentity.ServiceAccount
  value: SERVICE_ACCOUNT_EMAIL
- name: GOOGLE_APPLICATION_CREDENTIALS
  value: $(Pipeline.Workspace)/.workload_identity.wlconfig

steps:
  - task: AzureCLI@2
    inputs:
      connectedServiceNameARM: $(Azure.WorkloadIdentity.Connection)
      addSpnToEnvironment: true
      scriptType: 'bash'
      scriptLocation: 'inlineScript'
      inlineScript: |
        echo $idToken > $(Pipeline.Workspace)/.workload_identity.jwt
        cat << EOF > $GOOGLE_APPLICATION_CREDENTIALS
        {
          "type": "external_account",
          "audience": "//iam.googleapis.com/projects/$(GoogleCloud.WorkloadIdentity.ProjectNumber)/locations/global/workloadIdentityPools/$(GoogleCloud.WorkloadIdentity.Pool)/providers/$(GoogleCloud.WorkloadIdentity.Provider)",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "credential_source": {
            "file": "$(Pipeline.Workspace)/.workload_identity.jwt"
          },
          "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/$(GoogleCloud.WorkloadIdentity.ServiceAccount):generateAccessToken"
        }
        EOF

Substitua os seguintes valores:

  • CONNECTION: o nome da conexão de serviço
  • PROJECT_NUMBER: o número do projeto que contém o pool de identidade da carga de trabalho
  • POOL_ID: o ID do pool de identidade da carga de trabalho
  • PROVIDER_ID: o ID do provedor do pool de identidade da carga de trabalho
  • SERVICE_ACCOUNT_EMAIL: o endereço de e-mail da conta de serviço.

A configuração faz o seguinte:

  1. Usa a tarefa AzureCLI para receber um token de ID para a conexão de serviço e o disponibiliza em uma variável chamada idToken.
  2. Salva o token de ID em um arquivo temporário chamado .workload_identity.jwt.
  3. Cria um arquivo de configuração de credenciais que instrui as bibliotecas de cliente a ler o token de ID de .workload_identity.jwt e usá-lo para representar uma conta de serviço.
  4. Define a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS a fim de apontar para o arquivo de configuração de credenciais.

Ações do GitHub

A ação google-github-actions/auth permite gerar automaticamente um arquivo de configuração de credenciais durante a execução do fluxo de trabalho. As bibliotecas de cliente e ferramentas, como terraform, podem usar esse arquivo de configuração de credenciais para receber credenciais do Google automaticamente.

Edite o arquivo YAML do GitHub Actions e adicione o seguinte:

  • Permita que o job busque um token de ID do GitHub adicionando a seguinte configuração:

    permissions:
      id-token: write
      contents: read
    
  • Adicione uma etapa para criar um arquivo de configuração de credenciais:

    - id: 'auth'
      name: 'Authenticate to Google Cloud'
      uses: 'google-github-actions/auth@v1'
      with:
        create_credentials_file: true
        workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
        service_account: 'SERVICE_ACCOUNT_EMAIL'
    

Substitua os seguintes valores:

  • PROJECT_NUMBER: o número do projeto que contém o pool de Identidade da carga de trabalho
  • POOL_ID: o ID do pool de Identidade da carga de trabalho
  • PROVIDER_ID: o ID do provedor do pool de Identidade da carga de trabalho
  • SERVICE_ACCOUNT_EMAIL: substitua pelo endereço de e-mail da conta de serviço.

O exemplo a seguir configura a ação do GitHub:

jobs:
  build:
    # Allow the job to fetch a GitHub ID token
    permissions:
      id-token: write
      contents: read

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - id: 'auth'
        name: 'Authenticate to Google Cloud'
        uses: 'google-github-actions/auth@v1'
        with:
          create_credentials_file: true
          workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
          service_account: 'SERVICE_ACCOUNT_EMAIL'

Para mais detalhes sobre o uso da ação google-github-actions/auth, consulte Como configurar a federação de identidade da carga de trabalho.

SaaS do GitLab

Edite o arquivo .gitlab-ci.yml e adicione o seguinte à configuração do job:

job:
  variables:
    WORKLOAD_IDENTITY_PROJECT_NUMBER: PROJECT_NUMBER
    WORKLOAD_IDENTITY_POOL: POOL_ID
    WORKLOAD_IDENTITY_PROVIDER: PROVIDER_ID
    SERVICE_ACCOUNT: SERVICE_ACCOUNT_EMAIL
    GOOGLE_APPLICATION_CREDENTIALS: $CI_BUILDS_DIR/.workload_identity.wlconfig

  id_tokens:
    WORKLOAD_IDENTITY_TOKEN:
      aud: https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID

  script:
    - |-
      echo $WORKLOAD_IDENTITY_TOKEN > $CI_BUILDS_DIR/.workload_identity.jwt
      cat << EOF > $GOOGLE_APPLICATION_CREDENTIALS
      {
        "type": "external_account",
        "audience": "//iam.googleapis.com/projects/$WORKLOAD_IDENTITY_PROJECT_NUMBER/locations/global/workloadIdentityPools/$WORKLOAD_IDENTITY_POOL/providers/$WORKLOAD_IDENTITY_PROVIDER",
        "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
        "token_url": "https://sts.googleapis.com/v1/token",
        "credential_source": {
          "file": "$CI_BUILDS_DIR/.workload_identity.jwt"
        },
        "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/$SERVICE_ACCOUNT:generateAccessToken"
      }
      EOF

Substitua os seguintes valores:

  • PROJECT_NUMBER: o número do projeto que contém o pool de Identidade da carga de trabalho
  • POOL_ID: o ID do pool de identidade da carga de trabalho
  • PROVIDER_ID: o ID do provedor do pool de Identidade da carga de trabalho
  • SERVICE_ACCOUNT_EMAIL: o endereço de e-mail da conta de serviço

A configuração faz o seguinte:

  1. Instrui o GitLab a emitir um token de ID e o disponibiliza na variável de ambiente chamada WORKLOAD_IDENTITY_TOKEN. O token de ID usa o provedor de pool de identidade da carga de trabalho como público-alvo.
  2. Salva o token de ID em um arquivo temporário chamado .workload_identity.jwt.
  3. Cria um arquivo de configuração de credenciais que instrui as bibliotecas de cliente a ler o token de ID de .workload_identity.jwt e usá-lo para representar uma conta de serviço.
  4. Define a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS a fim de apontar para o arquivo de configuração de credenciais.

Terraform Cloud

Configure seu espaço de trabalho do Terraform Cloud para que ele use a federação de identidade da carga de trabalho para autenticação no Google Cloud usando a identidade temporária de conta de serviço.

  1. No Terraform Cloud, abra seu espaço de trabalho e acesse Variáveis.

  2. Adicione as seguintes variáveis:

    Categoria variável Chave Valor
    Variável de ambiente TFC_GCP_PROVIDER_AUTH true
    Variável de ambiente TFC_GCP_RUN_SERVICE_ACCOUNT_EMAIL O endereço de e-mail da conta de serviço, por exemplo, terraform@my-project-123.iam.gserviceaccount.com
    Variável de ambiente TFC_GCP_PROJECT_NUMBER O número do projeto que contém o pool de identidade da carga de trabalho
    Variável de ambiente TFC_GCP_WORKLOAD_POOL_ID O ID do pool de identidade da carga de trabalho
    Variável de ambiente TFC_GCP_WORKLOAD_PROVIDER_ID O ID do provedor do pool de identidade da carga de trabalho

    Se quiser, adicione outras variáveis de ambiente para permitir que o Terrform Cloud use contas de serviço diferentes para as fases plan e apply. Para mais informações, consulte Variáveis de ambiente opcionais.

  3. Na lista de variáveis, verifique se Categoria está definida como env para as cinco variáveis que você adicionou na etapa anterior.

  4. Verifique se a configuração do Terraform usa a versão 4.48.0 ou mais recente do provedor do Google Cloud e atualize, se necessário, da seguinte maneira:

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = "~> 4.48.0"
        }
      }
    }
    
  5. Envie as alterações para seu repositório de código-fonte.

A seguir