Jak mogę zapobiec udostępnianiu katalogu .git przez apache?

74

Zacząłem używać git do wdrażania stron internetowych do testowania. Jak zapobiec udostępnianiu zawartości katalogu .git przez apache?

próbowałem

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

bez powodzenia.

Wiem, że mogę utworzyć plik .htaccess w każdym katalogu .git i odmówić dostępu, ale chciałem czegoś, co mógłbym umieścić w głównym pliku konfiguracyjnym, który uczyni to globalnym we wszystkich witrynach.

Shoan
źródło
3
Po zablokowaniu obsługi apache przez katalog może być konieczne ukrycie katalogu .git za pomocą „IndexIgnore .git”, jeśli masz włączone indeksy w swoim katalogu.
Ryan,

Odpowiedzi:

55

To nie działa, ponieważ masz w regule „svn”, a nie „git”. Wszystko, co musisz zrobić, to zamienić „svn” na „git”.

<Directorymatch "^/.*/\.git/">
Order deny,allow
Deny from all
</Directorymatch>
grzeszący
źródło
1
Kiedy tworzę plik .htaccess zawierający tylko twój kod, pojawia się błąd: „<
Dopasowanie
2
Musi znajdować się w conf Apache. Zobacz: httpd.apache.org/docs/1.3/mod/core.html#directorymatch
grzesząc
2
Najprostszym wyrażeniem regularnym jest<DirectoryMatch /\.git/>
Bachsau,
Sprawdź to, aby znaleźć idealne rozwiązanie magento.stackexchange.com/questions/202840/…
Pratik Kamani
1. dzięki śpiewaniu / OP. Zauważ, że w Apache 2.4 „Kolejność, odmowa” i następny wiersz zostały zastąpione przez „Wymagaj wszystkich odrzuconych”. Ponadto wiele instalacji, które plik o nazwie „Apache conf” powyżej nosi nazwę „httpd.conf” - użycie śpiewu było zwykłą instrukcją, więc nie szukaj tej dosłownej nazwy (prawdopodobnie powinno być oczywiste, ale nigdy nie wiesz jak ludzie mogą to przeczytać).
Kevin_Kinsey
139

Ma to taki sam efekt, jak wiele innych odpowiedzi, ale jest o wiele prostsze:

RedirectMatch 404 /\.git

Może to przejść do .htaccesspliku konfiguracyjnego serwera. Ukrywa każdy plik lub katalog, którego nazwa zaczyna się od .git(np. .gitKatalog lub .gitignoreplik), zwracając kod 404. Tak więc nie tylko ukryta jest zawartość repozytorium Git, ale także jego istnienie.

Bennett McElwee
źródło
2
Naprawdę podoba mi się to rozwiązanie. To proste i eleganckie.
Shoan
2
Umieszczenie tego w katalogu głównym htdocs również ma globalne znaczenie.
Jor
4
Uwielbiam tę opcję również najlepiej. Wydaje mi się, że bezpieczniej jest zwrócić 404 dla żądań takich jak /.git lub /.gitignore, tak że fakt, że nawet używany jest git, nie może być ustalony z zewnątrz.
Ezra za darmo
2
Pamiętaj, że jeśli masz włączone .gitkatalogi , foldery będą nadal widoczne, ale dostaniesz 404, gdy spróbujesz uzyskać do nich dostęp.
Andy Madge
1
@BennettMcElwee tak, zgadza się, że prawie nigdy nie ma dobrego powodu, aby globalnie włączać wyświetlanie katalogów na serwerze produkcyjnym. Pomyślałem, że zasługuje na wzmiankę na wypadek, gdyby kogoś złapał.
Andy Madge
13

Jeśli nie używasz plików .htaccess, ale zamiast tego chcesz użyć /etc/apache2/httpd.conf (lub cokolwiek innego głównego pliku konfiguracyjnego serwera), aby ukryć zarówno katalogi .git, jak i pliki .gitignore, możesz skorzystać z następujących opcji. Znalazłem powyższą odpowiedź dla ustawienia master conf nie ukrywało pliku 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>
Kyle Sloan
źródło
1
Nie blokuj www.example.com/.git/configpliku w Apache httpd 2.4.27.
ilhan
12

Jeśli korzystasz z usługi hostingu współdzielonego i nie masz dostępu do apache.conf , nadal możesz to zrobić w pliku .htaccess:

RewriteEngine On
RewriteRule "^(.*/)?\.git/" - [F,L]
Danorton
źródło
dzięki, to działało dla mnie w sytuacji hostingu dzielonego, gdzie najlepsza odpowiedź nie
Platon
6
### never deliver .git folders, .gitIgnore
RewriteRule ^(.*/)?\.git+ - [R=404,L]

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

