Abaixo está um passo-a-passo completo para configurar o GitHub Actions para usar o Workload Identity Federation (WIF) com o Google Cloud Platform (GCP) sem usar chaves longas de conta de serviço.


1) Configurar GCP (Workload Identity Federation)

a) Habilitar APIs necessárias

No seu projeto GCP, habilite pelo menos:

gcloud services enable iamcredentials.googleapis.com sts.googleapis.com

Isto permite que o GCP aceite tokens federados e os troque por credenciais temporárias. (GitHub)


b) Criar um Workload Identity Pool

Um Workload Identity Pool é o container que permite confiar em identidades externas (como GitHub).

gcloud iam workload-identity-pools create github-pool \
  --project=$PROJECT_ID \
  --location="global" \
  --display-name="Pool para GitHub Actions"

Guarde o POOL_ID retornado. (Google Cloud)


c) Criar um Workload Identity Provider (OIDC)

Este provider diz ao GCP para confiar no OIDC do GitHub Actions.

gcloud iam workload-identity-pools providers create-oidc github-provider \
  --project=$PROJECT_ID \
  --location=global \
  --workload-identity-pool=github-pool \
  --display-name="GitHub Actions OIDC Provider" \
  --issuer-uri="https://token.actions.githubusercontent.com" \
  --attribute-mapping="google.subject=assertion.sub,attribute.repository=assertion.repository,attribute.repository_owner=assertion.repository_owner" \
  --attribute-condition="attribute.repository=='minha-org/minha-repo'"

Esse mapeamento cria atributos que permitem condições de segurança posteriores (ex.: restringir por repo). (Google Cloud)


d) Criar uma Conta de Serviço no GCP

Crie a conta de serviço que o GitHub Actions vai “impersonar”:

gcloud iam service-accounts create github-actions-sa \
  --project=$PROJECT_ID \
  --display-name="Service Account para GitHub Actions"

e) Conceder Permissões para a Federação

Permita que o Workload Identity Pool impersonifique essa conta de serviço:

gcloud iam service-accounts add-iam-policy-binding github-actions-sa@${PROJECT_ID}.iam.gserviceaccount.com \
  --project=$PROJECT_ID \
  --role="roles/iam.workloadIdentityUser" \
  --member="principalSet://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/github-pool/attribute.repository/${GITHUB_ORG}/${GITHUB_REPO}"

Aqui:

  • PROJECT_NUMBER é o número do projeto GCP (não é o ID).
  • ${GITHUB_ORG} e ${GITHUB_REPO} restringem o uso apenas ao repositório específico (melhora segurança). (firefly.ai)
  • workloadIdentityPools/github-pool Nome do Workload Identity Pool (github-pool) criado previamente

f) Conceder Permissões à Conta de Serviço

Agora dê à conta de serviço os papéis necessários para acessar os recursos (por exemplo, Pub/Sub, Storage etc.):

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role="roles/storage.admin" \
  --member="serviceAccount:github-actions-sa@${PROJECT_ID}.iam.gserviceaccount.com"

Ajuste o papel conforme sua necessidade.


2) Configurar o GitHub Actions

No repositório GitHub, crie ou edite seu workflow YAML:

name: Deploy no GCP
 
on:
  push:
    branches: ["main"]
 
jobs:
  deploy:
    runs-on: ubuntu-latest
 
    permissions:
      contents: read
      id-token: write   # necessário para OIDC
 
    steps:
      - uses: actions/checkout@v4
 
      - id: auth
        uses: google-github-actions/auth@v3
        with:
          workload_identity_provider: "projects/${{ secrets.GCP_PROJECT_NUMBER }}/locations/global/workloadIdentityPools/github-pool/providers/github-provider"
          service_account: "github-actions-sa@${{ secrets.GCP_PROJECT_ID }}.iam.gserviceaccount.com"
 
      - name: Configura gcloud
        uses: google-github-actions/setup-gcloud@v1
        with:
          project_id: ${{ secrets.GCP_PROJECT_ID }}
          install_components: "beta"
 
      - name: Exemplo comando GCP
        run: |
          gcloud config set project ${{ secrets.GCP_PROJECT_ID }}
          gcloud storage buckets list

Importante no workflow:

  • permissions → id-token: write é obrigatório para permitir ao GitHub gerar um token OIDC.
  • O passo google-github-actions/auth trocará o token OIDC por credenciais GCP temporárias. (GitHub)

3) Considerações de Segurança

  • Evite expor chaves longas de contas de serviço no GitHub (WIF elimina essa necessidade). (Google Cloud)
  • Use attribute mapping e condições para restringir acesso por repositório/branch.
  • A conta de serviço deve ter apenas as permissões mínimas necessárias.

4) Resumo de como funciona a autenticação

  1. GitHub Actions solicita um token OIDC para a execução do workflow.
  2. GCP verifica esse token via o Workload Identity Provider.
  3. Se válido, GCP emite credenciais temporárias ligadas à conta de serviço.
  4. Ações subsequentes (ex.: gcloud) usam essas credenciais. (Google Cloud)