Segurança em Git e Repositórios
Nesta aula, você aprenderá a proteger seus repositórios Git contra ameaças comuns, explorando boas práticas de gerenciamento de branches, revisão de código, assinatura de commits e recursos de segurança nativos do GitHub. O conteúdo aborda desde conceitos fundamentais até configurações avançadas, com exemplos práticos e exercícios para fixação.
Nesta aula, vamos explorar as principais práticas de segurança ao trabalhar com Git e repositórios, essenciais para proteger o código-fonte e a integridade do projeto. Você aprenderá a gerenciar branches de forma segura, implementar revisões de código eficazes, assinar commits para garantir autenticidade e utilizar os recursos de segurança do GitHub para blindar seu repositório contra acessos não autorizados e vulnerabilidades.
Além de conceitos teóricos, apresentaremos comandos práticos e configurações que você pode aplicar imediatamente em seus projetos. Ao final, você terá um guia completo para elevar a segurança do seu fluxo de trabalho com Git.
Branches
Branches são ramificações do código que permitem desenvolver funcionalidades ou correções de forma isolada, sem afetar a linha principal. Em termos de segurança, o uso adequado de branches é fundamental para evitar que mudanças não testadas ou maliciosas sejam integradas diretamente à branch principal (geralmente main ou master).
Uma prática comum é adotar um modelo de branching como o Git Flow ou o GitHub Flow, que definem regras para criação, merge e exclusão de branches. Além disso, é importante configurar proteções de branch no repositório remoto, para que apenas revisores autorizados possam fazer merge de pull requests, e que builds e testes sejam executados automaticamente antes da integração.
Exemplo de criação e gestão de branches:
# Criar uma nova branch a partir da main
git checkout -b feature/nova-funcionalidade main
# Publicar a branch no repositório remoto
git push -u origin feature/nova-funcionalidade
# Listar branches
git branch -a
# Excluir uma branch local (após merge)
git branch -d feature/nova-funcionalidade
# Excluir a branch remota
git push origin --delete feature/nova-funcionalidadeNo GitHub, você pode ativar a proteção de branch em Settings > Branches, exigindo revisões de pull request, verificações de status e até assinaturas de commits. Isso impede que alterações não autorizadas sejam mescladas.
Reviews
Revisão de código (code review) é o processo de examinar alterações no código antes de integrá-las, com o objetivo de identificar bugs, vulnerabilidades e más práticas. Em um contexto de segurança, a revisão é uma barreira crítica contra a introdução de código malicioso ou erros que possam comprometer o sistema.
Ferramentas como GitHub Pull Requests permitem que outros desenvolvedores comentem, aprovem ou solicitem alterações em um conjunto de mudanças. Para reforçar a segurança, é recomendável que pelo menos um revisor aprovador seja obrigatório, e que a revisão seja feita por alguém com conhecimento do domínio. Além disso, a automação de análises estáticas (como CodeQL) pode complementar a revisão humana.
Exemplo de fluxo de revisão com GitHub CLI:
# Criar um pull request
git push origin feature/nova-funcionalidade
gh pr create --title "Nova funcionalidade" --body "Descrição"
# Listar pull requests abertos
gh pr list
# Aprovar um pull request
gh pr review 123 --approve
# Solicitar alterações
gh pr review 123 --request-changes --body "Corrija o problema de segurança"Além de revisões manuais, você pode configurar verificações obrigatórias no GitHub, como testes automatizados e análise de segurança, para que um pull request só possa ser mesclado se todas as verificações passarem.
Signed commits
Assinar commits com uma chave GPG ou SSH garante que o commit foi realmente criado por você, e não por um impostor. Isso é essencial para a integridade do histórico do repositório, pois impede que alguém forje commits em seu nome.
Para assinar commits no Git, você precisa gerar uma chave GPG, adicioná-la à sua conta do GitHub e configurar o Git para usá-la. A partir daí, cada commit que você fizer pode ser assinado com o comando git commit -S. No GitHub, você pode verificar se um commit está assinado e até ativar a opção de exigir commits assinados em branches protegidas.
Exemplo de configuração e uso de assinatura GPG:
# Gerar uma chave GPG (se não tiver)
gpg --full-generate-key
# Listar chaves e copiar o ID
gpg --list-secret-keys --keyid-format LONG
# Configurar o Git para usar a chave
git config --global user.signingkey
git config --global commit.gpgsign true
# Fazer um commit assinado
git commit -S -m "Mensagem do commit"
# Verificar a assinatura de um commit
git log --show-signature No GitHub, vá em Settings > SSH and GPG keys para adicionar sua chave pública. Depois, ao visualizar um commit, você verá um selo de "Verified" se ele estiver assinado corretamente.
GitHub Security
O GitHub oferece uma série de recursos de segurança integrados que ajudam a proteger seu repositório contra vulnerabilidades e ataques. Entre eles, destacam-se o Dependabot, que monitora dependências e cria pull requests automáticos para atualizá-las, e o CodeQL, que realiza análise estática de código para identificar falhas de segurança.
Além disso, o GitHub permite configurar alertas de segurança, políticas de acesso e até mesmo um programa de divulgação de vulnerabilidades (security advisory). Também é possível ativar a autenticação de dois fatores (2FA) para todos os colaboradores, reduzindo o risco de acesso não autorizado.
Exemplo de comandos para habilitar recursos de segurança via GitHub CLI:
# Habilitar CodeQL para o repositório
gh api repos/{owner}/{repo}/code-scanning/analysis -X POST -f language=javascript
# Listar alertas de segurança
github alerts list
# Criar um security advisory
gh api repos/{owner}/{repo}/security-advisories -X POST -f title="Vulnerabilidade X" -f description="Descrição"É fundamental estar atento às notificações de segurança e agir rapidamente quando um alerta for emitido, pois vulnerabilidades não corrigidas podem ser exploradas por atacantes. Manter as dependências atualizadas e realizar varreduras periódicas são boas práticas complementares.
Boas práticas e observações finais
Além dos tópicos abordados, lembre-se de sempre manter seu repositório privado quando o código não deve ser público, e de conceder permissões mínimas necessárias aos colaboradores. Utilize tokens de acesso pessoal em vez de senhas para autenticação, e nunca exponha segredos (como chaves de API) no código — use variáveis de ambiente ou serviços de gerenciamento de segredos.
Por fim, revise regularmente as configurações de segurança do seu repositório e incentive a equipe a seguir as boas práticas apresentadas. A segurança é um processo contínuo, e a adoção dessas medidas reduz significativamente os riscos de incidentes.
Exercícios
- Qual é a importância de usar branches no fluxo de desenvolvimento para a segurança do projeto?
- Como a revisão de código contribui para a segurança de um repositório?
- Explique como funciona a assinatura de commits com GPG e por que ela é importante.
- Cite três recursos de segurança do GitHub e explique como cada um ajuda a proteger um repositório.
- Como você configuraria a assinatura de commits no Git para um novo projeto?
gpg --full-generate-key. 2) Obter o ID da chave com gpg --list-secret-keys --keyid-format LONG. 3) Configurar o Git: git config --global user.signingkey <ID> e git config --global commit.gpgsign true. 4) Adicionar a chave pública ao GitHub em Settings > SSH and GPG keys. 5) Fazer commits com -S ou automaticamente, e verificar com git log --show-signature.