Как подписывать коммиты в Git

DNTSK · October 19, 2020

Spoofing пользователей в GitHub

В github есть одна небольшая проблема. Мы можем выдать добавленный коммит за авторство любого другого человека. Для этого надо всего лишь выполнить несколько комманд:

$ git config user.name "John Doe"
$ git config user.email "[email protected]"
$ touch badcode.js
$ git add .
$ git commit -m 'add some bad code as jim'
$ git push

Вот и все. Теперь John Doe сильно удивится, увиделв свой коммит, который он никогда не делал.

Как от этого защититься?

GPG подпись коммитов

Чтоб подписывать коммиты и GitHub показывал плашку Verified нужно сделать следующее:

1. Устанавливаем необходимое

$ brew install gnupg pinentry

2. Генерируем ключи

$ gpg --gen-key

Real name: Firstname Lastname
Email address: [email protected]
You selected this USER-ID:
    "Firstname Lastname <[email protected]>"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? O [Enter]
┌──────────────────────────────────────────────────────┐
│ Please enter the passphrase to                       │
│ protect your new key                                 │
│                                                      │
│ Passphrase: ________________________________________ │
│                                                      │
│       <OK>                              <Cancel>     │
└──────────────────────────────────────────────────────┘

$ gpg --list-secret-keys --keyid-format LONG

В выводе вы должны увидеть нечто похожее на:

/Users/username/.gnupg/pubring.kbx
------------------------------
sec   rsa2048/FB3F3623BCF1390C 2020-10-05 [SC] [expires: 2022-10-05]

ВНИМАНИЕ: FB3F3623BCF1390C - это id вашего ключа. У вас он будет отличаться

3. Загружаем на GitHub

$ gpg --armor --export FB3F3623BCF1390C

В ответ вы получите публичную часть ключа:

-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBF97dRABCADXumQFHIPd2CMYwWpSskzP/Un7BmxPbFdDEYQYUqbVFO1eZgl2
...
=uoVP
-----END PGP PUBLIC KEY BLOCK-----

Теперь переходим в раздел SSH and GPG keys и добавляем полученный публичный ключ.

4. Настраиваем gpg-agent

В файл конфига вашего шелла (.zshrc или .bashrc) добавляем запуск агента:

# This check to make sure the GPG Agent is running and if not, starts it
if [[ -f "~/.gnupg/.gpg-agent-info" && -n "$(pgrep gpg-agent)" ]]; then    
  source ~/.gnupg/.gpg-agent-info
  export GPG_AGENT_INFO
else
  eval $(eval $(gpg-agent --daemon --options ~/.gnupg/gpg-agent.conf))
fi

Теперь создаем несколько файлов конфигурации:

~/.gnupg/gpg-agent.conf

# Allows gpg-agent to use the OSX keychain to store the gpg key's 
# passphrase so you don't have to type it each time you commit to 
# git
pinentry-program /usr/local/bin/pinentry-mac

~/.gnupg/gpg.conf

use-agent
batch
no-tty

Перезапускаем gpg-agent

$ gpg-connect-agent reloadagent /bye

5. Настраиваем git для подписи

Осталось только сказать git, что можно подписывать коммиты:

$ git config user.signingkey FB3F3623BCF1390C
$ git config commit.gpgsign true

Теперь делаем коммит и пуш и проверяем, что у нас появился значек Verified в веб-интерфейсе GitHub.

Twitter, Facebook