Spraw, aby katalog .git był niedostępny

134

Mam witrynę, na której używam github (zamknięte źródło) do śledzenia zmian i aktualizacji witryny. Jedynym problemem jest to, że wydaje się, że katalog .git jest dostępny przez internet. Jak mogę to zatrzymać i nadal korzystać z git?

Czy powinienem używać .htaccess? Czy powinienem zmienić uprawnienia .git?

Chris Muench
źródło
powinno znajdować się w
awarii serwera
8
Wystąpił błąd serwera

Odpowiedzi:

39

Utwórz .htaccessplik w .gitfolderze i umieść w tym pliku:

Order allow,deny
Deny from all

Ale pamiętaj, że zostanie utracone, jeśli kiedykolwiek ponownie sklonujesz repozytorium

ThiefMaster
źródło
38
To prawda, ale odradzałbym umieszczanie go w samym .git/katalogu, ponieważ zostałby utracony, gdybyś kiedykolwiek ponownie sklonował repozytorium.
Jake Wharton
Jest to uciążliwe, jeśli masz więcej niż jeden katalog .git i należy to zrobić ponownie, jeśli kiedykolwiek ponownie sklonujesz katalog.
Bennett McElwee
1
Próbowałem tego i stwierdziłem, że działa, ALE to i pozornie DOWOLNE rozwiązanie, które umieszcza to ustawienie w .git / ma 2 wspomniane powyżej wady, pierwsza wydaje się najgorsza, a trzecia może najgorsza ze wszystkich: cytat (Make .git directory web niedostępny), w tym sposób, w jaki jest to wykonywane, kiedy i przez kogo, jest mały, ale wciąż kluczowy dla danych (szczególnie ze względu na jego bezpieczeństwo, w tym analizę, kiedy i wcześniej nie została prawidłowo wykonana), ALE w .git / NIE jest to tak naprawdę część danych właściwych ( w tym wersjonowane, współdzielone i dobrze zachowane), więc również NIE przywracane ... analogicznie do jednego najlepiej wstawić .gitignore z właściwymi danymi, a nie w .git /.
Architekt Destiny,
3
Dlaczego jest to akceptowana odpowiedź, a nie Bennetta? Ma prostą i skuteczną technikę rozwiązania tego problemu.
Josh Frankel
1
Najprawdopodobniej dlatego, że OP zaakceptował to dwa lata przed opublikowaniem drugiego;)
ThiefMaster
384

Umieść to w .htaccesspliku w katalogu głównym swojego serwera internetowego:

RedirectMatch 404 /\.git

To rozwiązanie jest solidne i bezpieczne : it

  • działa dla wszystkich .gitkatalogów w Twojej witrynie, nawet jeśli jest ich więcej niż jeden,
  • ukrywa również inne pliki Git, takie jak .gitignorei.gitmodules
  • działa nawet dla nowo dodanych .gitkatalogów, a
  • nie zdradza nawet faktu, że katalogi istnieją.
Bennett McElwee
źródło
1
Działało w .gitfolderze, ale nadal mogłem pobrać .gitignoreplik.
Kurt Emch,
Moje wyrażenie regularne działa podczas moich testów i powinno działać zgodnie z dokumentacją RedirectMatch, ponieważ wyrażenie regularne musi pasować tylko do części adresu URL, a nie do pełnego adresu URL: zobacz uwagę o „subtelnej różnicy” w połączonej dokumentacji AliasMatch . Jednak dokumenty to jedno, a prawdziwy świat to drugie. Wyrażenie regularne @artlogic pasuje do pełnego adresu URL, więc może są jakieś różnice w wersjach w Apache lub po prostu źle czytam.
Bennett McElwee,
2
@BennettMcElwee - po bliższym przyjrzeniu się dokumentacji i przeprowadzeniu kilku testów wygląda na to, że symbole wieloznaczne nie są mi jednak potrzebne. Dzięki za rozwiązanie. Działa świetnie!
artlogic
Zgodnie z dokumentacją apache2 możesz również umieścić ją w innym kontekście konfiguracji:server config, virtual host, directory, .htaccess
bennos
1
Sugerowałbym nawet dodanie „. *” Na końcu wyrażenia, aby żaden plik / folder w .git / nie był dostępny ->RedirectMatch 404 /\.git.*
Dimitri Hautot
32

