Archivo .htaccess, ¿qué es y cómo funciona?

Publicado en Artículos, Seguridad,


Tweet about this on TwitterShare on Google+11Share on Facebook0Share on LinkedIn3

Un archivo .htaccess (hypertext access) o archivo de configuración distribuida es un archivo en formato ASCII como el que cualquiera puede crear con el bloc de notas, popularizado por el Servidor HTTP Apache, que es el más usado en el mundo cuando hablamos de servidores Web. Permite definir diferentes directivas de configuración para cada directorio (con sus respectivos subdirectorios) sin necesidad de editar el archivo de configuración principal de Apache.

Cuando hablamos de “directivas” nos referimos a la terminología que usa Apache para los comandos que se usan para los archivos de configuración.

Los archivos .htaccess son usados frecuentemente para especificar restricciones de seguridad para un directorio en particular, de aquí el sufijo “access“. Los servidores suelen usar el .htaccess para reescribir URLs largas y complejas, en otras más simples y fácilmente recordables, permiten bloquear a usuarios por su dirección IP y/o dominio, bloquear bots y arañas web. También permite controlar las páginas de errores cuando estos ocurren del lado del servidor.

Al momento de crear un .htaccess se debe recordar que este no tiene una extensión como cualquier otro archivo, se debe guardar en modo ASCCI y no en binario. Programas como el bloc de notas tienden a agregarle automáticamente la extensión .txt pero hay que quitarla. Otro punto a tener en cuenta es que el archivo debe tener permisos de lectura-escritura-ejecución (CHMOD) 644. Con esto hacemos que el archivo pueda ser usado por el servidor pero se previene que sea accedido a través del navegador. Más adelante veremos que el .htaccess también puede ser protegido mediante un par de lineas.

Los .htaccess están habilitados por defecto, pero se puede dar el caso en que no lo esté. Este comportamiento se controla a través de la directiva AllowOverride que se encuentra en el archivo de configuración httpd.conf

Gracias al .htaccess podemos controlar el comportamiento de nuestro sitios y aplicaciones Web para que estos sean un poco más seguros, hacer redirecciones, crear mensajes de error más personalizados, restringir el acceso a determinadas carpetas, evitar que se listen directorios específicos, etc.

El .htaccess por lo general siempre estará ubicado en el directorio raíz de nuestros sitios Web, también puede estar ubicado en directorios específicos dentro de un servidor Web pero por regla general, debería existir uno en todo directorio raíz.

Hay que tener en cuenta que al tener habilitado y configurado el archivo .htaccess, este tendrá un impacto negativo en nuestro sitio Web. La razón de esto es que cada vez que se haga una petición, se buscará en cada directorio posible si existe un archivo .htaccess, y de ser así se ejecutará cada directiva dentro de el. Esto genera cierta carga adicional a un sitio Web y puede degradar su performance

El archivo .htaccess tiene muchas posibilidades, pero visto desde el punto de vista de la seguridad, mencionemos algunas opciones a la hora de configurarlo:

1. Evitar que se liste el contenido de un directorio:

Si no tenemos restricciones al momento de listar el contenido de cualquier directorio, este mostrará todo lo que tenga, por ejemplo si tenemos una carpeta llamada “imágenes” en nuestro sitio Web y escribimos directamente su URL en el navegador http://www.tusitio.com/imagenes/ nos mostrará su contenido. Si queremos evitar este tipo de comportamiento podemos usar las directivas Options All -Indexes dentro del .htaccess para evitar que se liste cualquier directorio.

Supongamos que tienes una carpeta llena de eBooks y no quieres que se acceda directamente a ella, pues con la directiva IndexIgnore * lo puedes hacer. El comodín “*” indica que tome en cuenta todos los archivos dentro de una carpeta específica.

Imaginemos ahora que por alguna razón desea permitir que se listen solo archivos HTML pero ninguno que sea .pdf o .doc, la directiva a usar sería IndexIgnore *.pdf *.doc.

En caso contrario, si lo que se desea es permitir que se listen los directorios, sería suficiente con poner un .htaccess con la directiva Options +Indexes en el directorio que se quiera.

2. Evitar el acceso de archivos y carpetas

Esto resultaría muy útil cuando queremos proteger archivos críticos, como los archivos de configuración. Un ejemplo de esto podría ser:

<files archivo-configuracion.php>
order allow,deny
deny from all
</files>

Con esto evitamos que acceda directamente al archivo archivo-configuracion.php vía Web.

Un modo de proteger al mismo .htaccess podría ser:

<files .htaccess>
Order allow,deny
Deny from all
</files>

En el caso de las carpetas críticas o de cualquier otra también es igual. Una forma de evitar el acceso a ciertas carpetas podría ser redireccionandolas a la página principal del sitio Web, esto se conoce como redireccionamiento 301 y es útil en diferentes casos.

