Rendi inaccessibile la directory web .git


129

Ho un sito Web che utilizzo github (closed source) per tenere traccia delle modifiche e aggiornare il sito. L'unico problema è che sembra che la directory .git sia accessibile via web. Come posso fermarlo ed essere ancora in grado di usare git?

Dovrei usare .htaccess? Devo modificare le autorizzazioni di .git?


dovrebbe essere su serverfault
tback

Risposte:


39

Creare un .htaccessfile nella .gitcartella e inserire quanto segue in questo file:

Order allow,deny
Deny from all

Ma nota che sarebbe perso se mai clonassi nuovamente il repository


38
Vero, ma raccomanderei di non inserirlo nella .git/directory stessa perché andrebbe perso se si clonasse nuovamente il repository.
Jake Wharton,

Questo è un problema se si dispone di più di una directory .git e deve essere ripetuto se si esegue nuovamente la clonazione della directory.
Bennett McElwee,

1
Ho provato questo e ho scoperto che funziona MA questa e apparentemente QUALSIASI soluzione che mette questa impostazione in .git / ha i 2 svantaggi sopra menzionati, il 1 ° sembra peggiore, più un terzo forse peggiore di tutti: la citazione (Make .git directory web inaccessibile), incluso il modo in cui è fatto quando e da chi, è piccolo ma comunque chiave per i dati (specialmente per la sua sicurezza, inclusa l'analisi quando e prima non fatto correttamente) MA in .git / NON fa veramente parte dei dati propri ( tra cui versione e condivisa e ben conservata) quindi anche NON ripristinato ... analogo a uno meglio messo .gitignore con i dati propri e non in .git /.
Destiny Architect,

3
Perché questa è la risposta accettata e non quella di Bennett? La sua è una tecnica semplice ed efficace per risolvere questo.
Josh Frankel,

1
Molto probabilmente perché OP ha accettato questo due anni prima che l'altro fosse pubblicato;)
ThiefMaster

379

Metti questo in un .htaccessfile alla radice del tuo server web:

RedirectMatch 404 /\.git

Questa soluzione è solida e sicura : è

  • funziona per tutte le .gitdirectory nel tuo sito, anche se ce ne sono più di una,
  • nasconde anche altri file Git come .gitignoree.gitmodules
  • funziona anche per le .gitdirectory appena aggiunte e
  • non dà nemmeno il via all'esistenza delle directory.

1
Funzionava con la .gitcartella, ma riuscivo comunque a recuperare il .gitignorefile.
Kurt Emch,

Il mio regex funziona nei miei test e dovrebbe funzionare secondo la documentazione di RedirectMatch poiché il regex deve corrispondere solo a parte dell'URL, non all'URL completo: vedere la nota "differenza sottile" nella documentazione AliasMatch collegata . Tuttavia, i documenti sono una cosa, il mondo reale è un'altra. Il regex di @artlogic corrisponde all'URL completo, quindi forse ci sono alcune differenze di versione in Apache o sto solo leggendo male le cose.
Bennett McElwee,

2
@BennettMcElwee - dopo aver dato un'occhiata più da vicino alla documentazione ed aver eseguito alcuni test, sembra che i caratteri jolly non siano necessari per me dopo tutto. Grazie per la soluzione Funziona alla grande!
Artlogic,

Secondo i documenti apache2 puoi anche metterlo in un altro contesto di configurazione:server config, virtual host, directory, .htaccess
bennos

Suggerirei anche di aggiungere ". *" Alla fine dell'espressione, in modo che nessun file / cartella in .git / sia accessibile ->RedirectMatch 404 /\.git.*
Dimitri Hautot

33

Entrambe le .htaccessautorizzazioni sulla .git/cartella funzionerebbero. Raccomando il primo:

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

C'è un altro modo di fare con apache poiché non mi è permesso usare la direttiva <Directory> a causa delle impostazioni del server.
Chris Muench,

2
Ci sono tutti i tipi di modi di corrispondenza (ad esempio, <Files>, <FilesMatch>).
Jake Wharton,

4
Questa risposta è decisamente errata: la directory non è semplicemente consentita nei file .htaccess. Non dipende dalle impostazioni del server.
segnato il

2
NI8VDY = Fallito 1 volta in 1 ho provato: sull'hosting condiviso di Dreamhost, l'ho inserito nel .htaccess della radice del sito Web, quindi http: nella radice del sito web ha fornito la citazione dell'errore dei log del server (.. <Directory non consentita qui). 2 commentatori già avvisano di questo problema e dicono per ultimo la citazione (la directory non è semplicemente consentita nei file .htaccess) e vedere i documenti della directory ufficiale httpd.apache.org/docs/current/mod/core.html#directory dire la citazione (Contesto: server config, host virtuale) e quindi non .htaccess. Ma questo ha 26 voti, quindi quelli che trovano come risolverlo con .htaccess, spiegano AGGIORNAMENTO DELLA SOLUZIONE.
Destiny Architect,

Concordo con @DestinyArchitect - scusate il downvote, ma questo è fuorviante.
Kael

7

Non volevo andare in giro nella .gitdirectory e non ero in grado di far funzionare la soluzione di Bennett su Apache 2.2, ma aggiungendo quanto segue alla mia <VirtualHost>configurazione funzionava:

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

5

Non mi sento a mio agio nel controllare l'accesso alle mie cartelle .git singolarmente e scelgo di farlo tramite apache config invece di .htaccess, per impedirmi di sovrascriverle o di dimenticare una nuova installazione ecc.

Ecco alcune istruzioni dettagliate che sperano possano aiutare. Sto usando Ubuntu 16.10.

  1. Prima controlla cosa succede se vai alla cartella .git in un browser. Nel mio caso mi è stato presentato un elenco di directory. Se stai vedendo ciò che non dovresti vedere (cioè non stai ottenendo un 404), procedi come segue.
  2. Utilizzare apache2ctl -V per ottenere HTTPD_ROOT e SERVER_CONFIG_FILE
  3. Usa questo per modificare la tua configurazione di apache, nel mio caso $ sudo nano /etc/apache2/apache2.conf
  4. Aggiungi quanto segue da qualche parte nel file di configurazione: RedirectMatch 404 /.git
  5. Riavvia apache: riavvio di $ sudo service apache2
  6. Ora dovresti ottenere un 404 se navighi nuovamente nella cartella
  7. Ho provato questo con .gitignore e ho anche ottenuto un 404

4

Un'opzione più solida e semplice sarebbe disabilitare l'autorizzazione READ ed Execution della .gitdirectory.

Poiché principalmente Apache (httpd) viene eseguito con un account utente speciale, ad esempio, viene eseguito come utente apachesu CentOS, mentre la .gitdirectory deve essere creata con un account utente reale, quindi possiamo semplicemente bloccare l'accesso modificando l'autorizzazione. Inoltre, questo approccio non introduce alcun nuovo file, né influenza i comandi git.

Il comando può essere:

chmod -R o-rx .git

Su una macchina in cui le SA non vogliono l'utilizzo di .htaccess e non vogliono che io scherzi con i loro file di tipo httpd.conf, questa sembra essere la soluzione migliore.
Alien Life Form

1
L'ovvio aspetto negativo è che se si esegue chmodnuovamente la clonazione, sarà necessario ricordare di eseguire nuovamente.
Lauri Nurmi,

3

mod_rewrite ti darà l'effetto desiderato:

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

9
Questa è una vulnerabilità legata alla divulgazione di informazioni: rende facile per le persone determinare l'esistenza della .gitdirectory perché restituisce un codice proibito anziché Non trovato.
Bennett McElwee,

2
Usare git non è una vulnerabilità
Adam,

1

Invece di fare confusione con .htaccessregole come suggeriscono la maggior parte delle risposte, perché non mettere semplicemente la .git/directory sopra la webroot?

Nelle mie configurazioni, la mia .gitdirectory di solito vive in qualcosa del tipo:

/home/web/project_name/.git/

Il mio codice attuale vive in

/home/web/project_name/www_root/

poiché la mia radice web (come definita su Apache o Nginx .. preferisco quest'ultima) è /home/web/project_name/www_root/che la .gitdirectory non è accessibile dal web in quanto "più alta" rispetto alla webroot


quindi public_html è un sottodirectory del dir repo funzionante ?? sembra interessante
Hayden Thring

No, non è una sottodirectory. Sono entrambi "fratelli" nella mia directory principale del progetto. La mia project_namedirectory ha due sottodirectory: www_rootdove si trovano effettivamente i file quando un visitatore naviga sul mio sito e .gitdove si trova il repository. Estrazione dagli aggiornamenti del repository www_roote dai suoi contenuti. Il fatto è che, poiché la .gitdirectory è gerarchicamente "sopra" il mio front controller, è inaccessibile via web.
Javier Larroulet,

Penso che questo sia ciò che intendevo, quindi hai / home / user / public_html / e /home/user/.git
Hayden Thring,

caspita che sia una soluzione così semplice e geniale il suo genio, (non che rendere un blocco largo del server in apache security.conf sia difficile) l'unica cosa a cui fare attenzione è se il tuo hosting ha delle strane impostazioni di proprietà / autorizzazioni su publlic_html, che potrebbe essere cambiato.
Hayden Thring,

1
molto vero ... In realtà ho altre "directory fratelli" per altri scopi che rimangono inaccessibili dal web, il che mi permette di dormire un po 'meglio di notte :)
Javier Larroulet,
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.