Любой способ гарантировать, что пользователь git не использует фальшивую информацию об аккаунте при коммите и нажатии? - PullRequest
5 голосов
/ 14 декабря 2011

Поскольку пользователи git могут свободно конфигурировать свои user.name и user.email и делать коммиты, Джон может подделать коммит с именем Боба и адресом электронной почты, а это не то, что нам нужно. Есть ли способ предотвратить это? Я знаю, что в SVN нам нужно имя пользователя и пароль для фиксации; есть ли эквивалентный механизм в Git?

Ответы [ 3 ]

1 голос
/ 15 декабря 2011

Считаете ли вы, что коммиты должны быть подписаны ключом gpg?

http://mwop.net/blog/236-GPG-signing-Git-Commits и отклонять что-либо, отправленное без такового.Это позволило бы вам проверить, кто бы ни совершил изменение (возможно, с некоторой работой это может быть автоматизировано на сервере)

В качестве альтернативы реализация системы экспертной оценки для двойной проверки материала перед объединением может решить эту проблему (позволяя доверенным\ другие вещи для двойной проверки изменений (хотя заставить их просматривать каждый коммит было бы немного раздражающим)) Использование такого инструмента, как gerrit, вероятно, будет лучшей системой для этого.Хотя простая версия может быть создана с системой разрешений gitolites.

Gitolite позволит вам указать разрешения для пространства имен (и репо).Позволяет вам контролировать доступ к различным областям и иметь рабочий код, доступный только доверенным лицам, которые проверяют и объединяют изменения.

Хотя все это требует технологического решения социологической проблемы.Моя предпочтительная рекомендация - «Маллет любящей коррекции».

1 голос
/ 22 ноября 2014

Другой способ, также основанный на подписанном gpg, состоит в том, чтобы подписать саму операцию push (а не объект , такой как тег или коммит)

Это то, что предлагает Git 2.2 (ноябрь 2014), с commit a85b377 , Junio ​​C Hamano (gitster) :

push: начало "git push --signed"

Хотя подписанные теги и коммиты утверждают, что подписанные таким образом объекты пришли от вас, подписавших эти объекты, нет хорошего способа утверждать, что вы хотите иметь конкретный объект на кончике определенной ветви.
Мой подписывающий тег v2.0.1 только означает, что я хочу вызвать версию v2.0.1, и это не означает, что я хочу отправить его в мою ветку 'master' - скорее всего, я хочу только в ' maint ', поэтому подписи на одном объекте недостаточно.

Единственное заверение для вас, что 'maint' указывает на то, что я хотел разместить там, зависит от вашего доверия к хостинг-сайту и моей аутентификации на нем, что не может быть легко проверено позже.

Представьте механизм, который позволяет вам подписывать «push-сертификат» (из-за отсутствия более подходящего имени) каждый раз, когда вы нажимаете, утверждая, что какой объект вы нажимаете для обновления, какой ref, который раньше указывал на какой-либо объект .

Думайте об этом как о криптографической защите обновлений ссылок, аналогично подписанным тегам / фиксациям, но работающим по ортогональной оси.

Основной поток, основанный на этом механизме, выглядит так:

  1. Вы выдвигаете свою работу с помощью "git push --signed".

  2. Отправляющая сторона узнает, где находятся удаленные ссылки, как обычно, и какое расширение протокола поддерживает принимающая сторона.
    Если принимающая сторона не объявляет расширение протокола "push-cert", попытка "git push --signed" завершается неудачей.
    В противном случае в основном готовится текстовый файл, который выглядит следующим образом:

certificate version 0.1
pusher Junio C Hamano <gitster@pobox.com> 1315427886 -0700

7339ca65... 21580ecb... refs/heads/master
3793ac5... 12850be... refs/heads/next

Файл начинается с нескольких строк заголовка, которые могут увеличиваться по мере накопления опыта.
Заголовок 'pusher' записывает имя подписавшего (значение переменной конфигурации user.signingkey, возвращаясь к GIT_COMMITTER_{NAME|EMAIL}) и время генерации сертификата.
После заголовка следует пустая строка, за которой следует копия строк протокольного сообщения.

Каждая строка показывает старое и новое имя объекта в конце ссылки, которую этот push пытается обновить, способом, идентичным тому, как базовый протокол обмена "git push" сообщает обновлению ссылки принимающей стороне ( записывая «старое» имя объекта, push-сертификат также защищает от повторного воспроизведения).
Ожидается, что новые типы пакетов команд, отличные от вида old-new-refname, будут включены в push-сертификат таким же образом, как и в обычных пакетах команд в виде беззнаковых нажатий.

Затем пользователя просят подписать этот push-сертификат, используя GPG, отформатированный способом, аналогичным тому, как подписываются объекты подписанного тега, и результат отправляется на другую сторону (т.е. receive-pack).

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

  1. Когда принимающая сторона видит push-сертификат, сертификат записано как капля Крюк предварительного получения может узнать о сертификат путем проверки переменной среды GIT_PUSH_CERT, который, если присутствует, сообщает имя объекта этого BLOB-объекта и делает решение разрешить или отклонить этот толчок. Кроме того, Хук post-receive также может посмотреть на сертификат, который может быть хорошее место для регистрации всех полученных сертификатов на потом проверок.

Поскольку push-сертификат содержит ту же информацию, что и обычные командные пакеты при обмене протоколами, мы можем опустить последний, когда используется push-сертификат, и сократить издержки протокола.

0 голосов
/ 14 декабря 2011

Некоторые сложные решения возможны, я думаю:

  • Требуется учетная запись SSH для доступа к хранилищу;создайте один репозиторий для каждого авторизованного пользователя.
  • Создайте в каждом репозитории хуки, которые переписывают помещенные в коммиты сведения, включающие информацию об авторе, которому репозиторий «принадлежит».основной репозиторий.

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

gitosis или gitolite могут также предлагать некоторые подобные функции, я не знаю, я никогда не использовал их.

Лично я бы предпочел не работать с людьмикоторый может серьезно помешать информации об авторе коммита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...