Как я могу запретить Apache обслуживать каталог .git?

74

Я начал использовать git для развертывания веб-сайтов для тестирования. Как я могу запретить Apache обслуживать содержимое каталога .git?

Я пытался

<Directorymatch "^/.*/\.svn/">
Order deny,allow
Deny from all
</Directorymatch>

без успеха.

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

Shoan
источник
3
Как только вы запретили Apache обслуживать каталог, вам также может понадобиться скрыть каталог .git с помощью «IndexIgnore .git», если в вашем каталоге включены индексы.
Райан

Ответы:

55

Это не работает, потому что у вас есть «svn», а не «git» в правиле. Все, что вам нужно сделать, это заменить svn на git.

<Directorymatch "^/.*/\.git/">
Order deny,allow
Deny from all
</Directorymatch>
sinping
источник
1
Когда я создаю .htaccess, содержащий только ваш код, я получаю ошибку: «<DirectoryMatch здесь не разрешен»
Shoan
2
Это должно быть в Apache Conf. См .: httpd.apache.org/docs/1.3/mod/core.html#directorymatch
sinping
2
Самое простое регулярное выражение<DirectoryMatch /\.git/>
Бахсау
Проверьте это для идеального решения magento.stackexchange.com/questions/202840/…
Пратик Камани
Во-первых, благодаря Singping / OP. Обратите внимание, что в Apache 2.4 строка «Порядок, отклонить» и следующая строка были заменены на «Требовать все отклонено». Кроме того, во многих установках файл с именем «Apache conf» выше называется «httpd.conf» - использование singping было просто случайным утверждением, поэтому не ищите это буквальное имя (возможно, само собой разумеется, но вы никогда не знаете как люди могут читать это).
Kevin_Kinsey,
139

Это имеет тот же эффект, что и многие другие ответы, но намного проще:

RedirectMatch 404 /\.git

Это может войти в .htaccessили ваш файл конфигурации сервера. Он скрывает любой файл или каталог, имя которого начинается с .git(например, .gitкаталог или .gitignoreфайл), возвращая 404. Таким образом, не только содержимое вашего репозитория Git скрыто, но и само его существование скрыто.

Беннет МакЭлви
источник
2
Мне очень нравится это решение. Это просто и элегантно.
Shoan
2
Помещение этого в корневой каталог htdocs также выполняет глобальную работу.
Джор
4
Люблю этот вариант как нельзя лучше. Мне кажется, что более безопасно возвращать 404 для запросов типа /.git или /.gitignore, так что тот факт, что git даже используется, не может быть определен извне.
Эзра Фри
2
Имейте в виду, что если у вас включены списки каталогов, .gitпапки все равно будут видны, но вы получите 404 при попытке доступа к ним.
Энди Мэдж
1
@BennettMcElwee, да, согласен, почти никогда не бывает веской причины для включения глобального списка каталогов на рабочем сервере. Просто подумал, что заслуживает упоминания на случай, если кого-то поймает.
Энди Мэдж
13

Если вы не используете файлы .htaccess, а вместо этого хотите использовать /etc/apache2/httpd.conf (или каким-либо другим основным файлом conf вашего сервера), чтобы скрыть как каталоги .git, так и файлы .gitignore, вы можете использовать следующее. Я нашел ответ выше, для настройки master conf не скрывал файл gitignore.

# do not allow .git version control files to be issued
<Directorymatch "^/.*/\.git+/">
  Order deny,allow
  Deny from all
</Directorymatch>
<Files ~ "^\.git">
    Order allow,deny
    Deny from all 
</Files>
Кайл Слоан
источник
1
Не блокируйте www.example.com/.git/configфайл в Apache httpd 2.4.27.
Ильхан
12

Если вы пользуетесь услугами общего хостинга и не имеете доступа к apache.conf , вы все равно можете сделать это в своем файле .htaccess, например так:

RewriteEngine On
RewriteRule "^(.*/)?\.git/" - [F,L]
danorton
источник
спасибо это работает для меня в общем - хостинге ситуации , когда верхний ответ не сделал
Plato
6
### never deliver .git folders, .gitIgnore
RewriteRule ^(.*/)?\.git+ - [R=404,L]

# 2nd line of defense (if no mod_rewrite)
RedirectMatch 404 ^(.*/)?\.git+

Это работает .htaccess, http.confдоступ не требуется. Включите это как первое из правил переписывания. Приготовьте Rewrite Onпри необходимости.