Redirect 301 /carpeta/ http://www.tudominio.com/
Redirect 301 /carpeta/carpeta/index.html http://www.tudominio.com/

Expliquemos lo anterior: la directiva Redirect al igual que otras como RewriteRule requiere dos parámetros, url_patron y url_destino. Mediante estos parámetro lo que hacemos es indicar que si hay una petición del navegador a una determinada carpeta, lo redireccionamos de “forma elegante” a nuestra página de inicio.

3. Páginas de errores personalizadas

Los servidores Web devuelven páginas que muestran un error específico, en caso de que este se haya producido; existen gran cantidad ellos, uno muy conocido es el 404 “Página no encontrada” o “Recurso no encontrado” o “Not found”. También existen otros conocidos como 401 “Authorization Required”, 403 “Forbidden”, 500 “Internal Server Error”. Por lo general estos errores se presentan en inglés ya que vienen desde el servidor, y por su puesto que no tendrán el mismo “look” de nuestro sitio.

Podríamos implementar páginas de errores más acorde a nuestro sitios, y en el idioma que queramos. Una forma de hacerlo puede ser:

ErrorDocument 400 /error/badrequest.html
ErrorDocument 401 /error/authreqd.html
ErrorDocument 403 /error/forbid.html
ErrorDocument 404 /error/notfound.html
ErrorDocument 500 /error/serverr.html

De esta forma estamos indicando que cuando se presente uno de estos errores, se mostrará una página que hayamos diseñado para ese fin. No solo se trata de una “mejor presentación” de los errores que se presenten, sino también se trata de llevar un control de los mismos.

Trata de mantener tu archivo .htaccess liviano, recuerda que este es procesado siempre que se haga una petición

4. Evitar el hotlink

El hotlink o “robo de ancho de banda” es algo (lamentablemente) muy común en Internet. Se trata de enlazar directamente a un recurso de un sitio Web a otro, como imágenes. La “víctima” sufre robo de ancho de banda (que se traduce en dinero) y el “ladrón” usa recursos que no le pertenecen.

Pongamos un ejemplo para ilustrarlo mejor: en un sitio http://sitio-origen.com se ha publicado un artículo que contiene algunas imágenes; a algún lector le gustó el contenido y quiso (re)publicar el mismo artículo en su sitio http://otro-sitio.com y enlaza todas las imágenes desde su origen; cada vez que alguien vea el artículo en http://otro-sitio.com estará usando ancho de banda de http://sitio-origen.com al mostrar las imágenes.

Para evitar esto, basta con poner las siguientes lineas en un .htaccess:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?mi-dominio.com/.*$ [NC]
RewriteRule .(jpg|jpeg|gif|png|bmp)$ - [F]

En el ejemplo anterior, si la petición a las imágenes (jpg|jpeg|gif|png|bmp) no viene directamente de mi-dominio.com no se permitirá el acceso.

Si por el contrario queremos mostrar una imagen en lugar de las originales con algo como “No robes ancho de banda” agregaríamos la siguiente línea:

RewriteRule .(jpg|jpeg|gif|png|bmp)$ http://www.dominio.com/no-hotlink.gif [R,L]

Hay que aclarar que si usamos una imagen lo ideal sería que no esté en nuestro servidor, sino estaríamos haciendo “la gracias del bobo” porque de igual forma se estaría usando ancho de banda. Esa imagen bien podría estar en algún servidor de imágenes gratuito. Para lo cual podría quedar como:

RewriteRule .(jpg|jpeg|gif|png|bmp)$ http://www.servidor-imagenes.com/no-hotlink.gif [R,L]

5. Bloquear a usuarios o a sitios

Esto puede resultar ser sumamente útil en muchos casos, tanto si se piensa que alguien puede estar tratando de fastidiarnos, evitar el spam, evitar el abuso de algunos Crawler (o araña Web), o por alguna otra razón.

Para hacer uso de estas técnicas debe estar habilitado el módulo de Apache mod_rewrite, que en la mayoría de los casos está habilitado; es necesario para utilizar la directiva RewriteEngine on

La forma de bloquear una dirección IP sería la siguiente:

<Limit GET HEAD POST>
order allow,deny
deny from 000.000.000.000
deny from 111.000.000.000
deny from 222.000.000.000
allow from all
</limit>

Con esto estamos especificando que se bloqueen las tres direcciones IP puestas de ejemplo y se permita el resto

Otro ejemplo para bloquear spammers podría ser:

RewriteEngine on
RewriteCond %{REMOTE_HOST} 000.000.000.000 [OR]
RewriteCond %{REMOTE_HOST} 111.000.000.000 [OR]

Bloquear un sitio que se considere dañino:

RewriteEngine on
RewriteCond %{HTTP_REFERER} sitio-malo.com [NC]
RewriteRule .* - [F]

O para bloquear múltiples sitios dañinos:

