2008-10-18 7 views
25

Quiero mantener mi sitio web en control de versiones (específicamente Subversion) y usar svn co para actualizarlo cuando haya versiones estables para actualizar, pero me preocupa la seguridad de hacerlo, ya que todas las carpetas .svn estarán público, y estos incluyen todo tipo de datos privados, ¡entre los cuales está el código fuente completo de mi sitio web!¿Cómo oculto los directorios en Apache, específicamente el control de origen?

¿Hay algo que pueda hacer para evitar esto?

Respuesta

37

dos cosas:

  1. no utilice IfModule para la funcionalidad que necesitan estar presentes. Está bien hacerlo para el autoindex porque podría no estar presente y no es crucial para el esquema. Pero cuenta con reescribir estar presente para proteger su contenido. Por lo tanto, es mejor eliminar la directiva IfModule y dejar que apache le diga cuando reescribir no está presente para habilitarlo (o al menos saber que no estará 'protegido' y comentar conscientemente las líneas)

  2. No necesitará utilizar reescribir ahí si tiene acceso a los archivos principales de configuración, mucho más fácil que sería uno de

    <DirectoryMatch \.svn> 
        Order allow,deny 
        Deny from all 
    </DirectoryMatch> 
    

que generará 403 Forbidden (que es mejor desde el punto cumplimiento HTTP de vista) o, si desea tomar la seguridad por la ruta oscura, use AliasMatch

AliasMatch \.svn /non-existant-page 

Si no tiene acceso a los archivos de configuración principal, queda con la esperanza de que mod_rewrite esté habilitado para su uso en .htaccess.

+1

Entiendo el punto acerca de 403. Personalmente (en este tipo de situación, donde los archivos nunca deberían ser servidos), preferiría que no supieran que los directorios existían. Voy a probar AliasMatch también. Esto fue lo que logré obtener de Google, siempre estoy contento por las mejores soluciones –

+1

tenga en cuenta que esto no funciona en los archivos .htaccess si está tratando de hacer esto en un host compartido/virtual. Utilice la respuesta de Monóxido si no tiene acceso al archivo httpd.conf. http://stackoverflow.com/questions/214886/#214887 – nickf

+0

Es cierto. Existe la posibilidad de que mod_rewrite no esté habilitado para su uso en archivos .htaccess también. (Indicado en si su servidor es algo permisivo con lo que está permitido en ellos) –

7

Esto se puede lograr en todo el servidor (recomendado), en una sola base de host virtual, o incluso dentro de los archivos .htaccess si su servidor es algo permisivo con lo que está permitido en ellos. La configuración específica que se necesita es:

RewriteEngine On 
RewriteRule /\.svn /some-non-existant-404-causing-page 

<IfModule autoindex_module> 
    IndexIgnore .svn 
</IfModule> 

la primera sección requiere mod_rewrite. Obliga a todas las solicitudes con "/.svn" en ellas (es decir, cualquier solicitud para el directorio, o cualquier cosa dentro del directorio) a ser internamente redirigido a una página inexistente en su sitio web. Esto es completamente transparente para el usuario final e indetectable. También fuerza un error 404, como si sus carpetas .svn acabaran de desaparecer.

La segunda sección es puramente estética, y ocultará las carpetas .svn del módulo de autoindex si está activado. Esta es una buena idea también, solo para evitar que las almas curiosas tengan alguna idea.

+0

Pegado directamente en un archivo .htaccess, esto no funcionó para mí. ¿Qué significa exactamente "si su servidor es algo permisivo con lo que está permitido en ellos"? – Nate

+0

Necesita mod_rewrite habilitado para que esto funcione. Si no es así, entonces o no lo tiene habilitado (lo que debería causar errores en los registros de los servidores) o arruinó la expresión regular (¿está ocultando la subversión?) –

+0

Copié y pegué exactamente, y tengo mod_rewrite habilitado No te preocupes, la respuesta de @Gilles funcionó bien. – Nate

3

Ocultar los directorios como dice Vinko debería funcionar. Pero probablemente sería más simple usar svn export en lugar de svn co. Esto no debería generar los directorios .svn.

+0

Más simple quizás, pero luego no obtiene la ventaja de las actualizaciones incrementales.Si modifico una imagen y dos de mis secuencias de comandos, ¿realmente necesito desplegar los MB (y hacer que el sitio esté en modo de mantenimiento mientras lo hago) en lugar de los pocos segundos para realizar el pago? –

