Endrigo Antonini

Autenticidade no git com o uso de chave GPG

October 09, 2016 | 4 Minute Read

git-scm-logoÉ muito comum o uso do git no dia a dia, seja ele para controlar o código fonte de sua organização, projetos pessoais ou outras funcionalidades. Enquanto o repositório é utilizado por apenas uma pessoa ou até mesmo em grandes corporações é difícil que seja feito a seguinte pergunta: "Mas o que garante que aquele commit foi determinada pessoa que o fez?".

Essa é uma pergunta que quase não é feita, mas que todo desenvolvedor, product owner, product manager deveria fazer. Isso pois todo commit está atrelado a um nome e um e-mail, mas não existem travas que impeçam que uma pessoa utilize o nome e e-mail de outra para realizar commits.
O GIT é um repositório descentralizado e é tão aberto e permissivo que não é necessário a existência de um nó principal para que um projeto exista ou seja controlado por ele. Hipoteticamente falando, o protocolo permite que um determinado "desenvolvedor A" possa ter acesso ao repositório que está armazenado na máquina do "desenvolvedor B" sem que ele faça qualquer consulta no ao servidor que eles utilizaram para fazer o clone, isso sem levar em conta controle de acesso que é aplicado em outras camadas.

Apesar de o cenário descrito acima não ser tão comum, nada impede que uma pessoa faça o clone de um repositório, configure o git local para utilizar o nome "John Doe" e email "fulano@example.com" execute qualquer alteração, realizar o commit e mandar este commit para um repositório em comum (Exemplo: GitHub, GitLab, Bitbucket...) ou mesmo submeta para o repositório do colaborador que foi utilizado como ponto de partida para o git clone. (Óbvio, para realizar o clone e pull é primordial ter permissão de leitura e o push permissão de escrita no repositório).

Com esse cenário acabamos de exemplificar como que um desenvolvedor de má índole, pode criar problemas para um projeto e ao mesmo tempo tentar colocar a culpa em outro desenvolvedor.

E como resolver esse problema?

A resolução dessa situação é através do uso de chaves GPG, onde cada desenvolvedor utiliza um par de chaves para assinar aquele commit e assim garantir a autenticidade deste.

Não irei abordar nesse artigo como gerar uma chave GPG (quem sabe seja conteúdo para um próximo post). Por isso vou considerar que você já possui o cliente GPG instalado e um par de chaves criado. Vale lembrar que o e-mail utilizado na chave GPG também deve ser o mesmo utilizado nas configurações do GIT. Com o par de chaves na máquina iremos realizar a configuração para que o GIT utilize o GPG para assinar todos os seus commits.

Para isso execute o comando abaixo para listar as chaves que você possui em sua máquina:

$ gpg --list-secret-keys --keyid-format LONG
/root/.gnupg/secring.gpg
-----------------------------------
sec   9999X/ABCDEFGHIJ123456 2016-01-01
uid                          My Name (Comment of the key) <fulano@example.com>
ssb   9999X/1234567890ABCEDF 2016-09-06

Para fazer a configuração utilize o ID que encontrasse na linha sec logo após o caracter /, ou seja, nesse caso utilize o valor ABCDEFGHIJ123456 no comando abaixo para identificar qual a chave deve ser utilizada para assinar o commit.

$ git config --global user.signingkey "ABCDEFGHIJ123456"
#                                      ^ Coloque aqui o ID da chave GPG

Sendo que o comando acima simplesmente indica qual a chave que o GIT deve utilizar. Para assinar o commit adicione o parâmetro -s na chamada do git, mas o melhor a se fazer é executar a sequência de comandos abaixo que irá realizar a configuração do GIT para sempre assinar os commits.

# Configura que o GIT utilize o executável gpg para realizar o processo de assinatura.
$ git config --global gpg.program gpg
# Configura para que execute a assinatura de commits
$ git config --global commit.gpgsign true

Os comandos acima configuram para que o GIT sempre assine os commits com a chave previamente configurada e também adicionamos a linha que efetua a configuração de qual executável deve ser utilizado para realizar a assinatura.

Dos repositórios que utilizo, apenas o GitHub exibe os commits que são assinados de uma forma diferente conforme pode ser visto na imagem abaixo:
commit-verified

Outros repositórios como Bitbucket e GitLab possuem essa funcionalidade no backlog mas ainda não foram implementados. Considerando que você não utiliza o GitHub, ou que você não utiliza nenhum gerenciador, execute o comando abaixo para exibir informações de assinatura do commit.

# Exibe no log informações de assinatura do commit
$ git --show-signature log
# Exibe informações de assinatura do commit selecionado
$ git --show-signature show <commit_hash>

Conclusão

As ações acima fazem com que seu repositório se torne muito mais seguro nos quesitos de integridade e também de não repúdio. Isso pois com o uso dessa configuração garantimos que o commit que está no repositório foi criado por aquela pessoa efetivamente.

IMPORTANTE:Não esqueça de utilizar passphrase no seu par de chaves GPG!

Referências:

  • Git Tools - Signing Your Work
  • comments powered by Disqus

    Related Posts

    Merge no Visual Studio 2013 com git

    Artigo sobre FlyWay

    Instalação de um servidor Jenkins