Сделать веб-каталог .git недоступным

130

У меня есть веб-сайт, на котором я использую github (закрытый исходный код) для отслеживания изменений и обновления сайта. Единственная проблема в том, что каталог .git доступен через Интернет. Как я могу остановить это и по-прежнему использовать git?

Стоит ли использовать .htaccess? Следует ли мне изменить разрешения для .git?

Крис Мюнч
источник
должен быть на serverfault
tback
8
Находится на serverfault: serverfault.com/questions/128069/…
scribu

Ответы:

39

Создайте .htaccessфайл в .gitпапке и поместите в этот файл следующее:

Order allow,deny
Deny from all

Но учтите, что он будет потерян, если вы когда-нибудь повторно клонируете репозиторий.

ThiefMaster
источник
38
Верно, но я бы не рекомендовал помещать его в сам .git/каталог, потому что он будет потерян, если вы когда-нибудь повторно клонируете репозиторий.
Джейк Уортон,
Это неприятно, если у вас более одного каталога .git, и это необходимо сделать заново, если вы когда-либо повторно клонируете каталог.
Bennett McElwee
1
Я пробовал это и обнаружил, что это работает, НО это и, по-видимому, ЛЮБОЕ решение, которое помещает этот параметр в .git /, имеет 2 недостатка, упомянутых выше, первый кажется худшим, плюс третий, возможно, худший из всех: цитата недоступен), в том числе о том, как это делается, когда и кем, является небольшим, но все же ключом к данным (особенно для его безопасности, включая анализ, когда и до того, как он не выполняется должным образом), НО в .git / это НЕ является частью собственно данных ( включая версионные, общие и хорошо сохраненные), так что также НЕ восстанавливается ... аналогично тому, как лучше всего поставить .gitignore с собственными данными, а не в .git /.
Destiny Architect
3
Почему это принятый ответ, а не ответ Беннета? Его простой и эффективный метод решения этой проблемы.
Джош Франкель
1
Скорее всего, потому что OP принял это за два года до того, как был опубликован другой;)
ThiefMaster
380

Поместите это в .htaccessфайл в корне вашего веб-сервера:

RedirectMatch 404 /\.git

Это надежное и безопасное решение : оно

  • работает для всех .gitкаталогов на вашем сайте, даже если их больше одного,
  • также скрывает другие файлы Git, такие как .gitignoreи.gitmodules
  • работает даже для недавно добавленных .gitкаталогов, и
  • даже не выдает того факта, что каталоги существуют.
Беннетт МакЭлви
источник
1
Это сработало с .gitпапкой, но я все еще мог загрузить .gitignoreфайл.
Курт Эмч
Мое регулярное выражение работает в моем тестировании и должно работать в соответствии с документацией RedirectMatch, поскольку регулярное выражение должно соответствовать только части URL-адреса, а не полному URL-адресу: см. Примечание "тонкие различия" в связанной документации AliasMatch . Тем не менее, документы - это одно, а реальный мир - другое. Регулярное выражение @artlogic действительно соответствует полному URL-адресу, поэтому, возможно, в Apache есть некоторые различия в версиях, или я просто неправильно читаю.
Беннетт МакЭлви
2
@BennettMcElwee - после внимательного изучения документации и выполнения нескольких тестов, похоже, что подстановочные знаки мне вообще не нужны. Спасибо за решение. Прекрасно работает!
artlogic
Согласно документации apache2, вы также можете поместить его в другой контекст конфигурации:server config, virtual host, directory, .htaccess
bennos,
Я бы даже предложил добавить ". *" В конце выражения, чтобы не было доступа к файлам / папкам в .git / ->RedirectMatch 404 /\.git.*
Dimitri Hautot
33

Оба .htaccessи разрешения для .git/папки будут работать. Я рекомендую первое:

<Directory .git>
    order allow,deny
    deny from all
</Directory>
Джейк Уортон
источник
Есть ли другой способ сделать с apache, поскольку мне не разрешено использовать директиву <Directory> из-за настроек сервера.
Крис Мюнч
2
Есть все виды способов согласования (например, <Files>, <FilesMatch>).
Джейк Уортон,
4
Этот ответ совершенно неверен - каталоги просто не разрешены в файлах .htaccess. Это не зависит от настроек сервера.
отмечен удвоением
2
NI8VDY = Ошибка 1 из 1, когда я пробовал это: на виртуальном хостинге Dreamhost я поместил это в корневой каталог веб-сайта .htaccess, затем http: в корень веб-сайта дал цитату об ошибке журналов сервера (.. <Каталог здесь не разрешен). 2 комментатора уже предупреждают об этой проблеме, и последняя говорит цитата (каталог просто не разрешен в файлах .htaccess) и см. Официальную документацию каталога httpd.apache.org/docs/current/mod/core.html#directory say quote (Context: server config, виртуальный хост), а не .htaccess. Но у этого есть 26 голосов, поэтому те, кто находит, как работать с этим из .htaccess, ПОЖАЛУЙСТА, ОБНОВИТЕ РЕШЕНИЕ, объясняя.
Destiny Architect
Согласитесь с @DestinyArchitect - извините за отрицательный голос, но это заблуждение.
kael
7

