Wie verhindere ich, dass Apache das .git-Verzeichnis bedient?

74

Ich habe angefangen, Git für die Bereitstellung von Websites zum Testen zu verwenden. Wie verhindere ich, dass Apache den Inhalt des Git-Verzeichnisses bereitstellt?

Ich habe es versucht

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

ohne erfolg.

Ich weiß, dass ich in jedem .git-Verzeichnis eine .htaccess-Datei erstellen und den Zugriff verweigern kann, aber ich wollte etwas, das ich in die Hauptkonfigurationsdatei einfügen kann, die diese Datei für alle Websites global macht.

Shoan
quelle
3
Sobald Sie Apache daran gehindert haben, das Verzeichnis zu bedienen, müssen Sie möglicherweise auch das .git-Verzeichnis mit "IndexIgnore .git" ausblenden, wenn Sie Indizes für Ihr Verzeichnis aktiviert haben.
Ryan

Antworten:

55

Es funktioniert nicht, weil Sie in der Regel "svn" und nicht "git" haben. Alles was Sie tun müssen, ist das 'svn' durch 'git' zu ersetzen.

<Directorymatch "^/.*/\.git/">
Order deny,allow
Deny from all
</Directorymatch>
Sinping
quelle
1
Wenn ich eine .htaccess-Datei erstelle, die nur Ihren Code enthält, wird folgende Fehlermeldung angezeigt: "<DirectoryMatch hier nicht zulässig"
Shoan
2
Es muss in der Apache conf sein. Siehe: httpd.apache.org/docs/1.3/mod/core.html#directorymatch
sinping
2
Der einfachste Regex ist<DirectoryMatch /\.git/>
Bachsau
Überprüfen Sie dies für die perfekte Lösung magento.stackexchange.com/questions/202840/…
Pratik Kamani
Erstens dank Singing / OP. Beachten Sie, dass in Apache 2.4 "Order, Deny" und die nächste Zeile durch "Require all denied" ersetzt wurden. Bei vielen Installationen heißt die Datei mit dem Namen "Apache conf" "httpd.conf". Die Verwendung von singping war nur eine beiläufige Aussage. Suchen Sie also nicht nach diesem wörtlichen Namen (sollte wahrscheinlich selbstverständlich sein, aber Sie wissen es nie) wie die Leute es lesen könnten).
Kevin_Kinsey
139

Dies hat den gleichen Effekt wie viele andere Antworten, ist jedoch viel einfacher:

RedirectMatch 404 /\.git

Dies kann in .htaccessoder Ihre Server-Konfigurationsdatei gehen. Es verbirgt alle Dateien oder Verzeichnisse, deren Name mit " 404" beginnt .git(z. B. ein .gitVerzeichnis oder eine .gitignoreDatei). Somit wird nicht nur der Inhalt Ihres Git-Repos ausgeblendet, sondern auch dessen Existenz.

Bennett McElwee
quelle
2
Ich mag diese Lösung wirklich. Es ist einfach und elegant.
Shoan
2
Das Einfügen in das Stammverzeichnis von htdocs erledigt ebenfalls einen globalen Job.
jor
4
Ich liebe diese Option auch am besten. Mir scheint, dass es sicherer ist, einen 404 für Anfragen wie /.git oder /.gitignore zurückzugeben, so dass die Tatsache, dass git überhaupt verwendet wird, nicht von außen bestimmt werden kann.
Ezra Free
2
Beachten Sie, dass, wenn Sie Verzeichnislisten aktiviert haben, die .gitOrdner weiterhin sichtbar sind, Sie jedoch die 404 erhalten, wenn Sie versuchen, auf sie zuzugreifen.
Andy Madge
1
@BennettMcElwee Ja, es gibt so gut wie keinen guten Grund, die Verzeichnisliste auf einem Produktionsserver global zu aktivieren. Ich dachte nur, es verdient eine Erwähnung, falls es jemanden erwischt.
Andy Madge
13

Wenn Sie keine .htaccess-Dateien verwenden, sondern stattdessen die Datei /etc/apache2/httpd.conf (oder die Master-Conf-Datei Ihres Servers) verwenden möchten, um sowohl .git-Verzeichnisse als auch .gitignore-Dateien auszublenden, können Sie Folgendes verwenden. Ich fand die Antwort oben für Master Conf-Einstellung die Gitignore-Datei nicht versteckt.

# 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
quelle
1
Blockieren Sie die www.example.com/.git/configDatei in Apache httpd 2.4.27 nicht.
Ilhan
12

Wenn Sie einen Shared Hosting Service nutzen und keinen Zugriff auf apache.conf haben , können Sie dies dennoch in Ihrer .htaccess-Datei tun:

RewriteEngine On
RewriteRule "^(.*/)?\.git/" - [F,L]
Danorton
quelle
danke, das hat bei mir in einer Shared-Hosting-Situation funktioniert, in der die beste Antwort nicht
Plato
6
### never deliver .git folders, .gitIgnore
RewriteRule ^(.*/)?\.git+ - [R=404,L]

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

