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-funcionalidade

No 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

  1. Qual é a importância de usar branches no fluxo de desenvolvimento para a segurança do projeto?

✓ Resposta: Branches permitem isolar mudanças em desenvolvimento, evitando que código instável ou não revisado seja integrado diretamente à branch principal. Isso reduz o risco de introduzir vulnerabilidades ou quebras no ambiente de produção, e possibilita um processo de revisão e testes controlado antes do merge.
  1. Como a revisão de código contribui para a segurança de um repositório?

✓ Resposta: A revisão de código permite que outros desenvolvedores examinem as alterações antes de serem integradas, identificando possíveis vulnerabilidades, erros de lógica, exposição de dados sensíveis ou más práticas de programação. É uma barreira humana complementar às ferramentas automatizadas, aumentando a qualidade e a segurança do código.
  1. Explique como funciona a assinatura de commits com GPG e por que ela é importante.

✓ Resposta: A assinatura de commits com GPG usa criptografia assimétrica para criar uma assinatura digital do commit, vinculando-o à chave privada do autor. Isso garante a autenticidade e integridade do commit: qualquer alteração no conteúdo após a assinatura invalidaria a assinatura. É importante porque impede que terceiros forjem commits em nome do autor, protegendo a linhagem do histórico do projeto.
  1. Cite três recursos de segurança do GitHub e explique como cada um ajuda a proteger um repositório.

✓ Resposta: Três recursos são: 1) Dependabot: monitora dependências e cria pull requests para atualizá-las, corrigindo vulnerabilidades conhecidas automaticamente. 2) CodeQL: realiza análise estática de código para detectar falhas de segurança, como injeção de SQL ou uso inseguro de funções. 3) Proteção de branches: exige revisões de pull request, verificações de status e commits assinados, garantindo que apenas código aprovado seja integrado.
  1. Como você configuraria a assinatura de commits no Git para um novo projeto?

✓ Resposta: Passos: 1) Gerar uma chave GPG com 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.

Referências