To działa .htaccess, nie http.confwymaga dostępu. Uwzględnij to jako pierwszą z reguł przepisywania. Przygotuj w Rewrite Onrazie potrzeby.

Z punktu widzenia bezpieczeństwa wolę fałszywy 404 niż 403, bardziej informacyjny dla atakującego. Skomentuj jeden z dwóch, aby upewnić się, że drugi również działa dla ciebie.

Btw, dobre zmiany, twój test lithmus dla tych dwóch to:

http://localhost/.gitignore
http://localhost/.git/HEAD
Frank Nocke
źródło
Dlaczego obie zasady? Prostsze RedirectMatch wystarczy samo. (Również wyrażenia regularne nie wydają się całkiem poprawne - dlaczego plus na końcu?)
Bennett McElwee
Osobista paranoja / podwójne bezpieczeństwo. Jeśli RewriteEngine zostanie wyłączony (zmiany w centralnej konfiguracji, słaba komunikacja w zespole, pechowa „aktualizacja” serwera, ... nazwij to :-) + jest przestarzały lub powinien być $, dobra uwaga! (nie ma czasu na testowanie, przepraszam.)
Frank Nocke
Jeśli obawiasz się, że RewriteEngine może być wyłączony, po prostu umieść go RewriteEngine Onprzed RewriteRule. Ale w każdym razie jest tautologiczna i zbędna, ponieważ sama prostota RedirectMatch wystarczy. Chociaż nawet to można uprościć. Zasadniczo polecam zamiast tego moją odpowiedź . :)
Bennett McElwee
+1 za test lakmusowy.
5

Aby chronić zarówno katalog .git, jak i inne pliki, takie jak .gitignore i .gitmodules za pomocą .htaccess, użyj:

RewriteEngine On
RewriteRule ^(.*/)?\.git+ - [F,L]
ErrorDocument 403 "Access Forbidden"
scribu
źródło
4
Działa dla mnie, jednak końcowy ErrorDocument nie ma wpływu. Z punktu widzenia bezpieczeństwa
wyobrażam
1
To zły pomysł, ponieważ ujawnia informacje hakerom. 403 oznacza, że ​​tam jest, 404 oznacza, że ​​go nie ma. Każdy fakt w konfiguracji serwera jest użyteczny dla hakera. Zastanowiłbym się, czy to zmienić.
GerardJP,
3

Zawsze dodam następujący wiersz do szablonu vhost

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

Tylko dla pewności, że nikt nie ma dostępu do danych specyficznych dla VCS. Działa idealnie.

ALex_hha
źródło
1

Zakładając, że twój serwer używa innego użytkownika niż ten, którego używasz do uzyskania dostępu do repozytorium .git, możesz wyłączyć bit wykonywania dla innych w katalogu .git.

Powinno to działać z innymi serwerami WWW i nie opierać się na energochłonnych plikach .htaccess.

Martijn
źródło
1

Dla tych, którzy chcą po prostu odrzucić wszystkie „ukryte” pliki i katalogi w dystrybucji Linuksa (ogólnie wszystkie pliki rozpoczynające się od „.”), Oto, co działa na Apache 2.4, gdy jest umieszczony w kontekście konf:

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

A oto starszy styl Apache 2.2 (ten sam regex, tylko inne dyrektywy autoryzacyjne):

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

Wtedy nie musisz się martwić .gitani .svnkonkretnie. To również pasowałoby do rzeczy podobnych .htaccessi .htpasswdnieodłącznych.

Osobiście lubię wydawać 403 dla takich żądań zamiast 404, ale możesz łatwo użyć RewriteRule zamiast odmowy autoryzacji, na przykład:

<FilesMatch "^\.(.*)$">
    RewriteRule "^(.*)$" - [R=404,L]
</FilesMatch>
<DirectoryMatch "/\.(.*)">
    RewriteRule "^(.*)$" - [R=404,L]
</DirectoryMatch>
Lendenison
źródło
0

Prawdopodobnie chcesz również odmówić serwowania .gitignore.

Pliki zaczynające się od kropki są ukryte w systemie Linux.

Dlatego tylko 404 wszystkiego, co zaczyna się od kropki:

RedirectMatch 404 /\.

Vladimir Kornea
źródło
0

Jest trochę późno, ale moja odpowiedź jest nieco inna, więc pomyślałem, że to dodam. Musi to znaleźć się w pliku httpd.conf. <Files "*">Zagnieżdżone wewnątrz <Directory>znacznika blokuje wszystkie pliki w katalogu.

# 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
źródło