Hacer que el directorio .git sea inaccesible

129

Tengo un sitio web que uso github (código cerrado) para rastrear cambios y actualizar el sitio. El único problema es que parece que se puede acceder al directorio .git a través de la web. ¿Cómo puedo detener esto y aún poder usar git?

¿Debo usar .htaccess? ¿Debo cambiar los permisos de .git?

Chris Muench
fuente
debería estar en serverfault
tback
8
Está en serverfault: serverfault.com/questions/128069/…
scribu

Respuestas:

39

Cree un .htaccessarchivo en la .gitcarpeta y coloque lo siguiente en este archivo:

Order allow,deny
Deny from all

Pero tenga en cuenta que se perdería si alguna vez vuelve a clonar el repositorio

ThiefMaster
fuente
38
Es cierto, pero recomendaría no ponerlo en el .git/directorio en sí porque se perdería si alguna vez volviera a clonar el repositorio.
Jake Wharton
Esto es un problema si tiene más de un directorio .git, y debe volver a hacerlo si alguna vez vuelve a clonar el directorio.
Bennett McElwee
1
Intenté esto y descubrí que funciona PERO esto y aparentemente CUALQUIER solución que pone esta configuración dentro de .git / tiene los 2 inconvenientes mencionados anteriormente, el primero parece peor, más un tercero quizás el peor de todos: la cita (Make .git directory web inaccesible), incluido cómo se hace cuándo y por quién, es pequeño pero sigue siendo clave para los datos (especialmente por su seguridad, incluido el análisis cuando y antes no se hace correctamente) PERO en .git / NO es realmente parte de los datos propiamente dicho ( incluidos versionados y compartidos y bien conservados), así que NO se restauran ... análogamente a una mejor opción .gitignore con los datos correctos y no en .git /.
Destiny Architect
3
¿Por qué es esta la respuesta aceptada y no la de Bennett? La suya es una técnica simple y efectiva para resolver esto.
Josh Frankel
1
Lo más probable es que OP lo aceptó dos años antes de que se publicara el otro;)
ThiefMaster
379

Ponga esto en un .htaccessarchivo en la raíz de su servidor web:

RedirectMatch 404 /\.git

Esta solución es robusta y segura :

  • funciona para todos los .gitdirectorios en su sitio, incluso si hay más de uno,
  • también oculta otros archivos Git como .gitignorey.gitmodules
  • funciona incluso para .gitdirectorios recién agregados , y
  • Ni siquiera revela el hecho de que existen los directorios.
Bennett McElwee
fuente
1
Funcionó en la .gitcarpeta, pero aún podía obtener el .gitignorearchivo para abrir.
Kurt Emch
Mi expresión regular funciona en mis pruebas, y debería funcionar de acuerdo con la documentación de RedirectMatch ya que la expresión regular solo tiene que coincidir con parte de la URL, no con la URL completa: consulte la nota de "diferencia sutil" en la documentación vinculada de AliasMatch . Aún así, los documentos son una cosa, el mundo real es otra. La expresión regular @artlogic coincide con la URL completa, por lo que tal vez haya algunas diferencias de versión en Apache o simplemente estoy leyendo mal las cosas.
Bennett McElwee
2
@BennettMcElwee: después de echar un vistazo más de cerca a la documentación y ejecutar algunas pruebas, parece que los comodines no son necesarios para mí después de todo. Gracias por la solucion. ¡Funciona genial!
artlogic
De acuerdo con los documentos de apache2 , también puede ponerlo en otro contexto de configuración:server config, virtual host, directory, .htaccess
bennos
Incluso sugeriría agregar ". *" Al final de la expresión, para que no se pueda acceder a ningún archivo / carpeta bajo .git / ->RedirectMatch 404 /\.git.*
Dimitri Hautot
33

Ambos .htaccessy los permisos en la .git/carpeta funcionarían. Recomiendo el primero:

<Directory .git>
    order allow,deny
    deny from all
</Directory>
Jake Wharton
fuente
¿Hay otra manera de hacer con apache ya que no tengo permiso para usar la directiva <Directory> debido a la configuración del servidor?
Chris Muench
2
Hay todo tipo de formas de correspondencia (p. Ej. <Files>, <FilesMatch>).
Jake Wharton
44
Esta respuesta es totalmente incorrecta: el directorio simplemente no está permitido en los archivos .htaccess. No depende de la configuración del servidor.
marcado el
2
NI8VDY = Falló en la 1 de 1 veces que lo intenté: en el alojamiento compartido Dreamhost, puse esto en la raíz del sitio web .htaccess y luego http: la raíz del sitio web proporcionó una cita de error de registros del servidor (.. <Directorio no permitido aquí). 2 comentaristas ya alertan de este problema y el último dice cita (el directorio simplemente no está permitido en archivos .htaccess) y ve los documentos oficiales del directorio httpd.apache.org/docs/current/mod/core.html#directory decir cita (Contexto: servidor config, host virtual) y no .htaccess. Pero esto tiene 26 votos, así que aquellos que encuentran cómo resolver esto desde .htaccess, PLS ACTUALIZAN LA SOLUCIÓN explicando.
Destiny Architect
De acuerdo con @DestinyArchitect: perdón por el voto negativo, pero esto es engañoso.
kael
7

