Machen Sie den Zugriff auf das .git-Verzeichnis web unzugänglich


129

Ich habe eine Website, auf der ich Github (Closed Source) verwende, um Änderungen zu verfolgen und die Website zu aktualisieren. Das einzige Problem ist, dass das .git-Verzeichnis anscheinend über das Web zugänglich ist. Wie kann ich damit aufhören und trotzdem Git verwenden?

Soll ich .htaccess verwenden? Sollte ich die Berechtigungen von .git ändern?


sollte auf Serverfehler sein
tback

Antworten:


39

Erstellen Sie eine .htaccessDatei im .gitOrdner und fügen Sie Folgendes in diese Datei ein:

Order allow,deny
Deny from all

Beachten Sie jedoch, dass es verloren gehen würde, wenn Sie das Repository jemals neu klonen würden


38
Stimmt, aber ich würde empfehlen, es nicht in das .git/Verzeichnis selbst zu stellen, da es verloren gehen würde, wenn Sie das Repository jemals neu klonen würden.
Jake Wharton

Dies ist ein Problem, wenn Sie mehr als ein .git-Verzeichnis haben, und muss erneut durchgeführt werden, wenn Sie das Verzeichnis jemals neu klonen.
Bennett McElwee

1
Ich habe es versucht und festgestellt, dass es funktioniert, ABER diese und scheinbar JEDE Lösung, die diese Einstellung innerhalb von .git / platziert, hat die 2 oben genannten Nachteile, wobei der erste am schlimmsten erscheint, plus ein dritter, vielleicht am schlimmsten: das Zitat (Make .git directory web unzugänglich), einschließlich der Art und Weise, wie es wann und von wem gemacht wird, ist klein, aber immer noch der Schlüssel zu den Daten (insbesondere für seine Sicherheit, einschließlich der Analyse, wenn & bevor es nicht richtig gemacht wurde), ABER in .git / es ist NICHT wirklich Teil der eigentlichen Daten ( einschließlich versioniert & geteilt & gut erhalten) also auch NICHT wiederhergestellt ... analog zu einem am besten gesetzten .gitignore mit den richtigen Daten und nicht in .git /.
Destiny Architect

3
Warum ist dies die akzeptierte Antwort und nicht die von Bennett? Seine Technik ist einfach und effektiv, um dies zu lösen.
Josh Frankel

1
Höchstwahrscheinlich, weil OP dies zwei Jahre vor der
Veröffentlichung

378

Fügen Sie dies in eine .htaccessDatei im Stammverzeichnis Ihres Webservers ein:

RedirectMatch 404 /\.git

Diese Lösung ist robust und sicher : es

  • funktioniert für alle .gitVerzeichnisse auf Ihrer Site, auch wenn es mehr als eines gibt,
  • versteckt auch andere Git-Dateien wie .gitignoreund.gitmodules
  • funktioniert auch für neu hinzugefügte .gitVerzeichnisse und
  • verrät nicht einmal die Tatsache, dass die Verzeichnisse existieren.

1
Es funktionierte für den .gitOrdner, aber ich konnte die .gitignoreDatei trotzdem zum Abrufen bringen.
Kurt Emch

Mein Regex funktioniert in meinen Tests und sollte gemäß der RedirectMatch-Dokumentation funktionieren, da der Regex nur mit einem Teil der URL übereinstimmen muss, nicht mit der vollständigen URL: siehe den Hinweis "subtiler Unterschied" in der verknüpften AliasMatch-Dokumentation . Trotzdem sind die Dokumente eine Sache, die reale Welt eine andere. Der @ artlogic-Regex stimmt mit der vollständigen URL überein, daher gibt es möglicherweise einige Versionsunterschiede in Apache, oder ich verstehe die Dinge nur falsch.
Bennett McElwee

