lunes, 19 de enero de 2015

Protegiendo directorios en aplicaciones que corren sobre Apache

Uno de los errores más frecuentes al desarrollar aplicaciones web es dejar directorios críticos accesibles a cualquier persona, los cuales pueden contener archivos y scripts con información sensible que solo debería ser visible a usuarios autorizados o a la propia aplicación.

Ejemplo de acceso a un directorio web por cualquiera
Ejemplo de acceso a un directorio web por cualquiera

En el ejemplo anterior se ve como es posible acceder al contenido de un directorio y explorar sus archivos, e incluso descargar y visualizar su contenido dependiendo de su naturaleza. Lo anterior se da porque no hay un archivo "index" que es el primero que ejecuta el servidor Apache, por lo cual la solución más inmediata es definir un archivo index que muestre un mensaje al usuario cuando intente acceder al directorio o que automáticamente lo redireccione a otro lugar.

Por ejemplo con php el contenido del index podría ser:

header("Location: ../error_acceso.php")

Y el contenido del archivo error.php sería algo como:

echo 'Usted no tiene permisos para acceder a esta sección!
Contactar al administrador';

Error de acceso a directorio personalizado
Error de acceso a directorio personalizado con PHP

Otra manera de asegurar un directorio es haciendo uso del propio servidor Apache (el servidor http más usado en internet), el cual nos provee un mecanismo que permite mediante un archivo de configuración creado por nosotros mismos, agregar diferentes características a los directorios que conforman una aplicación web, entre ella la autenticación.

Para añadir autenticación (acceso con usuario y contraseña) a un directorio lo primero que debemos hacer es crear un archivo de texto plano llamado .htaccess el cual debe ser guardado en el directorio que debemos proteger y cuyo contenido debe ser algo como esto:

AuthName "Acceso restringido"
AuthType Basic
AuthUserFile /opt/lampp/var/.htpasswd
AuthGroupFile /dev/null
require valid-user

Lo cual en resumen es lo siguiente:

  • La primera línea especifica el texto que se mostrará en la ventana de autenticación
  • La segunda línea especifica que será una atenticación básica usando el módulo mod_auth_basic de apache. Más información aquí.
  • La tercera línea indica el archivo .httpasswd donde están almacenados el usuario y clave válidos, el cual se explicará unas líneas más adelante.
  • La cuarta línea especfica la ubicación de la lista de usuarios autorizados para autenticarse, que este caso es ninguna (null) ya que solo usaremos el que esté especificado en el archivo .htpasswd.
  • La quinta y última línea indica que solo tendrán acceso los usuario válidos (previamente autenticados).

Finalmente se debe generar el archivo .htpasswd que contendrá el nombre de usuario y la clave encriptada válidos para acceder al directorio. Para generarlo sólo basta con acceder a la carpeta bin de nuestra instalación de apache, que para mi caso que estoy sobre linux y uso XAMPP es /opt/lampp/bin, y desde allí ejecutar el programa httpasswd así:

sudo ./htpasswd -c /opt/lampp/var/.httpasswd usuario

Donde  /opt/lampp/var es la ruta donde se guadará el archivo, la cual debe coincidir con la especificada en el archivo .htaccess y debe ser una ruta interna accesible por la aplicación pero no accesible desde internet (por seguridad no usar ubicaciones contenidas en los archivos htdocs, www o similares); y usuario será el nombre de usuario que queremos usar para autenticarnos. una vez lo ejecutemos el programa nos preguntará la clave que asignaremos, la escribimos y la confirmamos:


Ejecutando httpasswd de apache
Ejecutando httpasswd de apache
Y listo, una vez creados los archivos y si apache tiene la configuración correcta con los módulos necesarios habilitados, cada vez que se intente acceder al directorio protegido el navegador nos solicitará usuario y clave; sin embargo no debemos ser confiados y usando el sentido común debemos evitar a la medida de lo posible publicar información sensible en los directorios y archivos de las aplicaciones web.