Come posso impedire ad apache di servire la directory .git?


74

Ho iniziato a utilizzare git per la distribuzione di siti Web per i test. Come posso impedire ad apache di pubblicare i contenuti della directory .git?

Provai

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

senza successo.

So che posso creare un file .htaccess in ogni directory .git e negare l'accesso, ma volevo qualcosa che potessi inserire nel file di configurazione principale che lo rendesse globale su tutti i siti Web.


3
Una volta che hai impedito ad apache di servire la directory, potresti anche aver bisogno di nascondere la directory .git con "IndexIgnore .git" se hai gli indici abilitati nella tua directory.
Ryan,

Risposte:


55

Non funziona perché hai "svn" e non "git" nella regola. Tutto quello che devi fare è sostituire 'svn' con 'git'.

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

1
Quando creo un .htaccess contenente solo il tuo codice, viene visualizzato l'errore: "<DirectoryMatch non consentito qui"
Shoan

2
Deve essere nella conf Apache. Vedi: httpd.apache.org/docs/1.3/mod/core.html#directorymatch
sinping

2
Il regex più semplice è<DirectoryMatch /\.git/>
Bachsau,

Verifica questa soluzione perfetta magento.stackexchange.com/questions/202840/…
Kamani

1 ° grazie a singping / OP. Si noti che in Apache 2.4 "Ordina, rifiuta" e la riga successiva sono stati sostituiti da "Richiedi tutto negato". Inoltre, molte installazioni il file chiamato "Apache conf" sopra è chiamato "httpd.conf" --- l'uso di singping era solo una dichiarazione casuale, quindi non cercare quel nome letterale (probabilmente dovrebbe andare senza dirlo, ma non si sa mai come la gente potrebbe leggerlo).
Kevin_Kinsey,

139

Questo ha lo stesso effetto di molte altre risposte ma è molto più semplice:

RedirectMatch 404 /\.git

Questo può andare nel .htaccesstuo file di configurazione del server. Nasconde qualsiasi file o directory il cui nome inizia con .git(es. Una .gitdirectory o un .gitignorefile) restituendo un 404. Quindi non solo i contenuti del tuo repository Git sono nascosti, ma anche la sua stessa esistenza è nascosta.


2
Mi piace molto questa soluzione. È semplice ed elegante.
Shoan

2
Metterlo nella directory htdocs di root fa anche un lavoro globale.
jor

4
Adoro anche questa opzione. Mi sembra che sia più sicuro restituire un 404 per richieste come /.git o /.gitignore in modo che il fatto che git sia usato non possa essere determinato dall'esterno.
Esdra Gratuito il

2
Tieni presente che con se gli elenchi di directory sono abilitati, le .gitcartelle saranno comunque visibili, ma otterrai il 404 quando proverai ad accedervi.
Andy Madge,

1
@BennettMcElwee sì, d'accordo, non c'è quasi mai una buona ragione per avere un elenco di directory abilitato a livello globale su un server di produzione. Ho pensato che meritasse una menzione nel caso in cui catturi qualcuno.
Andy Madge,

13

Se non si utilizzano file .htaccess ma si desidera utilizzare /etc/apache2/httpd.conf (o qualunque sia il file conf principale del server) per nascondere sia le directory .git che i file .gitignore, è possibile utilizzare quanto segue. Ho trovato la risposta sopra per l'impostazione di configurazione principale non ha nascosto il file 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
Non bloccare il www.example.com/.git/configfile in Apache httpd 2.4.27.
ilhan,

12

Se utilizzi un servizio di hosting condiviso e non hai accesso a apache.conf , puoi comunque farlo nel tuo file .htaccess, in questo modo:

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

grazie, questo ha funzionato per me in una situazione di hosting condiviso in cui la risposta migliore non è stata
Platone

6
### never deliver .git folders, .gitIgnore
RewriteRule ^(.*/)?\.git+ - [R=404,L]

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

Funziona in .htaccess, nessun http.confaccesso richiesto. Includilo come il primo delle regole di riscrittura. Preparare Rewrite Onse necessario.

Dal punto di vista della sicurezza, preferisco un falso 404 rispetto a un 403, più informativo per l'attaccante. Commenta uno dei due, per essere sicuro, l'altro funziona anche per te.

A proposito, i buoni cambiamenti sono, il tuo test al litio per i due sono:

http://localhost/.gitignore
http://localhost/.git/HEAD

Perché entrambe le regole? Il RedirectMatch più semplice è sufficiente da solo. (Inoltre, le regex non sembrano del tutto giuste - perché il vantaggio alla fine?)
Bennett McElwee

Paranoia personale / doppia sicurezza. Se RewriteEngine viene disattivato (modifiche alla configurazione centrale, scarsa comunicazione della squadra, sfortunato "aggiornamento" del server, ... lo chiami :-) Il + è obsoleto o dovrebbe essere un $, buon punto! (non c'è tempo per i test, scusa.)
Frank Nocke,

Se sei preoccupato che RewriteEngine sia spento, metti RewriteEngine Onprima di RewriteRule. Ma comunque è tautologico e ridondante perché il RedirectMatch più semplice è sufficiente. Anche se anche questo potrebbe essere semplificato. Fondamentalmente sto raccomandando invece la mia risposta . :)
Bennett McElwee,

+1 per la cartina di tornasole.

5

Per proteggere sia la directory .git che altri file come .gitignore e .gitmodules usando .htaccess, usare:

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

4
Funziona per me, tuttavia il ErrorDocument finale non ha alcun impatto. Da un punto di vista della sicurezza, vorrei un falso 404 su un 403 informativo all'attaccante ...
Frank Nocke,

1
Questa è una cattiva idea, perché rivela informazioni agli hacker. Un 403 significa che è lì, un 404 significa che non lo è. Ogni fatto sulla configurazione di un server è utile per un hacker. Prenderei in considerazione la revisione di questo.
GerardJP,

3

Aggiungo sempre la seguente riga nel modello vhost

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

Solo per essere sicuri che nessuno possa accedere ai dati specifici di VCS. Funziona perfettamente


1

Supponendo che il tuo server web stia utilizzando un utente diverso da quello che usi per accedere al repository .git, potresti disabilitare il bit di esecuzione per altri nella directory .git.

Questo dovrebbe funzionare con altri server web e non dipende da file .htaccess che richiedono prestazioni.


1

Per coloro che desiderano semplicemente negare tutti i file e le directory "nascosti" su una distribuzione Linux (generalmente tutti i file che iniziano con un "."), Ecco cosa funziona su Apache 2.4 se inserito in un contesto conf server:

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

Ed ecco il vecchio stile Apache 2.2 (stesso regex, solo direttive di autenticazione diverse):

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

Quindi non devi preoccuparti .gito .svnspecificamente. Ciò corrisponderebbe anche a cose come .htaccesse .htpasswdintrinsecamente.

Personalmente, mi piace emettere 403 per tali richieste anziché 404, ma potresti facilmente utilizzare una RewriteRule invece di un'autenticazione, in questo modo:

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

0

Probabilmente vuoi anche negare di servire .gitignore.

I file che iniziano con un punto sono nascosti in Linux.

Pertanto, solo 404 tutto ciò che inizia con un punto:

RedirectMatch 404 /\.


0

È un po 'tardi, ma la mia risposta è leggermente diversa, quindi ho pensato di aggiungerlo. Questo deve andare nel file httpd.conf. Il <Files "*">nidificato all'interno del <Directory>tag bloccherà tutti i file nella 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.