Es habitual en un servidor web tener una o varias carpetas con datos sensibles a los que no queremos que pueda acceder cualquiera. O incluso un BackOffice sencillo para la gestión del sitio. Sin embargo, no siempre hay necesidad de complicarse programando un login con cuentas de usuario y sesiones, aunque siempre es recomendable.
Para esos sencillos casos y muchos otros, el servidor web Apache tiene una característica muy interesante y sencilla de emplear: las directivas de autenticación de .htaccess, que junto con el archivo .htpasswd que contendrá pares de usuario-contraseña (estas últimas encriptadas) blindarán el directorio (y sus subdirectorios) en el que se encuentren.
El primer paso a dar será instalar el programa htpasswd, que no suele venir por defecto en la instalación de Apache, sino en el paquete apache2-utils. Para proceder a su instalación en Ubuntu ejecutaremos lo siguiente:
sudo apt-get install apache2-utils
Ahora podremos generar el archivo de texto que contendrá los pares usuario-contraseña de manera sencilla gracias a este programa, mediante la siguiente linea:
htpasswd -c /ruta/al/archivo/.htpasswd juan New password: ****** Re-type new password: ******
El parámetro -c indica que el fichero se ha de crear, así que se creará el archivo .htpasswd en la ruta indicada una vez introduzcamos dos veces la contraseña del usuario indicado, en este caso juan.
Si queremos añadir más usuarios en el mismo archivo, simplemente ejecutaremos el mismo comando pero quitando el parámetro -c (create) puesto que el archivo ya existe:
htpasswd /ruta/al/archivo/.htpasswd manolo
Una vez introduzcamos dos veces la contraseña del usuario manolo, ya tendremos el archivo con los pares usuario-contraseña de nuestros dos usuarios. Consultemos su contenido:
$ cat /ruta/al/archivo/.htpasswd juan:$apr1$.AURr02I$hRF2VE3YC48lUz.iXBupe/ manolo:$apr1$5nbLzpBo$KnqzkBUT7km6PRcTbyVC//
Como vemos, se trata de un archivo en texto plano con el nombre de los usuarios y sus contraseñas encriptadas.
Ahora haremos que Apache utilice ese archivo para autenticar el acceso a un directorio. Para ello, debemos crear el archivo .htaccess que será el que contenga las directivas de autenticación de los usuarios, y que es un simple archivo de texto que podemos crear con cualquier editor de textos. Este archivo lo pondremos dentro de la carpeta que queramos proteger, teniendo en cuenta que bloqueará el acceso a todo el contenido de esa carpeta, incluso subcarpetas. El contenido del archivo será el siguiente:
AuthUserFile /ruta/absoluta/al/archivo/.htpasswd AuthType Basic AuthName "Sitio Protegido!" Require valid-user
En la primera línea del archivo podemos ver la directiva AuthUserFile, que indica la ruta del archivo en el que se encuentran los usuarios y sus contraseñas. Esta ruta no ha de ser absoluta, aunque se recomienda porque si no ha de ser relativa a ServerRoot, es decir, a la raíz del servidor web. Para conocer la ruta absoluta a una carpeta podemos utilizar el comando pwd.
En la seguda línea nos encontramos con la directiva AuthType, que indica el tipo de autenticación empleado. Aunque hay otros, el tipo Basic es ampliamente utilizado y el más recomendable.
La tercera línea contiene la directiva AuthName, que indica el título de los documentos protegidos, y es el mensaje que aparecerá en la autenticación.
Por último, en la cuarta línea, la directiva Require indica qué usuarios del archivo .htpasswd tienen acceso al directorio. En el caso de valid-user, se permite el acceso a cualquier usuario, pero podríamos limitar el acceso solamente al usuario juan de este modo:
Require juan
Una vez tengamos tanto el archivo .htaccess como .htpasswd el acceso al directorio estará restringido por contraseña. Pero puede ser que debido a la configuración de Apache debamos dar algún paso más.
En mi caso, haciendo solamente esto no funcionaba, así que he tenido que editar el archivo de configuración de Apache (como administrador), y para ello he utilizado el programa Vi. En la línea siguiente se ve la ruta donde se encuentra dicho archivo:
sudo vi /etc/apache2/apache2.conf
y en la etiqueta <Directory> de la raíz de mi web he tenido que sustituir la línea
AllowOverride AuthConfig
por ésta otra:
AllowOverride AuthConfig
tal y como se describe en esta página.
Y ya lo tenemos todo listo. Por si os gusta investigar, dejo una página con un poco más de información.