¿Cómo evito que apache sirva el directorio .git?

74

He comenzado a usar git para la implementación de sitios web para pruebas. ¿Cómo evito que apache sirva el contenido del directorio .git?

Lo intenté

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

Sin éxito.

Sé que puedo crear un archivo .htaccess en cada directorio .git y denegar el acceso, pero quería algo que pudiera poner en el archivo de configuración principal que lo haga global en todos los sitios web.

Shoan
fuente
3
Una vez que haya evitado que apache sirva el directorio, es posible que también deba ocultar el directorio .git con "IndexIgnore .git" si tiene índices habilitados en su directorio.
Ryan

Respuestas:

55

No funciona porque tienes 'svn' y no 'git' en la regla. Todo lo que tienes que hacer es reemplazar el 'svn' con 'git'.

<Directorymatch "^/.*/\.git/">
Order deny,allow
Deny from all
</Directorymatch>
sinping
fuente
1
Cuando creo un .htaccess que contiene solo su código,
aparece
2
Tiene que estar en la conf Apache. Ver: httpd.apache.org/docs/1.3/mod/core.html#directorymatch
sinping
2
La expresión regular más simple es<DirectoryMatch /\.git/>
Bachsau
Compruebe esto para obtener una solución perfecta magento.stackexchange.com/questions/202840/…
Pratik Kamani
Primero, gracias a cantar / OP. Tenga en cuenta que en Apache 2.4 el "Pedido, denegar" y la siguiente línea han sido reemplazados por "Requerir todo denegado". Además, en muchas instalaciones, el archivo llamado "Apache conf" anterior se llama "httpd.conf" --- el uso de singping fue solo una declaración casual, por lo que no busque ese nombre literal (probablemente debería ir sin decirlo, pero nunca se sabe cómo la gente podría leerlo).
Kevin_Kinsey
139

Esto tiene el mismo efecto que muchas de las otras respuestas, pero es mucho más simple:

RedirectMatch 404 /\.git

Esto puede entrar en .htaccesssu archivo de configuración del servidor. Oculta cualquier archivo o directorio cuyo nombre comience .git(por ejemplo, un .gitdirectorio o .gitignorearchivo) al devolver un 404. Por lo tanto, no solo se oculta el contenido de su repositorio Git, sino que también se oculta su existencia.

Bennett McElwee
fuente
2
Realmente me gusta esta solución. Es simple y elegante.
Shoan
2
Poner esto en el directorio raíz htdocs también hace un trabajo global.
jor
44
Me encanta esta opción también. Me parece que es más seguro devolver un 404 para solicitudes como /.git o /.gitignore, por lo que el hecho de que git incluso se esté utilizando no se puede determinar desde el exterior.
Ezra Gratis
2
Tenga en cuenta que si tiene listas de directorios habilitadas, las .gitcarpetas seguirán siendo visibles, pero obtendrá el 404 cuando intente acceder a ellas.
Andy Madge
1
@BennettMcElwee sí estuvo de acuerdo, casi nunca hay una buena razón para habilitar el listado de directorios globalmente en un servidor de producción. Solo pensé que merecía una mención en caso de que atrapara a alguien.
Andy Madge
13

Si no usa archivos .htaccess pero en su lugar quiere usar /etc/apache2/httpd.conf (o el archivo de configuración maestro de su servidor) para ocultar los directorios .git y los archivos .gitignore, puede usar lo siguiente. Encontré que la respuesta anterior para la configuración de configuración maestra no ocultaba el archivo 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>
Kyle Sloan
fuente
1
No bloquee el www.example.com/.git/configarchivo en Apache httpd 2.4.27.
ilhan
12

Si está en un servicio de alojamiento compartido y no tiene acceso a apache.conf , aún puede hacerlo en su archivo .htaccess, de esta manera:

RewriteEngine On
RewriteRule "^(.*/)?\.git/" - [F,L]
Danorton
fuente
gracias, esto funcionó para mí en una situación de alojamiento compartido donde la respuesta principal no
Platón
6
### never deliver .git folders, .gitIgnore
RewriteRule ^(.*/)?\.git+ - [R=404,L]

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

