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.
- Assinatura Criptográfica de Commits (GPG / SSH):
- No Git puro, qualquer usuário pode configurar arbitrariamente
git config user.nameegit config user.email, impersonando outro membro da equipe com facilidade. - 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
- Assinatura Automática (
commit.gpgsign): Garante que todo commit seja assinado criptograficamente sem necessidade de passar flags manuais-S. - Interceptação Pre-Commit: Verifica padrões de expressões regulares de chaves privadas e credenciais antes da persistência do commit.
- 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
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto