Каковы преимущества и недостатки криптографического подписывания коммитов и тегов в Git?

109

Поэтому кто-то из коллег просмотрел мою работу и сказал, что я всегда должен подписывать свои коммиты и теги криптографически. Когда его спросили, почему, он не знал, как мне это объяснить, и сказал: «Это просто хорошая вещь».

Пытаясь избежать очевидного сценария шимпанзе , почему я должен на самом деле? Неужели так много явных преимуществ и нет недостатков?

По каким практическим причинам я хочу подписать каждый коммит и сделанный мной тэг?

Мадара Учиха
источник
3
Я предполагаю, что это так, что есть бумажный след, связывающий коммит с вами. Я никогда раньше не подписывал коммит, ни с помощью git, ни с какой-либо другой системой контроля версий. Если ваш коллега считает, что существует риск мошеннических коммитов, возможно, у вашей компании большие проблемы с безопасностью.
Джеймс
@James: Это не работа компании, но я участвую в некоторых проектах с открытым и закрытым исходным кодом.
Мадара Учиха,
@James: "большие проблемы с безопасностью" --- как что? Подписание - это технический способ их решения, не так ли?
zerkms
8
mikegerwitz.com/papers/git-horror-story.html является отправной точкой для случая использования подписанных коммитов и тегов.
1
@James, когда вы делаете коммит, используя свою учетную запись SVN, вы подписываете свой коммит. Когда вы фиксируете свою конфигурацию git global, вы являетесь единственным авторитетом, подтверждающим, что вы являетесь автором.
Флориан Маргейн

Ответы:

102

(Это в значительной степени основано на «Истории ужасов Git: целостность репозитория с подписанными коммитами» - очень хорошее чтение и больше информации, чем я мог бы вставить в ответ.)

Существует несколько способов, с помощью которых репозиторий git может быть скомпрометирован (это не недостаток безопасности, а просто факт жизни - из-за этого не следует избегать использования git). Например, кто-то, возможно, подтолкнул к вашему хранилищу, утверждая, что вы. Или, если на то пошло, кто-то мог подтолкнуть к чьему- либо хранилищу, утверждая, что вы - вы (кто-то мог подтолкнуть к своему собственному хранилищу, утверждая, что вы тоже). Это просто часть жизни в DVCS.

Просто в качестве примера:

$ git config --global user.name 'Madara Uchiha'
$ git config --global user.email muchiha@example.com

Там я изменил свою конфигурацию git, притворившись, что я - ты. И теперь я могу сделать коммит и позволить этим коммитам каким-то образом попасть в производственную сборку, и похоже, что вы это сделали.

Подписав коммиты (и теги), можно доказать, что определенные коммиты и теги были от вас (а вещи, которые не подписаны, не должны были попасть в рабочую сборку). Это действительно ключ ко всему - подписывая коммиты, вы говорите, что это ваша работа.

Аспект «твоя работа» особенно важен в ядре linux (и, следовательно, в git), в который иногда попадают иски об авторских правах. Подписывая коммиты, вы говорите, что имеете право на программное обеспечение - оно отслеживает происхождение. Может случиться так, что у вас нет доступа к источнику, который заявлен как авторское право, и заявка является необоснованной. Возможно, компания забыла, что вы работали на них несколько лет назад и под их руководством добавили материал в ядро ​​или что-то в этом роде.

Есть некоторые дебаты относительно того, должен ли каждый коммит быть подписан. От подписи GPG для git commit? (в далеком 09 году) Линус писал:

Подписывать каждый коммит абсолютно глупо. Это просто означает, что вы автоматизируете это, и вы делаете подпись на сумму меньше. Это также не добавляет никакой реальной ценности, поскольку, как работает цепочка мерзких DAG в SHA1, вам когда-либо понадобится только одна подпись, чтобы все коммиты, достижимые из этого, были эффективно охвачены этим. Так что подписание каждого коммита просто упускает смысл.

Более подробную информацию о том, как войти в git, можно прочитать там же.

Тем не менее, он в любом случае превратился в мерзавца.

Похоже, что большинство согласны с тем, что подписывать коммиты не нужно, но подписывать теги очень хорошо. Этот пост в блоге, связанный сверху, предполагает, что в любом случае нужно все подписывать. Как я уже сказал, есть некоторые споры о том, необходим ли каждый коммит или нет.

Ключ к дискуссии «подписать каждый коммит», вероятно, связан с используемым вами рабочим процессом. Большинство людей совершают кучу коммитов в своем локальном репо, а затем выдвигают этот набор. Этого должно быть достаточно, чтобы пометить окончательную коллекцию (при условии, что вы убедитесь, что все изменения верны). Если вы работаете в среде, в которой перемещается множество отдельных коммитов, различие между тегом и коммитом становится менее… четким, и подписывание коммитов может стать более полезным.

haykam
источник
5
Этого может быть достаточно (просто пометить последний), но почему бы вам просто не пометить каждый коммит?
Хайд
3
Как ленивый ублюдок, который не использует теги, я обновляю предыдущий комментарий. В git config на моей рабочей станции у меня есть, commit.gpgsign = trueи я не могу установить никаких недостатков. Хотя это может быть глупо, это не кажется слишком дорогим.
Пновотнак
3
Я пойду с @pnovotnak, почему бы тебе не сделать это? Я имею в виду, я подписываю свои коммиты, а другой разработчик не участвует в том же проекте, кого это волнует? Но если хакер попытается украсть мою личность, я могу указать на подпись. Сдается мне, что подпись имеет только преимущества. Я согласен, что ваша подпись приобретает меньшую ценность, но вы обмениваете ее на отсутствие необходимости думать об этом. Это в основном бесплатная безопасность.
Джаппи Керк
2
Мое личное мнение таково, что подписание каждого коммита - это хорошо. Я могу быть совершенно уверен, что коммиты с моей подписью исходят от меня, тогда как банально выдавать себя за автора с ванильным мерзавцем просто. Я бы скорее назвал это бесплатной проверкой, это человек, которого вы в противном случае предполагаете, а не охрана.
Берто
1
@JosiahYoder. Нет, Github не откажется от отправки, потому что электронная почта не работает. Допустим, вы размещали свой код в другом сервисе (например, Bitbucket) и хотели перенести свой репозиторий другому провайдеру. Это не позволит пользователям передавать репозиторий (несколько коммитов несколькими пользователями) или создавать зеркала и т. Д. Это особенность DVCS.
Рики Нотаро-Гарсия