С точки зрения безопасности я предпочитаю фиктивную 404, а не 403, более информативную для атакующего. Прокомментируйте одно из двух, чтобы убедиться, что другое работает и для вас.

Кстати, хорошие изменения, ваш тест на лакмус для двух:

http://localhost/.gitignore
http://localhost/.git/HEAD
Фрэнк Нок
источник
Почему оба правила? Более простой RedirectMatch достаточно сам по себе. (Кроме того, регулярные выражения кажутся не совсем правильными - почему плюс в конце?)
Беннет МакЭлви,
Личная Паранойя / Удвоенная безопасность. Если RewriteEngine отключился (изменения в центральной конфигурации, плохая коммуникация в команде, неудачное «обновление» сервера, ... вы называете это :-) Знак + устарел или должен быть $, хорошая точка! (нет времени на тестирование, извините.)
Фрэнк Нок
Если вы беспокоитесь о том, что RewriteEngine может быть отключен, просто поставьте RewriteEngine Onперед вашим RewriteRule. Но в любом случае это тавтологический и избыточный, потому что более простой RedirectMatch достаточно сам по себе. Хотя даже это можно упростить. В основном я рекомендую мой ответ вместо этого. :)
Беннет МакЭлви
+1 за лакмусовый тест.
5

Чтобы защитить каталог .git, а также другие файлы, такие как .gitignore и .gitmodules, использующие .htaccess, используйте:

RewriteEngine On
RewriteRule ^(.*/)?\.git+ - [F,L]
ErrorDocument 403 "Access Forbidden"
scribu
источник
4
Работает для меня, однако конечный ErrorDocument не оказывает никакого влияния. С точки зрения безопасности, мне бы хотелось, чтобы злоумышленник подделал 404 над информативным 403 ...
Фрэнк Нок
1
Это плохая идея, потому что она раскрывает информацию хакерам. 403 означает, что это есть, 404 означает, что это не так. Каждый факт в настройке сервера полезен для хакера. Я хотел бы пересмотреть это.
GerardJP
3

Я всегда добавляю следующую строку в шаблон vhost

RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)

Просто чтобы быть уверенным, что никто не может получить доступ к конкретным данным VCS. Работает отлично.

ALex_hha
источник
1

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

Это должно работать с другими веб-серверами и не полагаться на ресурсоемкие файлы .htaccess.

Мартейн
источник
1

Для тех, кто хочет просто запретить все «скрытые» файлы и каталоги в дистрибутиве Linux (как правило, все файлы, начинающиеся с «.»), Вот что работает на Apache 2.4, когда помещается в контекст conf сервера:

<FilesMatch "^\.(.*)$">
    Require all denied
</FilesMatch>
<DirectoryMatch "/\.(.*)">
    Require all denied
</DirectoryMatch>

А вот более старый стиль Apache 2.2 (тот же regex, только разные директивы auth):

<FilesMatch "^\.(.*)$">
    Order deny,allow
    Deny from all
</FilesMatch>
<DirectoryMatch "/\.(.*)">
    Order deny,allow
    Deny from all
</DirectoryMatch>

Тогда вам не нужно беспокоиться .gitили .svnконкретно. Это также соответствует вещам, как .htaccessи по .htpasswdсвоей сути.

Лично мне нравится выдавать 403 для таких запросов вместо 404, но вы можете легко использовать RewriteRule вместо отказа в аутентификации, например так:

<FilesMatch "^\.(.*)$">
    RewriteRule "^(.*)$" - [R=404,L]
</FilesMatch>
<DirectoryMatch "/\.(.*)">
    RewriteRule "^(.*)$" - [R=404,L]
</DirectoryMatch>
ldennison
источник
0

Вы, вероятно, хотите отрицать и служение .gitignore.

Файлы, начинающиеся с точки, скрыты в Linux.

Поэтому всего 404 всего, что начинается с точки:

RedirectMatch 404 /\.

Владимир Корнеа
источник
0

Это немного поздно, но мой ответ немного отличается, поэтому я решил добавить его. Это должно быть в файле httpd.conf. <Files "*">Вложенный внутри <Directory>тега будет блокировать все файлы в каталоге.

# GitHub Directory
<Directory /var/www/html/yoursite/.git>
   Order Deny,Allow
   Deny from all
   <Files "*">
     Order Deny,Allow
     Deny from all
   </Files>
</Directory>
# GitHub files
<Files .gitignore>
  order Deny,Allow
  Deny from all
</Files>
jonnyjandles
источник