Зачем Git нужны подписанные толчки?

В примечаниях к выпуску Git 2.2.0 описывается новая опция git push, --signed:

"git push" learned "--signed" push, that allows a push (i.e.
request to update the refs on the other side to point at a new
history, together with the transmission of necessary objects) to be
signed, so that it can be verified and audited, using the GPG
signature of the person who pushed, that the tips of branches at a
public repository really point the commits the pusher wanted to,
without having to "trust" the server.

Похоже, что данные, отправляемые на сервер во время отправки, подписываются, чтобы сервер мог проверить и записать, кто сделал отправку. в man На страницах вы можете подтвердить это:

--signed
   GPG-sign the push request to update refs on the receiving side, 
   to allow it to be checked by the hooks and/or be logged. See 
   git-receive-pack[1] for the details on the receiving end.

Вы смотрите в man страницы для git-receive-pack под pre-receive а также post-recieve ловит, чтобы увидеть, как именно проверить подписанный толчок.

Кажется, что все это помогает серверу проверить, кто на самом деле делает толчок, кто они говорят, что они.

Как git push --signed помочь вам (толкачу) в том, чтобы не "доверять" серверу? Все, что я видел до сих пор, говорит о том, что это помогает серверу доверять вам. Что еще более важно, почему подписанные коммиты и подписанные теги недостаточны для передачи на ненадежный сервер? Зачем нам вообще нужны подписанные толчки?

3 ответа

Решение

Вот выдержка из сообщения фиксации, в котором представлены подписанные нажатия:

While signed tags and commits assert that the objects thusly signed
came from you, who signed these objects, there is not a good way to
assert that you wanted to have a particular object at the tip of a
particular branch.  My signing v2.0.1 tag only means I want to call
the version v2.0.1, and it does not mean I want to push it out to my
'master' branch---it is likely that I only want it in 'maint', so
the signature on the object alone is insufficient.

The only assurance to you that 'maint' points at what I wanted to
place there comes from your trust on the hosting site and my
authentication with it, which cannot easily audited later.

Таким образом, хотя коммит подписан, вы не можете быть уверены, что автор намеревался передать этот коммит в ветку. master или в филиал super-experimental-feature, Подписанные push-сообщения позволяют серверу регистрировать каждое push-событие и его подпись. Затем этот журнал можно проверить, чтобы увидеть, что каждый коммит действительно был предназначен для определенной ветки.

Хотя подписанные push-сообщения позволяют серверу сохранять записи о каждом push-событии и его подписи, он может не записать нужного пользователя до Git 2.19 (Q3 2018):

" git send-pack --signed "(отсюда" git push --signed msgstr "по протоколу http) не прочитал идентификатор пользователя из механизма конфигурации, чтобы определить, кого подписывать как сертификат push, что было исправлено.

См. Коммит d067d98 (12 июня 2018 г.) от Masaya Suzuki ( draftcode )
(Объединено Юнио С Хамано - gitster - в коммите 8d3661d, 28 июня 2018 г.)

builtin/send-pack: заполнить конфиги по умолчанию

builtin/send-pack не звонил git_default_config и из-за этого git push --signed не уважал имя пользователя и адрес электронной почты в gitconfig в HTTP-транспорте.

Краткий ответ заключается в том, что цельgit push --signedзаключается в предотвращении совершения повторных атак.

Если вы нажмете подписанную фиксацию непроверенного/небезопасного кода наexperimentalветке, то кто-то другой может воспроизвести эту фиксацию в ветке, и она по-прежнему будет отображаться как подписанная вами, даже если вы никогда не собирались отправлять этот код вmasterветвь.

Другие вопросы по тегам