Dies funktioniert in .htaccess, kein http.confZugriff erforderlich. Schließen Sie dies als erste der Umschreiberegeln ein. Bei Rewrite OnBedarf voranstellen .

Aus Sicherheitsgründen bevorzuge ich einen falschen 404-Wert gegenüber einem 403-Wert, der für den Angreifer informativer ist. Kommentieren Sie eines der beiden aus, um sicherzustellen, dass das andere auch für Sie funktioniert.

Übrigens, gute Änderungen sind, dein Lithmus-Test für die beiden ist:

http://localhost/.gitignore
http://localhost/.git/HEAD
Frank Nocke
quelle
Warum haben beide Regeln? Der einfachere RedirectMatch allein reicht aus. (Auch die Regexes scheinen nicht ganz richtig - warum das Plus am Ende?)
Bennett McElwee
Persönliche Paranoia / doppelte Sicherheit. Wenn RewriteEngine abgestellt wird (zentrale Konfigurationsänderungen, schlechte Teamkommunikation, unglückliches Server "Update", ... Sie nennen es :-) Das + ist veraltet oder sollte ein guter Punkt sein! (Keine Zeit zum Testen, sorry.)
Frank Nocke
Wenn Sie befürchten, dass RewriteEngine ausgeschaltet ist, stellen RewriteEngine OnSie es einfach vor Ihre RewriteRule. Trotzdem ist es tautologisch und redundant, da der einfachere RedirectMatch für sich alleine ausreicht. Auch das könnte vereinfacht werden. Grundsätzlich empfehle ich stattdessen meine Antwort . :)
Bennett McElwee
+1 für den Lackmustest.
5

Um sowohl das Git-Verzeichnis als auch andere Dateien wie Gitignore und Gitmodules mit Hilfe von HTAccess zu schützen, verwenden Sie:

RewriteEngine On
RewriteRule ^(.*/)?\.git+ - [F,L]
ErrorDocument 403 "Access Forbidden"
scribu
quelle
4
Funktioniert für mich, jedoch hat das nachfolgende ErrorDocument keine Auswirkungen. Aus sicherheitstechnischer Sicht würde ich dem Angreifer einen falschen 404 über einen informativen 403 vorstellen ...
Frank Nocke
1
Dies ist eine schlechte Idee, da sie Informationen an Hacker weitergibt. Ein 403 bedeutet, dass es da ist, ein 404 bedeutet, dass es nicht da ist. Jede Tatsache im Setup eines Servers ist für einen Hacker nützlich. Ich würde überlegen, dies zu überarbeiten.
GerardJP
3

Ich füge immer die folgende Zeile in die vhost-Vorlage ein

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

Nur um sicherzugehen, dass niemand auf VCS-spezifische Daten zugreifen kann. Funktioniert perfekt.

ALex_hha
quelle
1

Angenommen, Ihr Webserver verwendet einen anderen Benutzer als den, mit dem Sie auf das .git-Repository zugreifen, können Sie das Ausführungsbit für andere Benutzer im .git-Verzeichnis deaktivieren.

Dies sollte mit anderen Webservern funktionieren und ist nicht auf leistungsintensive .htaccess-Dateien angewiesen.

Martijn
quelle
1

Für diejenigen, die einfach alle "versteckten" Dateien und Verzeichnisse auf einer Linux-Distribution ablehnen möchten (im Allgemeinen alle Dateien, die mit einem "." Beginnen), gilt Folgendes für Apache 2.4, wenn sie im Serverkonf-Kontext platziert werden:

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

Und hier ist der ältere Apache 2.2-Stil (gleicher regulärer Ausdruck, nur verschiedene Auth-Direktiven):

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

Dann haben Sie keine Sorgen machen .gitoder .svnspeziell. Das würde auch zu Dingen wie .htaccessund von .htpasswdNatur aus passen .

Persönlich mag ich es, 403s für solche Anfragen anstelle von 404s auszugeben, aber Sie könnten leicht eine RewriteRule anstelle von Auth Denial verwenden, wie folgt:

<FilesMatch "^\.(.*)$">
    RewriteRule "^(.*)$" - [R=404,L]
</FilesMatch>
<DirectoryMatch "/\.(.*)">
    RewriteRule "^(.*)$" - [R=404,L]
</DirectoryMatch>
Ldennison
quelle
0

Sie möchten wahrscheinlich auch das Servieren verweigern .gitignore.

Dateien, die mit einem Punkt beginnen, werden unter Linux ausgeblendet.

Daher nur alles, was mit einem Punkt beginnt:

RedirectMatch 404 /\.

Vladimir Kornea
quelle
0

Das ist etwas spät, aber meine Antwort ist etwas anders, also dachte ich, ich würde es hinzufügen. Dies muss in der httpd.conf-Datei gehen. Das <Files "*">verschachtelte Element im <Directory>Tag blockiert alle Dateien im Verzeichnis.

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