Działałyby zarówno .htaccessuprawnienia, jak i uprawnienia do .git/folderu. Polecam ten pierwszy:

<Directory .git>
    order allow,deny
    deny from all
</Directory>
Jake Wharton
źródło
Czy jest inny sposób na zrobienie z Apache, ponieważ nie mogę używać dyrektywy <Directory> z powodu ustawień serwera.
Chris Muench
2
Jest wiele sposobów dopasowywania (np. <Files>, <FilesMatch>).
Jake Wharton
5
Ta odpowiedź jest całkowicie błędna - katalog jest po prostu niedozwolony w plikach .htaccess. Nie zależy to od ustawień serwera.
podwójnie oznaczony
3
NI8VDY = Niepowodzenie w 1 z 1 razy, kiedy tego próbowałem: na hostingu współdzielonym Dreamhost umieściłem to w .htaccess w katalogu głównym witryny, a następnie http: do katalogu głównego witryny podał cytat o błędzie w dzienniku serwera (.. <Katalog niedozwolony tutaj). 2 komentatorów już ostrzegło o tym problemie i ostatnio mówi cytat (Katalog jest po prostu niedozwolony w plikach .htaccess) i zobacz oficjalne dokumenty katalogowe httpd.apache.org/docs/current/mod/core.html#directory powiedz cytat (Kontekst: serwer config, host wirtualny), a więc nie .htaccess. Ale to ma 26 głosów, więc ci, którzy odkrywają, jak to zrobić z .htaccess, wyjaśniają PLS UPDATE THE SOLUTION.
Architekt Destiny,
Zgadzam się z @DestinyArchitect - przepraszam za głos negatywny, ale jest to mylące.
kael
10

Nie chciałem grzebać w .gitkatalogu i nie byłem w stanie zmusić rozwiązania Bennetta do pracy z Apache 2.2, ale dodanie następujących elementów do mojej <VirtualHost>konfiguracji zadziałało:

RewriteRule ^.*\.git.* - [R=404]
David Moles
źródło
5

Nie czuję się komfortowo w kontrolowaniu dostępu do moich folderów .git indywidualnie i wybieram robienie tego przez konfigurację apache zamiast .htaccess, aby zapobiec ich nadpisaniu lub zapomnieniu przy nowej instalacji itp.

Oto kilka szczegółowych instrukcji, które mają nadzieję, że pomogą. Używam Ubuntu 16.10.

  1. Najpierw sprawdź, co się stanie, jeśli przejdziesz do folderu .git w przeglądarce. W moim przypadku przedstawiono listę katalogów. Jeśli widzisz to, czego nie powinieneś widzieć (tj. Nie dostajesz 404), wykonaj następujące czynności.
  2. Użyj apache2ctl -V, aby uzyskać HTTPD_ROOT i SERVER_CONFIG_FILE
  3. Użyj tego do edycji konfiguracji apache, w moim przypadku $ sudo nano /etc/apache2/apache2.conf
  4. Dodaj gdzieś w pliku konfiguracyjnym: RedirectMatch 404 /.git
  5. Zrestartuj apache: $ sudo service apache2 restart
  6. Powinien teraz otrzymać 404, jeśli ponownie przejdziesz do folderu
  7. Próbowałem tego z .gitignore i również otrzymałem 404
Chris B.
źródło
4

Bardziej niezawodną i prostszą opcją byłoby wyłączenie uprawnień do odczytu i wykonywania .gitkatalogu.

Ponieważ głównie Apache (httpd) działa pod specjalnym kontem użytkownika, na przykład działa jako użytkownik apachena CentOS, podczas gdy .gitkatalog musi być utworzony na prawdziwym koncie użytkownika, więc możemy po prostu zablokować dostęp, zmieniając uprawnienia. Co więcej, takie podejście nie wprowadza żadnego nowego pliku ani nie wpływa na polecenia git.

