Signed git commits. O porquê e como fazer

26 jun 2024

Em nosso último post da série “Pílulas técnicas sobre engenharia de plataforma: além do que você encontra na documentação”, falamos sobre Aproveitar funções AWS Step enquanto otimizamos transformações de dados em larga escala; hoje gostaríamos de explicar a importância de assinar commits.

Ter seus commits assinados adiciona uma camada de segurança adicional ao processo de desenvolvimento. Ao fazer isso, você e outras pessoas podem verificar a integridade, a autenticidade e a origem das alterações no código.

Iremos nos aprofundar no que são os commits assinados do Git, por que você deseja que eles sejam assinados e como realmente assiná-los.

Por que commits assinados?


Ao desenvolver como parte de uma equipe, qualquer pessoa com permissões suficientes pode enviar código para seu repositório. Embora seja necessário ser autenticado, isso por si só não garante que o código enviado foi gerado pela pessoa que o enviou. Qualquer um poderia alterar seu nome de usuário e seu email para corresponder ao seu e criar um commit, representando você efetivamente.

Isso pode ser evitado principalmente se você adquirir o hábito de assinar seus commits, então qualquer um que der uma olhada no git log (pelo menos ao fazer isso com o sinalizador --show-signature) poderá ver rapidamente se os commits foram atribuídos a você foram de fato assinados com sua chave.

Infelizmente, isso não impedirá de forma alguma que as pessoas usem seu nome de usuário e e-mail em commits maliciosos, mas como todos os seus estão assinados, isso pelo menos se destacará e convidará alguém a pensar "talvez isso não seja autêntico".

Idealmente, todos assinariam cada commit, então qualquer commit que fosse assinado com uma chave desconhecida ou não assinado por completo pareceria suspeito.

Como funciona?


Se você já sabe como a PKI funciona, você pode pular esta seção, pois não precisa saber como ela funciona nos bastidores para realmente assinar commits.

Para aqueles que permanecem, deixe-me dizer que as chaves criptográficas desempenham um papel fundamental na assinatura de commits. Você pode encontrar a explicação completa na Wikipedia, mas aqui está um resumo.

Há sempre duas partes em jogo, uma pública e outra privada.
  • Chave Pública: Esta é aquela que você pode compartilhar com segurança e é usada para verificação. É como uma fechadura que qualquer pessoa pode acessar. Ao assinar um commit, você usaria sua chave privada para criar uma assinatura exclusiva. Outros podem então usar sua chave pública para verificar a assinatura e confirmar que foi você quem criou o commit.
  • Chave Privada: Esta chave é mantida em segredo e nunca deve ser compartilhada. É como a chave da fechadura mencionada anteriormente. Você usa sua chave privada para criar a assinatura para seus commits. Como é conhecido apenas por você, garante que somente você possa produzir uma assinatura válida para seus commits.


Para realmente obter essas chaves, você provavelmente usaria GPG, que significa GNU Privacy Guard, amplamente reconhecido por sua confiabilidade e segurança. Com ele, você pode criar o par de chaves mencionado acima e realizar diversas tarefas de gerenciamento sobre elas.

Pegando suas chaves


Primeiro e mais importante, você precisará do GPG disponível e pronto para ser usado. Se você está no Linux ou MacOS, você já deve tê-lo instalado ou pode instalá-lo muito facilmente.

Para Linux, você precisará usar o gerenciador de pacotes, como pacman, apt, yum, etc.

No MacOS, a maneira mais fácil é usar o brew.

Se você está no Windows, terá que baixá-lo do site deles.

Assim que tiver isso, podemos prosseguir.

1. Use gpg para criar seu par de chaves:

gpg --full-generate-key                                              

2. Escolha seu tipo de chave. RSA (somente sinal) servirá neste caso

3. Especifique o tamanho da sua chave. Eu recomendaria 4096 e não abaixo de 2048 [

4. Defina uma data de validade. Eu recomendo o padrão

5. Preencha seus dados

  •  Opcionalmente, proteja a chave com uma senha longa. Isto é altamente recomendado

Para que seja útil, você precisa informar seu provedor git (ou sua equipe) sobre sua chave pública. É assim que qualquer pessoa poderá realmente corroborar suas assinaturas. Você pode fazer isso com apenas dois comandos.

Este primeiro lhe dará as informações necessárias para posteriormente exportar a chave pública.

gpg --list-secret-keys --keyid-format long                           

Sua saída deve ser parecida com isto.

1000012890

A partir daí estamos interessados ​​no ID da chave, que neste exemplo seria C0C8AF0F2B994FA5. Copie-o, pois precisaremos dele para a etapa final.

O último comando que você precisará executar produzirá, na verdade, a chave pública.

gpg --armor --export C0C8AF0F2B994FA5                                

Será algo parecido com isto

1000012891

Como etapa final, você copiará todas essas linhas e as colará em seu provedor Git. Você pode consultar as instruções do GitHub ou GitLab para obter detalhes.

Signing commits

Chegamos ao último passo. Vamos configurar o Git com a chave que ele precisa usar para assinar commits. Precisaremos novamente do ID da chave obtido na última etapa com gpg --list-secret-keys --keyid-format long

Deve ser semelhante ao seguinte

git config --global user.signingkey C0C8AF0F2B994FA5                 

Isso instruirá o Git a usar essa chave para assinar commits de agora em diante. Você ainda teria que solicitar que os commits fossem assinados.

Para isso existem duas opções.

  • Deixe o Git assinar cada commit (recomendado)
git config --global commit.gpgsign true                                        

ⓘ Nota: Por padrão, o Git deve assinar tags automaticamente, mas é assim que você o ativaria explicitamente
  • Firmar explicitamente cada commit
git commit -S -m "Not an awful commit message"                      

 

A decisão é inteiramente sua, ambos acabarão assinando seus commits com a chave definida.

Conclusão

Infelizmente, uma quantidade muito pequena de committers os assina. Isso não é de forma alguma um requisito e não prejudicará seu código de forma alguma.

Leve em consideração que alguém se passando por você e tendo acesso a um repositório para fazer commit em seu nome deve ser uma situação bastante estranha, mas é melhor prevenir do que remediar. Especialmente quando esses commits são relacionados ao trabalho.

Eu encorajo você a se acostumar com esse processo e começar a assinar seus commits imediatamente.

Recursos adicionais

  • GitLab fornece documentação e tópicos expandidos, como assinatura condicional de commits, revogação de chaves gpg e solução de problemas aqui
  • Também é possível assinar commits com uma chave ssh. Novamente, GitLab