Assinando commits no Git com GPG

Convenhamos, o Git por si só é um sistema de controle de versão espetacular.

Nesse artigo vamos aprender a usar as chaves GPG para assinar o seu trabalho localmente permitindo assim uma verificação extra dos commits de colaboradores confiáveis.

Então sempre que assinar um commit, isso permite que as outras pessoas possam confiar que as mudanças que você fez, realmente foram feitas por você.

Exemplo: Visualização gráfica do sistema de branches do Git

Ferramentas de repositório como o GitLab, Github e Bitbucket podem mostrar ao usuário se um commit é verificado ou não quando assinado digitalmente com uma chave GPG.

Isso é importante porque garante a confiabilidade na publicação do código que você escreve e pode até ser um requisito essencial dependendo da qualidade do projeto em desenvolvimento.

Na engenharia de software é comumente sabido que a segurança da informação em todos os seus aspectos deve ser levada a rica, e, cabe ao profissional competente buscar, projetar e utilizar mecanismos que garantam o mais alto nível de seguridade e solidez.

Levando isso em consideração, nesse artigo vamos lidar com dois mecanismos, que em conjunto proporcionam ao desenvolvedor que mantém código pela internet um nível de confiabilidade sob as melhores práticas da mais alta tecnologia do mercado corporativo.

  • Git – O Git é um sistema de controle de versão distribuído e um sistema de gerenciamento de código fonte, com ênfase em velocidade. O Git foi inicialmente projetado e desenvolvido por Linus Torvalds para o desenvolvimento do kernel Linux, mas foi adotado por muitos outros projetos.
  • GPG – GNU Privacy Guard (GnuPG or GPG) é uma alternativa GPL ao aplicativo PGP de criptografia. GnuPG é compatível com a RFC 4880, o padrão da IETF para a especificação do OpenPGP. As versões atuais do PGP possuem interoperabilidade com o GnuPG e com outros sistemas compatíveis com o OpenPGP. GnuPG é parte da Free Software Foundation e do projeto de software GNU. Além disso, ele recebeu o patrocínio do governo Alemão.

PS: O termo GPG aqui utilizado refere-se a todas implementações relacionadas com OpenPGP/PGP/GPG.

E para garantir tal compliance, tudo o que você precisa fazer é criar, carregar uma chave GPG pública para as configurações de seu perfil no repositório remoto e configurar seu git local.

Para isso, basta seguir os passos a seguir.

Gerando uma chave GPG

Esse procedimento (até o passo 8) deve ser utilizado caso ainda não possua uma chave GPG. A partir do passo 9 os comandos são específicos para visualizar as chaves geradas.

1. Instale o GPG em seu sistema operacional

2. Gere o par de chaves pública/privada com o seguinte comando no terminal:

gpg --full-gen-key

Esse comando produzirá uma série de perguntas.

3. A primeira pergunta é qual algoritmo pode ser usado. Selecione o tipo desejado ou pressione Enter para escolher o padrão (RSA):

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1

4. A próxima pergunta é sobre o comprimento da chave.
Já visando um futuro caótico 😇, recomendo escolher o valor mais alto que é 4096:

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits

5. Em seguida, você precisa especificar qual o período de validade da sua chave. Isso é algo subjetivo (eu escolho 4 anos), você pode usar o valor padrão que é para nunca expirar:

Please specify how long the key should be valid.
         0 = key does not expire
        = key expires in n days
      w = key expires in n weeks
      m = key expires in n months
      y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all

6. Confirme se as respostas que você deu estavam corretas digitando y:

Is this correct? (y/N) y

7. Digite seu nome completo, o endereço de e-mail a ser associado a chave (deve corresponder ao e-mail verificado usado no Github/GitLab) e um comentário opcional (tecle Enter):

GnuPG needs to construct a user ID to identify your key.

Real name: Mr. Robot
Email address: mr@robot.sh
Comment:
You selected this USER-ID:
    "Mr. Robot "

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

8. Escolha uma senha decente quando solicitado e digite duas vezes para confirmar.


9. Use o seguinte comando para exibir a chave GPG privada que você acabou de criar:

gpg --list-secret-keys --keyid-format LONG mr@robot.sh

Substitua mr@robot.sh pelo endereço de e-mail que você digitou acima.

10. Copie o ID da chave GPG que começa com o sec. Por ex. 30F2B65B9246B6CA:

sec   rsa4096/30F2B65B9246B6CA 2017-08-18 [SC]
      D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA
uid                   [ultimate] Mr. Robot 
ssb   rsa4096/B7ABC0813E4028C0 2017-08-18 [E]

11. Exporte a chave pública dessa identificação (substitua pelo ID da etapa anterior):

gpg --armor --export 30F2B65B9246B6CA

12. E finalmente, copie a chave pública e adicione-a nas configurações do seu perfil no Github/Gitlab.

Adicionando sua chave GPG à sua conta

Você pode adicionar uma chave GPG nas configurações do seu perfil do Github/Gitlab:

NOTA: Depois de adicionar a chave, você não poderá mais editá-la.

Github

  • No perfil do seu usuário
  • Clique em Settings
  • No menu vá em SSH and GPG keys clique no botão New GPG Key
  • Cole sua chave pública no campo Key.

Gitlab

  • No perfil do seu usuário
  • Clique em Settings
  • No menu vá em GPG keys e cole sua chave pública no campo Key.

Associando sua chave GPG com o Git

1. Use o seguinte comando para listar a chave GPG privada que você acabou de criar:

gpg --list-secret-keys --keyid-format LONG mr@robot.sh

Substitua mr@robot.sh pelo endereço de e-mail que você digitou acima.

2. Copie o ID da chave GPG que começa com o sec. Ex: 30F2B65B9246B6CA:

sec   rsa4096/30F2B65B9246B6CA 2017-08-18 [SC]
      D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA
uid                   [ultimate] Mr. Robot 
ssb   rsa4096/B7ABC0813E4028C0 2017-08-18 [E]

3. Diga ao Git para usar essa chave para assinar os commits:

git config --global user.signingkey 30F2B65B9246B6CA

Substitua 30F2B65B9246B6CA pela ID da chave GPG.

Assinando seus commits

Depois de ter criado sua chave GPG e adicionado a sua conta, você pode começar a assinar seus commits:

1. Continue trabalhando com o Git como você costumava, a única diferença é a adição da flag -S:

git commit -S -m "My commit msg"

2. Digite a senha da sua chave GPG quando solicitado.

git config --global commit.gpgsign true

Se você não quiser digitar a flab -S sempre que efetuar um commit, você pode dizer ao Git que assine-os automaticamente:

git config --global commit.gpgsign true

Verificando seus commits

Para visualizar a verificação dos seu commits, após realizar um novo commit verificado, vá na interface do repositório (no navegador) e clique em commits.

Lá é possível validar todos os envios assinados realizados.
Segurança da informação sempre em primeiro lugar.

Se gostou compartilhe!


Thiago Pereira Rosa

GPG: 4096R/80E2E272 – thiagor [at] engineer.com
GPG: 4096R/4FE374E0 – thiago [at] fretebras.com.br