Como proteger nuestros sitios usando .htpasswd +Ejemplos

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 servidor

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).

Para los usuarios nuevos en Linux. Para ocultar un directorio o archivo solo es necesario que comience su nombre con un punto (.).

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.


14 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   krel dijo

    Ahora leyendo nuevamente el post me he dado cuenta que he cometido un pequeño gazapo. Cuando explico las lineas en la configuración del sitio, en AuthUserFile puse /var/www/.pass/.htpasswd cuando debería ser:
    /home/krel/.htpasswd.

    En la imagen está bien pero ahí se me escapó, es que tenía hecho anteriormente hecho el artículo con esa ruta, pero a última hora lo cambié y al parecer eso se me pasó corregirlo.

    Pido disculpas de antemano.

  2.   Fernando dijo

    Alguna alternativa para nautilus??

    1.    krel dijo

      Lo que preguntas creo que va por otro lado pero igual te contesto.
      Creo con Cryptkeeper te valdría para proteger directorios y cosas así.

      Si te soy sincero si algo que odio de gnome es nautilus. Dolphin (KDE) es mucho más potente precisamente para estas cosas de proteger, cifrar con gpg, etc …

  3.   DMoZ dijo

    Krel, gracias por los tutoriales tan completos que traes por acá y sobre todo por ser temas no tan habituales …

    Saludos !!! …

  4.   JuanCarlos dijo

    Hola todo salio bien pero.. cuando cierro la pestaña del chrome y abro otra, escribo la dirección y no me solicita la clave…

  5.   amiguete dijo

    quien dijo que no era llamativo.
    era justo lo que buscaba, y mejor explicado imposible
    muchas gracias.
    un saludo

  6.   basco7 dijo

    hola, te agradezco mucho por la información, sobre todo la parte de añadir multiples usuarios en el .htpasswd.

    Dios te bendiga!

  7.   Mohtadi dijo

    Enhorabuena , es un articulo muy bueno, claro y digerible. Muchas Gracias

  8.   eduardo dijo

    me da un error 500 cuando meto usuario y clave

    AuthType Basic
    AuthName «Tocc tocc»
    AuthUserFile /var/www/html/.pass/.htpasswd
    Require user Akira

  9.   eduardo dijo

    Que grande eso me pasa por comentar sin mirar los otros comentarios perodna.
    Funciona de maravilla gran post

  10.   Somnus Senior dijo

    Hola, bueno el tutorial, pero hay alguna alternativa a «htpasswd»? pregunto porque estoy usando linux mint 17.3 y no tengo el comando… tengo que instalarlo?

  11.   Somnus Senior dijo

    Vale, ya me di cuenta… tenía que instalarlo con sudo apt-get install apache2-utils

  12.   Fernando Montilla dijo

    Buenas, excelente tutorial, lo hice exactamente como lo indican acá, lo único es que en vez de ejecutar lo indicado en el punto 2:

    nano /etc/apache2/sites-available/default

    Me funcionó con

    nano /etc/apache2/sites-enabled/000-default.conf

  13.   Jorge Rodrigo Torrez Aramayo dijo

    Saludos, no me funciona 🙁 mi carpeta no aparece en mi servidor, es decir, protegí mi carpeta /var/222/html/content, y cuando entro desde el navegador no aparece la carpeta content. Help