Esto funciona en .htaccess, no se http.confrequiere acceso. Incluya esto como la primera de las reglas de reescritura. Anteponer Rewrite Onsi es necesario.

Desde un punto de vista de seguridad, prefiero un 404 falso sobre un 403, más informativo para el atacante. Comente uno de los dos, para asegurarse de que el otro también funcione para usted.

Por cierto, buenos cambios son, su prueba de litmo para los dos son:

http://localhost/.gitignore
http://localhost/.git/HEAD
Frank Nocke
fuente
¿Por qué tener ambas reglas? El RedirectMatch más simple es suficiente por sí solo. (Además, las expresiones regulares no parecen correctas, ¿por qué la ventaja al final?)
Bennett McElwee
Paranoia personal / doble seguridad. Si RewriteEngine se apaga (cambios de configuración central, mala comunicación del equipo, "actualización" desafortunada del servidor, ... lo que sea :-) ¡El + está obsoleto o debería ser un $, buen punto! (no hay tiempo para la prueba, lo siento)
Frank Nocke
Si le preocupa que RewriteEngine pueda estar apagado, simplemente coloque RewriteEngine Onantes de su RewriteRule. Pero de todos modos es tautológico y redundante porque el RedirectMatch más simple es suficiente por sí solo. Aunque incluso eso podría simplificarse. Básicamente estoy recomendando mi respuesta en su lugar. :)
Bennett McElwee
+1 para la prueba de fuego.
5

Para proteger tanto el directorio .git como otros archivos como .gitignore y .gitmodules usando .htaccess, use:

RewriteEngine On
RewriteRule ^(.*/)?\.git+ - [F,L]
ErrorDocument 403 "Access Forbidden"
scribu
fuente
44
Funciona para mí, sin embargo, el ErrorDocument final no tiene ningún impacto. Desde un punto de vista de seguridad, me gustaría un 404 falso sobre un 403 informativo para el atacante ...
Frank Nocke
1
Esta es una mala idea, porque revela información a los piratas informáticos. Un 403 significa que está allí, un 404 significa que no está. Cada hecho en la configuración de un servidor es útil para un hacker. Consideraría revisar esto.
GerardJP
3

Siempre agrego la siguiente línea en la plantilla vhost

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

Solo para asegurarse de que nadie pueda acceder a datos específicos de VCS. Funciona perfecto

ALex_hha
fuente
1

Suponiendo que su servidor web esté usando un usuario diferente al que usa para acceder al repositorio .git, puede deshabilitar el bit de ejecución para otros en el directorio .git.

Esto debería funcionar con otros servidores web y no depende de archivos .htaccess que consuman rendimiento.

Martijn
fuente
1

Para aquellos que buscan simplemente negar todos los archivos y directorios "ocultos" en una distribución de Linux (generalmente todos los archivos que comienzan con un "."), Esto es lo que funciona en Apache 2.4 cuando se coloca en el contexto de configuración del servidor:

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

Y aquí está el estilo antiguo de Apache 2.2 (misma expresión regular, solo diferentes directivas de autenticación):

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

Entonces no tienes que preocuparte .gitni .svnespecíficamente. Eso también coincidiría con cosas como .htaccesse .htpasswdinherentemente.

Personalmente, me gusta emitir 403 para tales solicitudes en lugar de 404, pero podría usar fácilmente una RewriteRule en lugar de la denegación de autenticación, de esta manera:

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

Probablemente quieras negar que sirvas .gitignoretambién.

Los archivos que comienzan con un punto están ocultos en Linux.

Por lo tanto, solo 404 cualquier cosa que comience con un punto:

RedirectMatch 404 /\.

Vladimir Kornea
fuente
0

Esto es un poco tarde, pero mi respuesta es un poco diferente, así que pensé en agregarlo. Esto debe ir en el archivo httpd.conf. El <Files "*">anidado dentro de la <Directory>etiqueta bloqueará todos los archivos en el directorio.

# 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>
jonnyjandles
fuente