RewriteEngine on
RewriteCond %{HTTP_REFERER} sitio-malo.com [NC,OR]
RewriteCond %{HTTP_REFERER} sitio-malo2.com
RewriteRule .* - [F]

Expliquemos lo anterior:

  • RewriteEngine On es necesario para poder denegar el acceso a un “referente” (IP,Host,sitio web)
  • La terminación [NC] al final de un dominio indica que este se leerá de forma no sensitiva, es decir que puede ser dominio.com, Dominio.com, DOMINIO.COM
  • La [F] indica que rechace la petición, con lo cual el solicitante recibirá un error 403 “Forbidden”.
  • La diferencia entre bloquear un solo referente a varios es la terminación [NC, OR] al final del primer dominio del ejemplo, esto indica que aplicará la misma condición al siguiente dominio

Si al momento de probar alguno de estos ejemplo se genera el error “500 Internal Server” hay que agregar la siguiente línea:

Options +FollowSymlinks

Esto sucede en los casos en donde FollowSymLinks no está configurado en httpd.conf

Vimos que utilizamos letras en las directivas, como la F. A esto se les llama banderas y especifica alguna acción. Veamos algunas banderas para que te hagas una idea más clara:

  • R: (redirect) para forzar una redirección HTTP
  • F: (forbidden) para prohibir el acceso
  • G: (gone) para eliminar la URL
  • P: (proxy) para pasar la URL a mod_proxy.
  • L: (last) para detener el procesamiento.
  • N: (next) para continuar
  • C: (chain) para encadenar la regla activa con la siguiente
  • F: (type) para obligar un determinado tipo MIME.
  • NS: (nosubreq) para asegurarse que la regla sólo se aplica si no se realizan subpeticiones internas.
  • NC: (nocase) para que la URL no distinga mayúsculas de minúsculas.
  • QSA: (qsappend) para añadir una nueva cadena de consulta (query string) en lugar de sustituirla.
  • PT: (passthrough) para pasar la URL modificada a otro módulo apache.
  • S: (skip) para saltar la siguiente regla.
  • E: (env) para asignar una variable de entorno.

Nota: Todo (al menos los “legales”) programa como un navegador, un host, o todo software que realice peticiones a un sitio Web, debe identificarse, a eso se le llama “referente”, del ingles “referer“. Esto también se aplica a los bots o crawler que operan en Internet, como los de Google u otros buscadores que buscan actualizaciones en los sitios Web y enlazan las URL de cada sitio.

Otra de las cosas que debemos evitar que sucedan en nuestros sitios Web son los site ripper o “destripador de sitios”. Estas pequeñas monstruosidades son programas offline que operan “en las sombras”, su objetivo es descargar todos los archivos de un sitio Web, para luego verlos sin conexión. Esto claramente puede ocasionar problemas en la seguridad, a parte de que estos programas son altos consumidores de ancho de banda.

Existen muchos bots y rippers que pueden ocasionar daños a todo contenido online, y las listas pueden ser largas, pero pongamos algunos ejemplos reales para bloquear a estos indeseados:

Options -Indexes
RewriteEngine on
#Spammers
RewriteCond %{REMOTE_HOST} 12.226.240.248 [OR]
RewriteCond %{REMOTE_HOST} 24.111.102.26 [OR]
RewriteCond %{REMOTE_HOST} 24.117.121.113 [OR]
RewriteCond %{REMOTE_HOST} 65.30.216.140 [OR]
RewriteCond %{REMOTE_HOST} 67.87.64.23 [OR]
#Abusivos
RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Bolt 0 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Bot mailto:craftbot@yahoo.com [NC,OR]
RewriteCond %{HTTP_USER_AGENT} CazoodleBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [NC,OR]
RewriteRule ^.* - [F,L]
#Bloquear bot abusivos por IP
order allow,deny
allow from all
deny from 8.21.4.254
deny from 65.160.238.176/28
deny from 85.92.222.0/24
deny from 206.51.36.0/22
deny from 216.52.23.0/24

Cuando se utilicen reglas de escritura de URL agrega la opción [L] al final, esto le dirá al servidor que no procese más reglas

6. Obligar a que se use una conexión segura

Si se dispone de un certificado SSL se pueden agregar las siguientes líneas para obligar a que en todo el sitio se haga uso de SSL:

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Hay que hacer notar que si no se tiene un certificado SSL instalado, esto puede generar un error y no se pondrá tener acceso al sitio.

Para ver una descripción más detallada de las directivas que se pueden usar a la hora de configurar un archivo .htaccess se puede visitar el sitio Funcionalides básicas del Servidor HTTP Apache

Archivo .htaccess, ¿qué es y cómo funciona?
4.58 (91.52%) 33 votos

Etiquetas: , ,


Newsletter

Redes sociales

Centro de soporte

Centro de recursos