Pular para conteúdo

Aula 19 - Automação com Git Hooks e Assinatura de Commits 🛡️

Objetivo Pedagógico

Objetivo: Implementar barreiras automatizadas de qualidade usando Git Hooks (pre-commit, commit-msg, pre-push) com Husky e configurar a assinatura criptográfica de commits com chaves GPG/SSH para conformidade e autenticidade.


📑 1. Fundamentos Teóricos & Análise Técnica

A segurança do ciclo de vida de desenvolvimento de software (Software Supply Chain Security) começa no primeiro comando executado na máquina do desenvolvedor.

A combinação de automação de políticas e autenticação de identidade mitiga riscos graves: 1. Arquitetura de Git Hooks: - Os hooks do Git são scripts executáveis localizados no diretório .git/hooks/, acionados em pontos estratégicos do fluxo de trabalho: - pre-commit: Executa linters, verificadores de segredos (ex: detecção de tokens de API hardcoded) e testes rápidos antes do commit ser gravado. - commit-msg: Valida se a mensagem do commit obedece a especificações como o Conventional Commits (ex: type(scope): subject). - pre-push: Impede o envio de alterações caso a suíte de testes de integração falhe ou existam branches desatualizadas. - Ferramentas como Husky e pre-commit (Python) padronizam e versionam esses hooks no próprio repositório, garantindo que toda a equipe execute as mesmas validações.

  1. Assinatura Criptográfica de Commits (GPG / SSH):
  2. No Git puro, qualquer usuário pode configurar arbitrariamente git config user.name e git config user.email, impersonando outro membro da equipe com facilidade.
  3. A assinatura com chave assimétrica (GPG ou chaves SSH Ed25519) atesta matematicamente a autoria do commit. Plataformas como o GitHub verificam a chave pública cadastrada e exibem o badge Verified, garantindo rastreabilidade e não-repúdio em auditorias de conformidade (SOC 2, ISO 27001).

📐 Arquitetura Conceitual & Diagrama de Fluxo

sequenceDiagram
    autonumber
    participant Dev as Desenvolvedor
    participant Git as Git Engine Local (.git/hooks)
    participant GPG as Chave Criptográfica GPG/SSH
    participant Remote as GitHub / GitLab Remoto
    Dev->>Git: git commit -m "feat: login"
    Git->>Git: Executa pre-commit (Lint, Detect-Secrets)
    Git->>Git: Executa commit-msg (Valida Conventional Commits)
    Git->>GPG: Solicita assinatura do objeto commit
    GPG-->>Git: Assinatura Criptográfica Anexada
    Git-->>Dev: Commit Gravado com Assinatura!
    Dev->>Remote: git push origin main
    Remote->>Remote: Valida Chave Pública na PKI do GitHub
    Note over Remote: Badge "Verified" Concedido!

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Prevenção de Vazamento de Segredos: Bloqueio no hook pre-commit de senhas, certificados .pem e chaves privadas antes de atingirem o histórico de commits. - Padronização com Conventional Commits: Habilita geração automática de changelog e controle semântico de versão (SemVer) via commit-msg. - Assinatura Criptográfica com Ed25519: Criptografia assimétrica moderna e compacta que assegura integridade contra falsificação de commits. - Reprodutibilidade na Equipe: Sincronização de hooks versionados através de ferramentas como Husky ou frameworks de pre-commit.


🛠️ 2. Implementação Prática em Segurança de Cadeia de Suprimentos e Automação Git

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// git_security_setup.sh (Configuração de GPG Signing e Pre-commit Hook)
#!/usr/bin/env bash
# 1. Configurar assinatura de commit global com GPG ou SSH
# Exemplo com chave SSH Ed25519 moderna:
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
git config --global tag.gpgsign true

echo "Configuração de assinatura criptográfica ativada!"

# 2. Exemplo de script pre-commit hook para barrar credenciais
cat << 'EOF' > .git/hooks/pre-commit
#!/usr/bin/env bash
set -e

echo "[Pre-Commit] Verificando segredos acidentais..."
if git diff --cached | grep -E "(BEGIN RSA PRIVATE KEY|API_KEY=|SECRET_KEY=)"; then
    echo "ERRO: Possível segredo confidencial detectado no staged diff!"
    echo "Remova as credenciais antes de prosseguir com o commit."
    exit 1
fi

echo "[Pre-Commit] Validações de segurança concluídas com sucesso!"
EOF

chmod +x .git/hooks/pre-commit

💡 Análise Passo a Passo do Código

  1. Assinatura Automática (commit.gpgsign): Garante que todo commit seja assinado criptograficamente sem necessidade de passar flags manuais -S.
  2. Interceptação Pre-Commit: Verifica padrões de expressões regulares de chaves privadas e credenciais antes da persistência do commit.
  3. Execução Rápida em Staged Diff: Inspeciona apenas os arquivos que estão em estágio de inclusão (--cached), mantendo feedback em milissegundos.

🎯 3. Próximos Passos & Sequência Didática