+1

Consulte la discusión en http://www.techcrunch.com/2009/09/23/basic-flaw-reveals-source-code-to-3300-popular-websites/ (un comentario que apunta hacia atrás a esta publicación) . Con la advertencia que mencionas (sitio enorme), puedes obtener el resultado "svn export" por "svn co" en otro directorio y rsync con excludes, tal como CesarB sugiere en otra respuesta. –

4

Hay un enfoque interesante que uso: el pago (y la actualización) se realiza en un directorio completamente separado (posiblemente en una máquina completamente separada) y luego se copia al código donde el servidor web lo leerá con rsync. Una regla de exclusión en la línea de comando de rsync se utiliza para hacer que no copie los directorios de .svn (y CVS), mientras que --delete-excluded se asegura de que se eliminarán incluso si se copiaron antes.

Dado que tanto svn update como rsync realizan transferencias incrementales, esto es bastante rápido incluso para sitios más grandes. También le permite tener su repositorio detrás de un firewall. La única advertencia es que debe mover todos los directorios con archivos generados en el servidor (como los archivos/directorio en Drupal) a un lugar fuera del directorio de destino de rsync (rsync sobrescribirá todo cuando se usa de esta manera) y el enlace simbólico a él debe crearse en el directorio fuente rsync. El directorio fuente rsync también puede tener otros archivos no versionados (como archivos de configuración específicos de la máquina).

El conjunto completo de parámetros rsync que uso es

rsync -vv --rsh='ssh -l username' -rltzpy --exclude .svn/ --exclude CVS/ --exclude Attic/ --delete-after --delete-excluded --chmod=og-w,Fa-x 

Incluso entonces, para la redundancia, todavía tengo una regla de configuración para evitar Svn puedan ser consultados, copiado de una regla por defecto de Debian, que impide .ht * (.htaccess, .htpasswd) de ser accedido.

+0

Prefiero el ejemplo de AliasMatch sobre los ejemplos incorporados para bloquear el acceso a los directorios de control de origen ... No es solo una brecha de seguridad menor (ver configuración), es importante si alguien alguna vez logró entrar en ellos, así que 404 parece apropiado. (no está aquí, ve a buscar en otro lado) –

3

Considere desplegar código en vivo utilizando las herramientas de administración de paquetes de su sistema operativo, en lugar de hacerlo directamente desde su VCS. Esto le permitirá asegurarse de que sus paquetes en vivo no contengan directorios de metadatos u otras herramientas y datos potencialmente confidenciales.

+0

+1 para una buena idea, pero también la utilizo en las máquinas de desarrollo, solo para ayudarlas a mantener el aspecto limpio cuando/si estoy buscando estructuras de directorios y cosas por el estilo. –

+2

esta es una idea terrible para webapps – lucian303

+0

Sí, he cambiado en gran medida mi opinión sobre esto en los últimos años. Creo que funciona bien si la aplicación es bastante estática, pero en un mundo de implementación continua, una implementación basada en rsync desde un check-out de VCS parece ser la más segura: código enviado a los servidores, en lugar de ser retirado de VCS. –

7

En la misma situación, utilicé RedirectMatch, por dos razones. Principalmente, fue el único método que pude encontrar que estaba permitido en .htaccess en ese servidor con una configuración bastante restrictiva que no pude modificar. También lo considero más limpio, porque me permite decirle a Apache que sí, que hay un archivo allí, pero pretendo que no es cuando se sirve, así que devuelve 404 (a diferencia del 403 que expondría cosas de las que los visitantes no deberían estar al tanto)

ahora consideran lo siguiente como una parte estándar de mis .htaccess archivos:

 
## Completely hide some files and directories. 
RedirectMatch 404 "(?:.*)/(?:[.#].*)$" 
RedirectMatch 404 "(?:.*)~$" 
RedirectMatch 404 "(?:.*)/(?:CVS|RCS|_darcs)(?:/.*)?$" 
+0

Esto funcionó muy bien para mí, ¡gracias! – Nate

5

uso el siguiente que devuelve un simple 404 para el usuario, no revelando que en realidad existe el directorio de control de la fuente:

RedirectMatch 404 /\.(svn|git)(/|$)

Cuestiones relacionadas