Por muchos motivos puede resultar muy Ăștil tener controlado el acceso a determinados directorios de un servidor web o simplemente a contenidos de nuestra pĂĄgina o blog mediante un servicio de autenticaciĂłn basado en usuario y contraseña. Hablo de algo como la tĂpica ventana que nos aparece cuando deseamos entrar en una web con servicios restringidos.
Existen varias formas de generar ventanas con formulario de autenticaciĂłn pero una soluciĂłn interesante a nivel de servidor la brinda htpasswd. Es una utilidad que tiene por funciĂłn almacenar contraseñas de forma cifrada para ser utilizadas por Apache en servicios de autenticaciĂłn. Su uso nos permitirĂa mostrar determinados directorios o archivos vĂa http solo a usuarios identificados y sin que necesariamente estĂ©n a libre disposiciĂłn de todo el mundo.
Entiendo que no es un tema demasiado llamativo pero si que puede ser de utilidad a algunos. Con tal de no matarlos de aburrimiento me ayudaré de imågenes para que sea mås didåctico.
Consideraciones previas: Utilizaré Ubuntu Server 12.04.1 y Apache 2.2.22 en un entorno controlado.
Comenzamos.
Como algunos ya deben saber, por defecto los sitios disponibles de Apache se almacenan en el directorio /var/www/ y para este ejemplo crearé un directorio con una plantilla HTML e intentaré blindarlo con .htpasswd.
El directorio a proteger es /var/www/ejemplo/ donde he colocado la siguiente pĂĄgina.
En el navegador
1. Vamos a crear el .htpasswd.
El lugar donde estarĂĄ ubicado es de relevante importancia y colocarlo fuera de un directorio pĂșblico puede ser mĂĄs que recomendable. En mi caso lo ubicarĂ© en mi carpeta de personal (que no es un directorio pĂșblico de Apache) y con el nombre .htpasswd (a priori tampoco hace falta llamarlo de esa forma, pero el que estĂ© oculto siempre es bueno).
Con el comando siguiente creo el archivo .htpasswd para un usuario web que he denominado como: âLukeâ.
# htpasswd -c /home/krel/.htpasswd Luke
PedirĂĄ que le suministremos la contraseña dos veces, en mi caso he puesto âskywalkerâ (sin comillas). En un entorno no controlados debemos establecer contraseñas mĂĄs robustas. El cifrado por defecto en Linux es MD5 pero en Unix es una implementaciĂłn estĂĄndar de crypt() y para contraseñas con menos de 8 caracteres puede ser vulnerable. Ahora me surge la duda de si en BSD es igual.
El comando tiene esta estructura:
- -c â para crear el archivo
- /home/krel/.htpasswd â ruta absoluta del archivo.
- Luke â el nombre del usuario (puede ser el que querĂĄis)
De igual forma no obligo a nadie a utilizar la terminal cuando existen servicios en Internet para ello:
http://www.web2generators.com/apache/htpasswd_generator
http://www.htaccesstools.com/htpasswd-generator/
El resultado los copiamos en un archivo de texto y con el nombre .htpasswd si asà lo desean. Con respecto a este método no dejen de leer lo que comento en el siguiente pårrafo.
En nuestro caso veremos el archivo se ha generado donde los esperåbamos /home/krel/.htpasswd. En la imagen he resaltado que con este método el archivo pertenece al grupo y usuario de apache, que en Ubuntu se le llama www-data. Esto es importante porque si hemos generado de alguna otra forma el .htpasswd hemos de cercioramos que tenga permisos 644.
Bien, ahora veremos como son sus tripas:
Como pueden ver, estå el usuario (Luke) pero la contraseña estå cifrada.
De esta forma ya hemos creado y diseñado .htpasswd para el usuario Luke, al final no es mĂĄs que un contenedor para la contraseña. âTodo con un comandoâ serĂa un buen eslogan.
2. Configurar Apache de forma que lo utilice y permita ese servicio en el sitio.
# nano /etc/apache2/sites-available/default
Si tenéis varios host deberån trabajar sobre cada uno de ellos, en mi caso que solo tengo el que viene por defecto. No olviden que siempre es bueno hacer un backup de ese archivo.
Ese archivo tiene la estructura por defecto:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
âŠâŠâŠâŠâŠâŠ
âŠâŠâŠâŠâŠâŠ
</VirtualHost>
Precisamente dentro de las encabezamientos de Virtualhost es donde se especificarĂĄ la utilizaciĂłn de .htpasswd para acceder a determinado directorio. Lo hacemos tal como aparece la imagen a continuaciĂłn y adecuada a nuestro ejemplo:
Bien. Explico las lĂneas:
<Directory «/var/www/ejemplo/»>
Hay que poner el directorio a proteger.
AuthType Basic
Es el tipo de negociado de usuario y contraseña con el navegador, en este caso es Basic, sin cifrar.
Existe otro tipo de negociado: Digest, este si cifra el usuario y la contraseña sin embargo la Ășltima palabra la tiene el navegador en cuanto a si soporta dicho servicio. Digest se puede decir que es una implementaciĂłn un poco mĂĄs robusta ante sniffers. Les invito a profundizar en esto.
AuthName «Tocar la puerta antes de entrar».
Es mensaje que le saldrĂĄ al usuario en el navegador con el formulario de login y puede ser el que queramos.
AuthUserFile /var/www/.pass/.htpasswd
Ruta el archivo .htpasswd. Por esa razĂłn es que digo que ni siquiera es necesario nombrarlo .htpasswd, simplemente poniendo la ruta funcionarĂa igual.
Require valid-user
Esa lĂnea estĂĄ diseñada para mĂșltiples usuarios con contraseñas individualizadas. En caso que sea un Ășnico usuario puede resumirse como la siguiente variante.
Require user el_que_sea
En mi mi ejemplo podrĂa ser: Require user Luke
Y finalmente encerramos todo con </Directory>
Reiniciamos apache:
# service apache2 restart
Probemos.
Si no nos autenticamos correctamente nos saldrĂĄ un Error 401.
En el lado opuesto, si ponemos el usuario correcto y la contraseña nos dejarĂa pasar sin mayor inconvenientes.
Tips adicionales.
- Para añadir mås usuarios a un archivo htpasswd ya creado pueden usar este comando
htpasswd -mb /home/krel/.htpasswd Usuario Contraseña
Si tenĂ©is establecido âRequire userâ y no âRequire valid-userâ deberĂ©is añadir el nuevo usuario seguido del anterior y separado por un espacio. Ejemplo:
Require user Luke Anakin
- Utilizar grupos de usuarios
Si en lugar de usuario individuales preferimos o necesitamos trabajar con grupos en la siguiente web lo explican con mucho detalle y es un excelente artĂculo.
http://www.juanfelipe.net/node/23
- También podemos fijar otro tipo de cifrado, por ejemplo: SHA
htpasswd -sb /home/krel/.htpasswd Usuario Contraseña
AquĂ dejo una imagen de como se reflejarĂa en el .htpasswd el registro de una contraseña SHA. En ambos era âskywalkerâ.
MĂĄs informaciĂłn.
htpasswd â -help
Si quieren profundizar mĂĄs en este tema siempre es bueno RTFM!!!
http://httpd.apache.org/docs/2.0/es/howto/auth.html
http://httpd.apache.org/docs/2.2/misc/password_encryptions.html
También me ha resultado curioso este script en PHP de la pågina de la Universidad de Granada para crear un generador de htaccess y htpasswd. No lo he podido poner en pråctica pero les invito a a que «curioseen con la inteligencia».
La plantilla HTML la obtuve desde esta pågina por si alguién le interesa.
http://www.templatemo.com/
Espero que le haya gustado esta presentaciĂłn de htpasswd.