Git é a ferramenta de controle de versão mais utilizada no mundo, e repositórios como GitHub, GitLab e Bitbucket armazenam código-fonte crítico. Garantir a segurança desses repositórios é fundamental para evitar vazamentos, alterações maliciosas e perda de integridade. Nesta aula, exploraremos quatro pilares de segurança em Git: uso correto de branches, práticas de code review, commits assinados com GPG e recursos nativos de segurança do GitHub.

Dominar esses tópicos permite que equipes colaborem de forma segura, rastreável e confiável, minimizando riscos de erros humanos e ataques. Vamos mergulhar em cada um deles com exemplos práticos.

Branches

Branches (ramos) são uma das funcionalidades mais poderosas do Git, permitindo desenvolver funcionalidades isoladamente sem afetar a base principal. No entanto, o gerenciamento inadequado de branches pode introduzir riscos de segurança. Por exemplo, se todos os desenvolvedores tiverem permissão para fazer push diretamente na branch principal (main/master), um commit malicioso ou acidental pode quebrar o sistema ou expor dados sensíveis.

Práticas recomendadas incluem: usar branches de feature para cada nova funcionalidade, proteger a branch principal com regras de proteção (como no GitHub, que impede pushes diretos e exige pull requests aprovados), e manter branches curtas e frequentes para reduzir conflitos. Além disso, evite armazenar segredos (senhas, chaves) em branches, mesmo que temporárias; use variáveis de ambiente ou serviços de segredos.

Exemplo de comando para criar e mudar para uma nova branch:

git checkout -b feature/nova-funcionalidade

Após finalizar, faça o merge via pull request, nunca diretamente.

Reviews

Code review (revisão de código) é o processo de examinar alterações propostas antes de integrá-las à base principal. Isso não apenas melhora a qualidade do código, mas também é uma barreira de segurança: um revisor pode detectar vazamentos de credenciais, vulnerabilidades de injeção, lógica insegura ou backdoors. Sem reviews, qualquer desenvolvedor com acesso pode introduzir código malicioso.

Para revisões eficientes, defina um número mínimo de aprovadores (por exemplo, 2), utilize ferramentas de análise estática integradas (como CodeQL no GitHub) e verifique se o autor não está revisando o próprio código. Comentários devem ser construtivos e focados em segurança, como "essa senha está hardcoded; mova para variável de ambiente".

No GitHub, um pull request típico passa por revisão antes do merge:

# Após criar um pull request, os revisores são notificados e podem aprovar ou solicitar alterações.

Signed commits

Commits assinados garantem que uma alteração foi realmente feita por quem afirma tê-la feito, usando criptografia assimétrica (GPG ou SSH). Sem assinatura, um atacante que comprometa uma conta de usuário pode fazer commits falsos em nome de outra pessoa. A assinatura adiciona uma camada de autenticação e não repúdio.

Para configurar commits assinados com GPG: gere um par de chaves, adicione a chave pública à sua conta GitHub e configure o Git para assinar commits automaticamente. Exemplo:

gpg --full-generate-key
gpg --list-secret-keys --keyid-format LONG
git config --global user.signingkey ID_DA_CHAVE
git config --global commit.gpgSign true

Depois, cada commit será assinado. No GitHub, os commits assinados exibem um selo "Verified". Sempre verifique commits suspeitos com git verify-commit <hash>.

GitHub Security

O GitHub oferece vários recursos de segurança nativos: Dependabot (alertas de vulnerabilidades em dependências), secret scanning (detecção automática de segredos vazados), code scanning (análise estática com CodeQL), e branch protection rules (regras de proteção de branch). Essas ferramentas ajudam a prevenir e mitigar riscos antes que se tornem problemas.

Por exemplo, habilite o Dependabot para receber pull requests automáticos de atualização de dependências vulneráveis. Configure secret scanning para bloquear commits que contenham tokens AWS, chaves SSH ou senhas. Use branch protection rules para exigir pull requests, status checks e assinaturas de commit na branch principal.

Exemplo de configuração de regra de proteção no GitHub (via interface): Settings > Branches > Add rule > Inserir nome da branch (main) > Marcar "Require pull request reviews" e "Require signed commits".

Além disso, o GitHub Actions pode ser usado para automatizar verificações de segurança, como executar linters e scanners de vulnerabilidades a cada push.

Boas Práticas e Observações Finais

Combine sempre os quatro pilares: branches protegidas, code reviews obrigatórios, commits assinados e ferramentas de segurança do GitHub. Revise periodicamente as permissões de acesso ao repositório e remova colaboradores inativos. Mantenha as dependências atualizadas e evite armazenar segredos no código. Lembre-se: segurança é um processo contínuo, não uma configuração única.

Referências

Exercícios

  1. Crie uma branch chamada 'exercicio-seguranca' a partir da branch main. Qual comando você usaria?

    ✓ Resposta:
    git checkout -b exercicio-seguranca main
  2. Por que é importante exigir code reviews antes de mesclar um pull request na branch principal? Cite ao menos dois motivos de segurança.

    ✓ Resposta:

    Code reviews ajudam a detectar vazamentos de credenciais (senhas, chaves) e vulnerabilidades de segurança (como injeção SQL) antes do merge, além de prevenir backdoors intencionais.

  3. Qual comando configura o Git para assinar todos os commits com uma chave GPG de ID 'ABCD1234'?

    ✓ Resposta:
    git config --global user.signingkey ABCD1234
    git config --global commit.gpgSign true
  4. No GitHub, qual recurso detecta automaticamente tokens e chaves vazadas em commits?

    ✓ Resposta:

    Secret scanning.

  5. Explique como as regras de proteção de branch podem aumentar a segurança. Dê um exemplo de configuração.

    ✓ Resposta:

    Regras de proteção impedem pushes diretos, exigem pull requests com revisões e status checks, e podem exigir commits assinados. Exemplo: configurar a branch 'main' para exigir pelo menos 2 aprovações e assinatura de commits.