Можно ли «отключить» git-clone через http? - PullRequest
12 голосов
/ 28 августа 2009

Я использую git для управления крошечным проектом. Я выполнял все свои транзакции (клонирование, push, pull и т. Д.) Через SSH, но недавно запустил git-update-server-info, потому что хотел поэкспериментировать с запуском git-clone через http. Это работало отлично. Здорово. Теперь я понимаю, что любой может клонировать мой репозиторий через http без каких-либо учетных данных. Я смутно осведомлен о настройке http-аутентификации с помощью gitosis, но на самом деле это не то, чего я хочу. Я бы предпочел просто полностью отключить клонирование http.

Могу ли я сказать git разрешить транзакции только через ssh? Или я могу отменить то, что сделал, когда запустил git-update-server-info, чтобы сначала включить клонирование по http?

Ответы [ 3 ]

16 голосов
/ 28 августа 2009

Чтобы репозиторий git был доступен через HTTP-транспорт, его необходимо «экспортировать» (любым) веб-сервером. Если ваш репозиторий (точнее его каталог .git) виден снаружи в веб-браузере, то его можно клонировать или извлекать анонимно по протоколу HTTP. git update-server-info используется для генерации дополнительной вспомогательной информации помощника (.git/objects/info/packs и .git/info/refs) для клона (или выборки), чтобы узнать, что доступно.

Итак, вам нужно либо удалить эти два файла (.git/objects/info/packs и .git/info/refs) , либо просто сделать так, чтобы ваш репозиторий был недоступен через Интернет, возможно изменение разрешений таким образом, чтобы пользователь, с которого работает веб-сервер (обычно «никто», «www» или «apache»), не имел доступа к .git хранилищу. Или настройте веб-сервер , чтобы он не экспортировал (не отображал) ваш репозиторий.

Протокол HTTP (в настоящее время) является так называемым «тупым» протоколом, что означает, что он обслуживает файлы как есть, а управление доступом осуществляется сервером [тупой], в данном случае используемым веб-сервером (или файловой системой). .

Я полагаю, что ваш репозиторий не экспортируется веб-сервером, поэтому вам не о чем беспокоиться: ваш репозиторий недоступен по HTTP .

Обратите внимание, что обычно для Git-репозиториев существует анонимный неаутентифицированный доступ только для чтения, и требуется аутентификация только для записи в репозиторий, т. Е. Push (по крайней мере, для проектов с открытым исходным кодом)

2 голосов
/ 29 декабря 2016

Есть ли способ, которым я могу сказать git разрешать транзакции только через ssh?

от 6 до 8 лет позже, Git 2.12 (первый квартал 2017 года) предложит конфигурацию для разрешения или отключения протокола, используемого Git.

 git config protocol.http.allow never
 git config protocol.https.allow never
 git config protocol.git.allow never
 git config protocol.file.allow never

 git config protocol.ssh.allow always

См. commit abcbdc0 (14 декабря 2016) от Джефф Кинг (peff) .
См. commit a768a02 , commit aeae4db , commit f1762d7 , commit f962ddf , commit 85e4205 (14 декабря 2016 г.) Брэндон Уильямс (mbrandonw) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 9d540e9 , 27 декабря 2016 г.)

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

git config теперь включает в себя:

protocol.allow

Если установлено, укажите пользовательскую политику по умолчанию для всех протоколов, у которых явно нет политики (protocol.<name>.allow).
По умолчанию, если не установлено,

  • известные безопасные протоколы (http, https, git, ssh, file) имеют политику по умолчанию always,
  • известные опасные протоколы (ext) имеют политику по умолчанию never и
  • все остальные протоколы имеют политику по умолчанию user.

Поддерживаемые политики:

  • always - протокол всегда можно использовать.
  • never - протокол никогда не может быть использован.
  • user - протокол можно использовать только тогда, когда GIT_PROTOCOL_FROM_USER либо не установлен, либо имеет значение 1.
    Эта политика должна использоваться, когда вы хотите, чтобы протокол был непосредственно доступен пользователю, но не хотите, чтобы он использовался командами, которые выполняют команды clone / fetch / push без ввода пользователя, например, рекурсивная инициализация субмодуля.
1 голос
/ 28 августа 2009

Удалить .git/objects/info/packs и .git/info/refs

...