Я не хотел возиться с .gitкаталогом и не смог заставить решение Беннета работать на Apache 2.2, но добавление следующего в мою <VirtualHost>конфигурацию сработало:

RewriteRule ^.*\.git.* - [R=404]
Дэвид Молес
источник
5

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

Вот несколько подробных инструкций, надеюсь, они помогут. Я использую Ubuntu 16.10.

  1. Сначала проверьте, что произойдет, если вы перейдете в папку .git в браузере. В моем случае мне был представлен список каталогов. Если вы видите то, чего не должны видеть (т. Е. Вы не получаете 404), сделайте следующее.
  2. Используйте apache2ctl -V, чтобы получить HTTPD_ROOT и SERVER_CONFIG_FILE
  3. Используйте это, чтобы отредактировать конфигурацию apache, в моем случае $ sudo nano /etc/apache2/apache2.conf
  4. Добавьте в файл конфигурации следующее: RedirectMatch 404 /.git
  5. Перезапустите apache: $ sudo service apache2 restart
  6. Теперь должен получить 404, если вы снова перейдете в папку
  7. Я пробовал это с .gitignore, а также получил 404
Крис Б.
источник
4

Более надежным и простым вариантом было бы отключение разрешений READ и Execution для .gitкаталога.

Поскольку в основном Apache (httpd) работает под специальной учетной записью пользователя, например, он запускается как пользователь apacheв CentOS, в то время как .gitкаталог должен быть создан под реальной учетной записью пользователя, поэтому мы можем просто заблокировать доступ, изменив разрешение. Более того, этот подход не вводит никаких новых файлов и не влияет на команды git.

Команда может быть:

chmod -R o-rx .git
Hailong
источник
На машине, где SA не хотят использовать .htaccess и не хотят, чтобы я возился с их файлами httpd.conf -type, это кажется лучшим решением.
Alien Life Form
1
Очевидным недостатком является то, что если вы повторно клонируете, вам придется не забыть запустить chmodснова.
Лаури Нурми
3

mod_rewrite даст вам желаемый эффект:

RewriteEngine on
RewriteRule .*\.git/.* - [F]
Кош
источник
9
Это уязвимость, связанная с раскрытием информации: она позволяет людям легко определить существование .gitкаталога, поскольку он возвращает запрещенный код, а не Not Found.
Bennett McElwee
2
Использование git не является уязвимостью
Адам,
1

Вместо того, чтобы возиться с .htaccessправилами, как предлагают большинство ответов, почему бы просто не поместить .git/каталог над корневым веб-каталогом?

В моих настройках мой .gitкаталог обычно находится примерно в:

/home/web/project_name/.git/

Мой настоящий код живет в

/home/web/project_name/www_root/

поскольку мой веб-корень (как определено на Apache или Nginx .. Я предпочитаю последний) /home/web/project_name/www_root/, .gitкаталог не может быть доступен из Интернета, поскольку он находится «выше», чем веб-корневой каталог.

Хавьер Ларруле
источник
так public_html - это подкаталог рабочего каталога репо ?? звучит интересно
Хайден Тринг
Нет, это не подкаталог. Они оба являются «братьями и сестрами» в моем основном каталоге проекта. В моем project_nameкаталоге есть два подкаталога: www_rootгде находятся файлы, которые фактически обслуживаются, когда посетитель просматривает мой сайт, и .gitгде находится репо. Получение обновлений из репо www_rootи его содержимого. Дело в том, что, поскольку .gitкаталог иерархически расположен «над» моим фронт-контроллером, он недоступен через Интернет.
Хавьер Ларруле,
Я думаю, это то, что я имел в виду, так что у вас есть / home / user / public_html / и /home/user/.git
Хайден Тринг
вау, это такое легкое и простое решение, его гениальность, (не то, чтобы создать блокировку всего сервера в apache security.conf сложно), единственное, на что следует обращать внимание, - это если у вашего хостинга есть какие-то странные настройки прав собственности / разрешений на publlic_html, может измениться.
Хайден Тринг,
1
очень верно ... У меня на самом деле есть другие "родственные каталоги" для других целей, которые остаются недоступными из Интернета, что позволяет мне немного лучше спать по ночам :)
Хавьер Ларруле