No quería hurgar en el .gitdirectorio y no pude conseguir que la solución de Bennett funcionara en Apache 2.2, pero agregar lo siguiente a mi <VirtualHost>configuración funcionó:

RewriteRule ^.*\.git.* - [R=404]
David Moles
fuente
5

No me siento cómodo controlando el acceso a mis carpetas .git individualmente y elijo hacerlo a través de la configuración de apache en lugar de .htaccess, para evitar sobrescribirlas u olvidarme de una nueva instalación, etc.

Aquí hay algunas instrucciones detalladas, espero que ayuden. Estoy usando Ubuntu 16.10.

  1. Primero verifique qué sucede si navega a la carpeta .git en un navegador. En mi caso me presentaron una lista de directorio. Si está viendo lo que no debería estar viendo (es decir, no está obteniendo un 404), haga lo siguiente.
  2. Use apache2ctl -V para obtener HTTPD_ROOT y SERVER_CONFIG_FILE
  3. Use esto para editar su configuración de apache, en mi caso $ sudo nano /etc/apache2/apache2.conf
  4. Agregue lo siguiente en algún lugar del archivo de configuración: RedirectMatch 404 /.git
  5. Reiniciar apache: $ sudo service apache2 restart
  6. Ahora debería obtener un 404 si navega de nuevo a la carpeta
  7. Intenté esto con .gitignore y también obtuve un 404
Chris B
fuente
4

Una opción más robusta y simple sería deshabilitar el permiso de LECTURA y Ejecución del .git directorio.

Como Apache (httpd) se ejecuta principalmente en una cuenta de usuario especial, por ejemplo, se ejecuta como usuario apacheen CentOS, mientras que el .gitdirectorio debe crearse en una cuenta de usuario real, por lo que simplemente podemos bloquear el acceso cambiando el permiso. Además, este enfoque no introduce ningún archivo nuevo ni afecta los comandos git.

El comando puede ser:

chmod -R o-rx .git
granizo
fuente
En una máquina donde las SA no quieren el uso de .htaccess y no quieren que me meta con sus archivos httpd.conf-type, esta parece ser la mejor solución.
Alien Life Form
1
El inconveniente obvio es que si vuelve a clonar, deberá recordar chmodvolver a correr .
Lauri Nurmi
3

mod_rewrite te dará el efecto deseado:

RewriteEngine on
RewriteRule .*\.git/.* - [F]
Kosh
fuente
9
Esta es una vulnerabilidad de divulgación de información: facilita a las personas determinar la existencia del .gitdirectorio porque devuelve un código Prohibido en lugar de No Encontrado.
Bennett McElwee
2
No es una vulnerabilidad usar git
Adam
1

En lugar de jugar con las .htaccessreglas como sugieren la mayoría de las respuestas, ¿por qué no simplemente colocar el .git/directorio sobre el raíz web?

En mis configuraciones, mi .gitdirectorio generalmente vive en algo como:

/home/web/project_name/.git/

Mi código actual vive en

/home/web/project_name/www_root/

ya que mi raíz web (como se define en Apache o Nginx ... prefiero la última) es que /home/web/project_name/www_root/no hay forma de que el .gitdirectorio sea accesible desde la web ya que vive "más alto" que la raíz web

Javier Larroulet
fuente
¿public_html es un subdirectorio del directorio de trabajo de repos? suena interesante
Hayden Thring
No, no es un subdirectorio. Ambos son "hermanos" dentro de mi directorio principal del proyecto. Mi project_namedirectorio tiene dos subdirectorios: www_rootdónde se encuentran los archivos cuando un visitante navega por mi sitio y .gitdónde está el repositorio. Sacando de las actualizaciones del repositorio www_rooty sus contenidos. La cuestión es que, dado que el .gitdirectorio está jerárquicamente "encima" de mi controlador frontal, es inaccesible a través de la web.
Javier Larroulet
Creo que esto es lo que quise decir, así que tienes / home / user / public_html / and /home/user/.git
Hayden Thring
wow, esa es una solución tan simple y sencilla, su genio, (no es que hacer un bloqueo amplio del servidor en apache security.conf es difícil), lo único a tener en cuenta es si su hosting tiene algunas configuraciones de propiedad / permisos extraños en publlic_html, que Podría cambiar.
Hayden Thring
1
muy cierto ... En realidad tengo otros "directorios de hermanos" para otros fines que permanecen inaccesibles desde la web, lo que me permite dormir un poco mejor por la noche :)
Javier Larroulet