Зачем 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
ветвь.