2
@BennettMcElwee - Nachdem ich mir die Dokumentation genauer angesehen und einige Tests durchgeführt habe, sieht es so aus, als wären die Platzhalter für mich doch nicht notwendig. Danke für die Lösung. Funktioniert super!
Artlogic

Laut den apache2-Dokumenten können Sie es auch in einen anderen Konfigurationskontext stellen:server config, virtual host, directory, .htaccess
bennos

Ich würde sogar vorschlagen, ". *" Am Ende des Ausdrucks hinzuzufügen, damit auf keine Datei / Ordner unter .git / zugegriffen werden kann ->RedirectMatch 404 /\.git.*
Dimitri Hautot

33

Beides .htaccessund Berechtigungen für den .git/Ordner würden funktionieren. Ich empfehle das erstere:

<Directory .git>
    order allow,deny
    deny from all
</Directory>

Gibt es eine andere Möglichkeit, mit Apache umzugehen, da ich die <Directory> -Direktive aufgrund der Servereinstellungen nicht verwenden darf?
Chris Muench

2
Es gibt alle Arten von Möglichkeiten der Anpassung (zB <Files>, <FilesMatch>).
Jake Wharton

4
Diese Antwort ist völlig falsch - Verzeichnis ist in .htaccess-Dateien einfach nicht erlaubt. Dies hängt nicht von den Servereinstellungen ab.
Doppelt markiert

2
NI8VDY = Fehler in dem 1 von 1 Mal, in dem ich es versucht habe: Beim gemeinsamen Hosting von Dreamhost habe ich dies in den .htaccess des Stammverzeichnisses der Website eingefügt und dann http: zum Website-Stammverzeichnis Fehlerprotokoll für Serverprotokolle angegeben (.. <Verzeichnis hier nicht zulässig). 2 Kommentatoren weisen bereits auf dieses Problem hin und sagen zuletzt Zitat (Verzeichnis ist in .htaccess-Dateien einfach nicht zulässig) und siehe offizielle Verzeichnisdokumente httpd.apache.org/docs/current/mod/core.html#directory say quote (Kontext: Server config, virtueller Host) und damit nicht .htaccess. Aber das hat Stimmen 26, also erklären diejenigen, die herausfinden, wie man das aus .htaccess heraus macht, PLS UPDATE THE SOLUTION.
Destiny Architect

Stimmen Sie @DestinyArchitect zu - entschuldigen Sie die Ablehnung, aber das ist irreführend.
Kael

7

Ich wollte nicht im .gitVerzeichnis herumspielen und konnte Bennetts Lösung nicht für Apache 2.2 verwenden, aber das Hinzufügen von Folgendem zu meiner <VirtualHost>Konfiguration hat funktioniert:

RewriteRule ^.*\.git.* - [R=404]

5

Ich bin nicht zufrieden damit, den Zugriff auf meine .git-Ordner einzeln zu steuern und dies über die Apache-Konfiguration anstelle von .htaccess zu tun, um zu verhindern, dass ich sie überschreibe oder eine Neuinstallation vergesse usw.

Hier sind einige detaillierte Anweisungen, die hoffentlich helfen. Ich benutze Ubuntu 16.10.

  1. Überprüfen Sie zunächst, was passiert, wenn Sie in einem Browser zum Ordner .git navigieren. In meinem Fall wurde mir eine Verzeichnisliste angezeigt. Wenn Sie sehen, was Sie nicht sehen sollten (dh Sie erhalten keine 404), gehen Sie wie folgt vor.
  2. Verwenden Sie apache2ctl -V, um HTTPD_ROOT und SERVER_CONFIG_FILE abzurufen
  3. Verwenden Sie diese Option, um Ihre Apache-Konfiguration zu bearbeiten, in meinem Fall $ sudo nano /etc/apache2/apache2.conf
  4. Fügen Sie irgendwo in der Konfigurationsdatei Folgendes hinzu: RedirectMatch 404 /.git
  5. Apache neu starten: $ sudo service apache2 restart
  6. Sollte dir jetzt eine 404 besorgen, wenn du wieder zum Ordner navigierst
  7. Ich habe das mit .gitignore versucht und auch eine 404 bekommen

