Як я можу запобігти обслуговуванню апачу .git каталогу?


74

Я почав використовувати git для розгортання веб-сайтів для тестування. Як я можу запобігти обслуговуванню apache вмісту каталогу .git?

я намагався

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

без успіху.

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


3
Після того, як ви не зможете апачу обслуговувати каталог, вам може знадобитися приховати .git каталог із "IndexIgnore .git", якщо у вашому каталозі включені індекси.
Райан

Відповіді:


55

Це не працює, тому що у вас є "svn", а не "git" у правилі. Все, що вам потрібно зробити, це замінити 'svn' на 'git'.

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

1
Коли я створюю .htaccess, що містить лише ваш код, я отримую помилку: "<DirectoryMatch тут не дозволено"
Shoan

2
Це повинно бути в конф. Apache. Дивіться: httpd.apache.org/docs/1.3/mod/core.html#directorymatch
синпінг

2
Найпростіший регулярний вираз<DirectoryMatch /\.git/>
Бахсау

Перевірте це на ідеальне рішення magento.stackexchange.com/questions/202840/…
Pratik Kamani

По-перше, завдяки співу / ОП. Зауважте, що в Apache 2.4 "Порядок, відмовити" та наступний рядок були замінені на "Вимагати всіх відхилено". Крім того, багато установок, названий вище файлом "Apache conf", називається "httpd.conf" --- використання Singping було просто випадковою заявою, тому не шукайте цього буквального імені (мабуть, безперечно, але ви ніколи не знаєте як люди можуть це читати).
Kevin_Kinsey

139

Це має такий самий ефект, як і багато інших відповідей, але набагато простіше:

RedirectMatch 404 /\.git

Це може перейти в .htaccessконфігураційний файл вашого сервера. Він приховує будь-який файл або каталог, ім'я якого починається з .git(наприклад, .gitкаталог або .gitignoreфайл) поверненням 404. Отже, не тільки приховано вміст вашого репортажу Git, приховано і його існування.


2
Мені дуже подобається таке рішення. Це просто і елегантно.
Шоан

2
Поміщення цього в корінний каталог htdocs також виконує глобальну роботу.
jor

4
Любіть цей варіант також найкраще. Мені здається, що безпечніше повернути 404 для таких запитів, як /.git або /.gitignore, так що той факт, що git навіть використовується, не може бути визначений ззовні.
Безкоштовно Ezra

2
Майте на увазі, що якщо у вас включені списки каталогів, .gitпапки все одно будуть видні, але 404 ви отримаєте, коли спробуєте отримати доступ до них.
Енді Медж

1
@BennettMcElwee да, погодився, майже ніколи не є вагомою причиною включення списку каталогів у всьому світі на виробничому сервері. Просто подумав, що заслуговує згадки у випадку, якщо когось виловить.
Енді Медж

13

Якщо ви не використовуєте файли .htaccess, а натомість хочете використовувати /etc/apache2/httpd.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.
ilhan

12

Якщо ви користуєтесь спільним хостинговим сервісом і не маєте доступу до apache.conf , ви все одно можете зробити це у вашому .htaccess файлі, як це:

RewriteEngine On
RewriteRule "^(.*/)?\.git/" - [F,L]

дякую, що це спрацювало для мене в умовах спільного хостингу, де відповідь не була
Платон

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 достатній сам по собі. Хоча навіть це можна було б спростити. В основному я рекомендую натомість свою відповідь . :)
Bennett McElwee

+1 для лакмусового тесту.

5

Для захисту як .git каталогу, так і інших файлів, таких як .gitignore та .gitmodules за допомогою .htaccess, використовуйте:

RewriteEngine On
RewriteRule ^(.*/)?\.git+ - [F,L]
ErrorDocument 403 "Access Forbidden"

4
Працює для мене, однак трейлінг ErrorDocument не впливає. З точки
зору

1
Це погана ідея, оскільки вона розкриває інформацію хакерам. 403 означає, що він є, а 404 - це не так. Кожен факт налаштування сервера корисний для хакера. Я б розглядав можливість перегляду цього.
GerardJP

3

Я завжди додаю наступний рядок у шаблон vhost

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

Просто щоб бути впевненим, що ніхто не може отримати доступ до специфічних даних VCS. Працює ідеально.


1

Якщо припустити, що ваш веб-сервер використовує іншого користувача, ніж той, який ви використовуєте для доступу до сховища .git, ви можете вимкнути біт виконання для інших у каталозі .git.

Це має працювати з іншими веб-серверами і не покладатися на продуктивні .htaccess файли.


1

Для тих, хто хоче просто заперечувати всі "приховані" файли та каталоги в дистрибутиві Linux (як правило, всі файли, що починаються з "".

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

А ось старіший стиль Apache 2.2 (той самий регулярний вираз, просто різні авторські директиви):

<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>

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.