Como fazer commits assinados com Keybase e PGP
Índice
Um recurso relativamente desconhecido e subutilizado do Git é a capacidade de assinar criptograficamente commits. É uma feature opcional que fornece uma maneira para o autor de um commit provar propriedade.
Ele usa a chave GPG do autor para deixar uma assinatura no commit que pode ser verificada mais tarde. Se você é um usuário do Keybase , é muito fácil usar a chave GPG do Keybase para assinar suas confirmações do Git.
Depois que você assinar seus commits, o GitHub fornece uma boa interface para verificar se os commits foram assinados e por quem.
Por que assinar commits?
O Git aceitará qualquer nome e endereço de e-mail como autor de commit e o GitHub também. Portanto, se você definir o autor no commit como um endereço de email válido, parecerá que ele fez o commit. Isso se deve à natureza distribuída do Git, que permite a qualquer pessoa dar push nos commits de outras pessoas. No entanto, do ponto de vista da segurança, isso é um problema.
Infelizmente, não há como impedir que alguém não consiga fazer um commit com seu nome e email. No entanto, o Git suporta commits assinados criptográficamente usando uma chave GPG. Isso permite que o GitHub marque seus commits como Verificados quando ele pode corresponder com seu email verificado à sua chave GPG. Isso não impedirá que alguém tente falsificar seus commits, mas garantirá suas confirmações reais para que os mesmos possam ser verificadas corretamente.
Keybase e GPG
Instalando Keybase
Ubuntu
64-bit
curl --remote-name https://prerelease.keybase.io/keybase_amd64.deb
sudo apt install ./keybase_amd64.deb
run_keybase
32-bit
curl --remote-name https://prerelease.keybase.io/keybase_i386.deb
sudo apt install ./keybase_i386.deb
run_keybase -g # run without GUI; it is not supported on 32-bit Linux
Mac
Instale o Keybase.dmg disponibilizado aqui
Instalando GPG
Ubuntu
apt gnupg
Mac
brew install gnupg
GitHub e Keybase
A partir daqui eu assumo que você criou uma conta no Github e no Keybase.
O GitHub fornece uma página de configurações para definir sua chave GPG; no entanto, se você enviar sua chave GPG bruta do Keybase, provavelmente ela conterá uma referência de usuário do Keybase: username@keybase.io
.
Este não é um endereço de e-mail ativo e, portanto, o GitHub não poderá verificar. Também não corresponde ao endereço de e-mail nos seus commits. Então, precisamos fazer mais algumas coisas para que tudo funcione.
Atualizando a chave PGP (do Keybase)
Primeiro, exporte suas chaves públicas e privadas do Keybase usando o comando:
keybase pgp export > keybase-public.key
keybase pgp export --secret > keybase-private.key
Durante o processo de exportação, o Keybase solicitará a senha da sua conta e solicitará que defina uma nova senha para o arquivo de chave privada.
No próximo passo, você precisa importar as chaves para o GPG:
gpg --allow-secret-key-import --import keybase-private.key
gpg --import keybase-public.key
O processo de importação solicitará a senha que você acabou de atribuir à sua chave privada.
Adicionando novos usuários
Agora que você importou a chave para o GPG, é necessário modificar a chave para incluir seu e-mail pessoal ou o e-mail da empresa. Se você não configurou nada, provavelmente seu idenficiador é <username>@keybase.io
, caso contrário, é o e-mail qeu você definiu no Keybase.
gpg --edit-key <username>@keybase.io
Este comando o abre o gpg>
e, a partir daí, você precisará executar o comando adduid
. Ele solicitará seu nome real (Real name
) e endereço de email (Email address
), fique à vontade para deixar o comentário (Comment
) em branco.
gpg> adduid
Real name: <your name>
Email address: <your email>
Comment:
You selected this USER-ID:
"<your name> <your email>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
Depois de fornecer seu nome e email, confirme usando O
e save
para fechar o gpg>
.
Feito isso, você pode enviar sua chave atualizada de volta ao Keybase.
keybase pgp update
Confiando na sua chave GPG
Nesse momento, sua chave não é confiável pelo GPG e está marcada como desconhecida (unknown
).
Se você está seguindo esse tutorial justamente para assinar commits do git, é importante que, ao auditar assinaturas (por exemplo, com git log --show-signatures
), você não veja suas assinaturas marcadas como não confiáveis (untrustworthy
).
Isso pode ser feito abrindo o gpg>
novamente usando gpg --edit-key <chave>
e selecionando a opção trust
. Sugiro usar o nível de confiança 5 = I trust ultimately
, pois é sua própria chave. Após aplicar a alteração, use save
para fechar.
Adicionando a chave no Github
Essa é a parte mais fácil, vá até seu perfil do Keybase (https://keybase.io/<username>
) e clique na chave pública na lista de identidades.
Vá em
Settings > SSH and GPG keys
no GHithub e adicione com o New GPG Key
.
Assinando os commits do Git
Finalmente, a última coisa necessária é informar o comando git
para assinar os commits com a sua chave.
Use a opção git config user.signingkey
para especificar o ID da chave para o git usar. Você pode obter isso na página de chaves GPG do GitHub onde você a adicionou, se não tiver certeza de qual é o ID.
Você também pode exigir que o Git assine todos os commits com a opção commit.gpgsign
:
git config --global user.signingkey <ID da Chave>
git config --global commit.gpgsign true
Commits Verificados
Qualquer commit futuro desse sistema/usuário será verificado, provando que você é o autor. A assinatura de commits git não inibirá a falsificação, mas fornecerá garantia de commits reais para que possam ser verificados corretamente.