Каковы преимущества и недостатки криптографического подписывания коммитов и тегов в 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, можно прочитать там же.

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

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

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


5
Этого может быть достаточно (просто пометить последний), но почему бы вам просто не пометить каждый коммит?
— Хайд

3
Как ленивый ублюдок, который не использует теги, я обновляю предыдущий комментарий. В git config на моей рабочей станции у меня есть, commit.gpgsign = trueи я не могу установить никаких недостатков. Хотя это может быть глупо, это не кажется слишком дорогим.
— Пновотнак

3
Я пойду с @pnovotnak, почему бы тебе не сделать это? Я имею в виду, я подписываю свои коммиты, а другой разработчик не участвует в том же проекте, кого это волнует? Но если хакер попытается украсть мою личность, я могу указать на подпись. Сдается мне, что подпись имеет только преимущества. Я согласен, что ваша подпись приобретает меньшую ценность, но вы обмениваете ее на отсутствие необходимости думать об этом. Это в основном бесплатная безопасность.
— Джаппи Керк

2
Мое личное мнение таково, что подписание каждого коммита - это хорошо. Я могу быть совершенно уверен, что коммиты с моей подписью исходят от меня, тогда как банально выдавать себя за автора с ванильным мерзавцем просто. Я бы скорее назвал это бесплатной проверкой, это человек, которого вы в противном случае предполагаете, а не охрана.
— Берто

1
@JosiahYoder. Нет, Github не откажется от отправки, потому что электронная почта не работает. Допустим, вы размещали свой код в другом сервисе (например, Bitbucket) и хотели перенести свой репозиторий другому провайдеру. Это не позволит пользователям передавать репозиторий (несколько коммитов несколькими пользователями) или создавать зеркала и т. Д. Это особенность DVCS.
— Рики Нотаро-Гарсия
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.