Poleceniem może być:

chmod -R o-rx .git
witam
źródło
Na komputerze, na którym SA nie chcą używać .htaccess i nie chcą, żebym mieszał z ich plikami typu httpd.conf, to wydaje się być najlepszym rozwiązaniem.
Forma życia obcych
1
Oczywistym minusem jest to, że jeśli ponownie sklonujesz, będziesz musiał pamiętać o chmodponownym uruchomieniu .
Lauri Nurmi,
3

mod_rewrite da ci pożądany efekt:

RewriteEngine on
RewriteRule .*\.git/.* - [F]
Kosh
źródło
9
Jest to luka w zabezpieczeniach umożliwiająca ujawnienie informacji: ułatwia ludziom ustalenie istnienia .gitkatalogu, ponieważ zwraca on kod zabroniony, a nie „Nie znaleziono”.
Bennett McElwee
2
Git nie jest podatny na atak
Adam
1

Zamiast majstrować przy .htaccessregułach, jak sugeruje większość odpowiedzi, dlaczego nie umieścić .git/katalogu nad katalogiem głównym?

W moich konfiguracjach mój .gitkatalog zwykle znajduje się w czymś takim:

/home/web/project_name/.git/

Mój rzeczywisty kod żyje w

/home/web/project_name/www_root/

ponieważ mój katalog główny (zgodnie z definicją w Apache lub Nginx .. Wolę ten drugi) /home/web/project_name/www_root/nie ma możliwości, aby .gitkatalog był dostępny z sieci, ponieważ żyje on „wyżej” niż katalog główny

Javier Larroulet
źródło
więc public_html jest podkatalogiem katalogu roboczego repozytorium ?? brzmi interesująco
Hayden Thring
Nie, to nie jest podkatalog. Oboje są „rodzeństwem” w moim głównym katalogu projektów. Mój project_namekatalog ma dwa podkatalogi: www_rootgdzie znajdują się pliki faktycznie obsługiwane, gdy odwiedzający przegląda moją witrynę, i .gitgdzie znajduje się repozytorium. Pobieranie z aktualizacji repozytorium www_rooti jego zawartości. Chodzi o to, że ponieważ .gitkatalog jest hierarchicznie „nad” moim kontrolerem frontowym, jest niedostępny przez Internet.
Javier Larroulet
Myślę, że o to mi chodziło, więc masz / home / user / public_html / i /home/user/.git
Hayden Thring
wow, to jest takie łatwe i proste rozwiązanie, jego geniusz (nie to, że tworzenie szerokiego bloku serwera w apache security.conf jest trudne) jedyną rzeczą, na którą należy uważać, jest to, że twój hosting ma jakieś dziwne ustawienia własności / uprawnień na publlic_html, to może ulec zmianie.
Hayden Thring
1
bardzo prawda ... Właściwie mam inne "katalogi rodzeństwa" do innych celów, które pozostają niedostępne z sieci, co pozwala mi trochę lepiej spać w nocy :)
Javier Larroulet
0

rozwiązanie dla serwera apache2 (LAMP) - masz 2 miejsca na dodanie .htaccesszawartości .. jeśli 1 zawiedzie, spróbuj dalej

  1. dla (środowisko programistyczne)

utwórz plik .htaccess w katalogu głównym / var / www / html i wklej kod do niego

<Directorymatch "^/.*/\.git/">
  Order 'deny,allow'
  Deny from all
</Directorymatch>
  1. dla (Środowisko produkcyjne)

wewnątrz pliku hosta wirtualnego (/ etc / apache2 / sites-enabled /)> znajdź plik virtualhost> otwórz plik> po zamknięciu tagu virtualhost wklej

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

nie ma potrzeby ponownego uruchamiania serwera, działa on, gdy wywoływana jest strona

Abhi
źródło