4

Eine robustere und einfachere Option wäre das Deaktivieren der READ- und Execution-Berechtigung des .gitVerzeichnisses.

Da Apache (httpd) zum Beispiel meistens unter einem speziellen Benutzerkonto ausgeführt wird, wird es beispielsweise apacheunter CentOS als Benutzer ausgeführt , während das .gitVerzeichnis unter einem echten Benutzerkonto erstellt werden muss, sodass wir den Zugriff einfach durch Ändern der Berechtigung blockieren können. Darüber hinaus führt dieser Ansatz keine neue Datei ein und wirkt sich auch nicht auf die git-Befehle aus.

Der Befehl kann sein:

chmod -R o-rx .git

Auf einem Computer, auf dem die Sicherheitszuordnungen keine Verwendung von .htaccess wünschen und nicht möchten, dass ich mit ihren Dateien vom Typ httpd.conf herumspiele, scheint dies die beste Lösung zu sein.
Alien Life Form

1
Der offensichtliche Nachteil ist, dass Sie beim erneuten Klonen daran denken müssen, chmoderneut zu laufen .
Lauri Nurmi

3

mod_rewrite gibt dir den gewünschten Effekt:

RewriteEngine on
RewriteRule .*\.git/.* - [F]

9
Dies ist eine Sicherheitsanfälligkeit bezüglich der Offenlegung von Informationen: Sie erleichtert es den Benutzern, die Existenz des .gitVerzeichnisses zu bestimmen, da es einen verbotenen Code zurückgibt und nicht gefunden.
Bennett McElwee

2
Es ist keine Sicherheitslücke, Git zu benutzen
Adam

1

Anstatt mit .htaccessRegeln herumzuspielen , wie es die meisten Antworten vermuten lassen, sollten Sie das .git/Verzeichnis einfach über der Webroot platzieren.

In meinen Setups befindet sich mein .gitVerzeichnis normalerweise in folgenden Bereichen:

/home/web/project_name/.git/

Mein eigentlicher Code lebt in

/home/web/project_name/www_root/

Da mein Webstamm (wie in Apache oder Nginx definiert. Ich bevorzuge letzteres) /home/web/project_name/www_root/nicht auf das .gitVerzeichnis über das Web zugreifen kann, da es "höher" als das Webroot lebt


Also ist public_html ein Unterverzeichnis des Repo-Arbeitsverzeichnisses? klingt interessant
Hayden Thring

Nein, es ist kein Unterverzeichnis. Sie sind beide "Geschwister" in meinem Hauptprojektverzeichnis. Mein project_nameVerzeichnis hat zwei Unterverzeichnisse: www_rootWo sich die Dateien befinden, die tatsächlich bereitgestellt werden, wenn ein Besucher meine Website durchsucht, und .gitwo sich das Repo befindet. Aus den Repo-Updates www_rootund deren Inhalten ziehen. Die Sache ist, dass, da das .gitVerzeichnis hierarchisch "über" meinem Front-Controller ist, es über das Web nicht zugänglich ist.
Javier Larroulet

Ich denke, das habe ich gemeint, also haben Sie / home / user / public_html / und /home/user/.git
Hayden Thring

Wow, das ist eine so einfache und unkomplizierte Lösung, dass es genial ist (nicht, dass es schwierig ist, einen serverweiten Block in apache security.conf zu erstellen). Das einzige, worauf Sie achten müssen, ist, wenn Ihr Hosting einige seltsame Einstellungen für Besitz / Berechtigungen für publlic_html hat könnte sich ändern.
Hayden Thring

1
sehr wahr ... Ich habe tatsächlich andere "Geschwisterverzeichnisse" für andere Zwecke, auf die über das Internet nicht
zugegriffen werden kann
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.