GDG Uberlândia

🛡️ CI/CD Seguro no GCP: Adeus Chaves JSON com Workload Identity Federation + IAM

Summary: Welington Alexandre Jacinto Junior compartilhou um guia prático sobre como melhorar a segurança em pipelines de CI/CD no Google Cloud Platform (GCP) usando Workload Identity Federation (WIF) em vez de chaves estáticas de Service Accounts. A solução envolve o uso de tokens OpenID Connect (OIDC) gerados por repositórios como GitHub, que são validados pelo GCP para conceder acesso temporário à Service Account vinculada. O guia detalha a configuração de infraestrutura e IAM no GCP e ajustes no GitHub Actions para implementar essa abordagem, além de dicas de segurança e otimização. Welington Alexandre Jacinto Junior se oferece para tirar dúvidas sobre ajustes de regras IAM para outros serviços.
AI Summary

Fala, pessoal da comunidade! 👋

Um dos maiores riscos de segurança em ambientes de nuvem é o uso de chaves estáticas de Service Accounts (arquivos .json) salvas em segredos do GitHub, GitLab ou Bitbucket. Se uma chave dessas vaza, o estrago pode ser grande.

Para resolver isso de forma elegante e segura, a boa prática recomendada no Google Cloud é usar o Workload Identity Federation (WIF). Com ele, seu pipeline se autentica no GCP usando tokens temporários de curta duração, respeitando o Princípio do Menor Privilégio (IAM).

Montei este guia prático de como configurar essa arquitetura de forma segura.

🏗️ Como Funciona a Arquitetura

Em vez de salvar uma senha/chave fixa no seu CI/CD:

  1. O repositório (ex: GitHub) gera um token OpenID Connect (OIDC).

  2. O GCP valida esse token através do Workload Identity Pool.

  3. O GCP concede um acesso temporário à Service Account vinculada, permitindo apenas as ações estritamente necessárias.

💻 Passo 1: Configurando o GCP (Infraestrutura / IAM)

Você pode rodar os comandos no seu Cloud Shell (lembre-se de substituir SEU_PROJECT_ID e SEU_REPOSITORIO):

Bash

# 1. Definir variáveis de ambiente
export PROJECT_ID="SEU_PROJECT_ID"
export REPO="usuario/meu-repositorio" # Exemplo: gdg-br/app-exemplo

# 2. Criar a Service Account exclusiva para o Pipeline
gcloud iam service-accounts create sa-github-actions \
    --display-name="SA para GitHub Actions CI/CD"

# 3. Aplicar o Princípio do Menor Privilégio (exemplo: deploy no Cloud Run)
# Conceda APENAS as roles necessárias, NUNCA roles/editor ou roles/owner!
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:sa-github-actions@${PROJECT_ID}.iam.gserviceaccount.com" \
    --role="roles/run.developer"

# 4. Criar o Workload Identity Pool
gcloud iam workload-identity-pools create "github-pool" \
    --location="global" \
    --display-name="GitHub Actions Pool"

# 5. Criar o Provider de Autenticação OIDC
gcloud iam workload-identity-pools providers create-oidc "github-provider" \
    --location="global" \
    --workload-identity-pool="github-pool" \
    --display-name="GitHub Provider" \
    --attribute-mapping="google.subject=assertion.sub,attribute.actor=assertion.actor,attribute.repository=assertion.repository" \
    --issuer-uri="https://token.actions.githubusercontent.com"

# 6. Permitir que APENAS o seu repositório específico assuma a Service Account
gcloud iam service-accounts add-iam-policy-binding \
    "sa-github-actions@${PROJECT_ID}.iam.gserviceaccount.com" \
    --role="roles/iam.workloadIdentityUser" \
    --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/github-pool/attribute.repository/${REPO}"

⚙️ Passo 2: Configurando o Pipeline no GitHub Actions

No seu repositório, adicione as permissões de id-token e use a Action oficial do Google para realizar a autenticação:

YAML

name: Deploy Seguro para GCP

on:
  push:
    branches:
      - main

# OBRIGATÓRIO: Permite que o GitHub gere o token OIDC
permissions:
  contents: read
  id-token: write

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout do código
        uses: actions/checkout@v4

      # Autenticação Segura via Workload Identity Federation
      - id: auth
        name: Autenticar no Google Cloud
        uses: google-github-actions/auth@v2
        with:
          workload_identity_provider: 'projects/1234567890/locations/global/workloadIdentityPools/github-pool/providers/github-provider'
          service_account: 'sa-github-actions@SEU_PROJECT_ID.iam.gserviceaccount.com'

      # Exemplo de passo utilizando a CLI do gcloud autenticada
      - name: Testar Conexão com GCP
        run: |
          gcloud run services list

🔒 Dicas de Otimização e Segurança (Checklist)

  • 🎯 Apenas as permissões necessárias: Troque a permissão roles/run.developer pela role exata da sua ferramenta (GKE, App Engine, Cloud Storage, etc.).

  • 🛑 Restrição por Branch: Se quiser limitar ainda mais, você pode configurar o attribute-mapping no GCP para aceitar apenas envios vindo da branch main.

  • 🔑 Zero Chaves Baixadas: Nenhuma chave .json precisou ser gerada ou salva nos Secrets do GitHub!

Espero que esse modelo ajude quem está buscando melhorar a postura de segurança dos seus pipelines! Se alguém tiver dúvidas sobre como ajustar as regras de IAM para outros serviços, manda aqui nos comentários! 🚀

#GoogleCloud #DevOps #Security #IAM #GDG #GitHubActions

0 comments