Proteger carpetas en servidor web Apache con .htaccess y .htpasswd

Aprende a proteger directorios de tu página web mediante archivos .htaccess de una forma sencilla. Algunos paneles de control tienen la opción integrada, pero nunca está de más saber hacerlo manualmente. Sobre todo porque así es más extendible.

Requisitos

  • Al menos la enseñanza primaria o equivalente
  • Tener conceptos mínimos sobre .htaccess y .htpasswd y como editarlos
  • Necesidad de proteger una carpeta del alcance de los mirones, o encontrar diversión en hacerlo
  • 7 minutos de su tiempo

Conociendo a .htaccess y .htpasswd

Así se llaman los dos archivos más importantes para modificar cosas en nuestro servidor. No tienen ni extensión ni nombre, simplemente son así. Contienen texto plano, por lo que pueden ser editados con el Bloc de Notas, el Programmers Notepad, Gedit, nano, wim, … cualquier cosa que trabajo con texto plano (Word NO) El archivo .htaccess además de para proteger carpetas, sirve entre otras cosas para utilizarlo con el mod_rewrite de Apache y nos salgan urls cortas, como la de este tutorial . En esta ocasión, .htaccess establecerá el tipo de permiso necesario y qué usuarios pueden acceder a qué archivos, mientras que .htpasswd guardará el nombre de usuario y contraseña de cada uno de ellos.

.htaccess

Este archivo lo colocaremos en la carpeta que queremos proteger. Editemos el .htaccess con algo similar a :

AuthUserFile /ruta/absoluta/hacia/.htpasswd
AuthName AquiPuedesPonerLoQueQuieras
AuthType Basic
require user test123

Veamos línea a línea

AuthUserFile /ruta/absoluta/hacia/.htpasswd

Le tenemos que indicar la ruta absoluta (del servidor) hacia nuestro archivo .htpasswd, por norma general el archivo de contraseñas se pone fuera del alcance de la web, es decir, fuera de la carpeta public_html o similar, como por ejemplo «/home/usuario/.htaccess». En un servidor decente y con accesso por SSH o similares es muy fácil saber cual es la ruta absoluta hacia tu web, en caso contrario puedes utilizar este pequeño php para descubrirla :

die($_SERVER[«DOCUMENT_ROOT»]);
?>

Recuerden: Dejen siempre el archivo .htpasswd fuera del alcance público, en caso de que eso no sea posible, cambienle el nombre por algo del estilo .aSf5cHJ9D. No evitarás que puedan descubrir tus usuarios y contraseñas, pero le pones el camino bastante más dificil.

AuthName AquiPuedesPonerLoQueQuieras

Muestra el nombre del sitio, te aparecerá una ventanita preguntando el nombre de usuario y contraseña con un mensaje similar a «Está intentando entrar a AquiPuedesPonerLoQueQuieras, debe especificar un nombre de usuario y contraseña». Da exactamente igual lo que pongas, no tiene un efecto sobre el nombre real de la carpeta o archivos.

AuthType Basic

Indica que el tipo de autentificación es básico.

require user test123

Indica que el único usuario que puede entrar es test123, cualquier otro -aunque la contraseña sea correcta- no será válido.
Tenemos variaciones de esa línea como por ejemplo :

require user test123 otrousuario unusuariomas

Donde especificar 2, 3 o más usuarios. Tambien tenemos :

require valid-user

Donde podrán entrar todos los usuarios especificados en el archivo .htaccess (u otro nombre si así lo indicaste en la primera línea.

Podemos incluso proteger sólo algunos archivos de la manera :

AuthUserFile /ruta/absoluta/hacia/.htpasswd
AuthName AquiPuedesPonerLoQueQuieras
AuthType Basic
Require valid-user
Require user test123

Como ven admite mucho juego.
.htpasswd

Me referiré a .htpasswd como el nombre del archivo, pero como ya dije anteriormente, si no lo pueden esconder de la vista pública, al menos cámbienle el nombre.

Este archivo contiene una lista de nombres de usuario y contraseñas, en formato usuario:contraseña y cada nombre-clave en una línea independiente, por ejemplo :

test123:12JvVkeJRgm8A
otrousuario:$1$UNHEaBiV$NzwYQ8NhjzIOUmFyfGyrO/

Como ven, la contraseña está encriptada, por lo general con una variación del algoritmo MD5 realizada por Apache. Pueden encontrar en Internet varios sitios en donde encriptar las contraseñas (este por ejemplo).

Si disponemos de un servidor apache en local o acceso SSH a nuestro servidor web, podemos ejecutar el comando htpasswd para que nos cree el archivo, o nos devuelva la cadena en la misma consola :

htpasswd -nb usuario contraseña

Esta línea imprimirá en consola la cadena a agregar (manualmente) a nuestro archivo .htpasswd

htpasswd -cb .htpasswd usuario contraseña

Esta otra escribirá en el .htpasswd la cadena corespondiente. La documentación del comando htpasswd es corta pero bastante interesante.

En cualquiera de los casos, hasta el momento hemos de añadir manualmente las parejas usuario:contraseña a nuestro archivo .htpasswd, lo cual puede ser bastante engorroso, para ello podemos utilizar PHP para modificar el contenido de ese archivo, por ejemplo un script sencillo que se limita a añadir los nombres de usuario y contraseñas :

$archivo = $_SERVER[«DOCUMENT_ROOT»].’/.xAF3fvV4′;
$contenido = $username.»:».crypt($password);

if (is_writable($archivo)) {
if (!$handle = fopen($archivo, ‘a’)) {
echo «No se puede abrir el archivo ($archivo)»;
exit;
}

if (fwrite($handle, $contenido) === FALSE) {
echo «No se puede escribir en el archivo ($archivo)»;
}

fclose($handle);

} else {
echo «El archivo $archivo no se puede escribir»;
}
?>

Nos fijamos en dos cosas :

  • A la función fopen le pasamos el parámetros «a» de append (añadir a continuación), por lo que sólo añade nuevos usuarios.
  • Usamos la función de php crypt, en vez del MD5 que supuestamente es el algoritmo que se debe usar. La razón de usar crypt en vez de md5, es que es algo más completa, y perfecta para este ejemplo.


4 respuestas a «Proteger carpetas en servidor web Apache con .htaccess y .htpasswd»

  1. te la rifaste, muchosasumen que todos ya sabemos del tema y n entiendo ni una fregada lo que estan diciendo. Aqui te fuiste paso por paso ya me queda mas claro que tengo que hacer, gracias por dedicar una parte de tu tiempo para repartir conocimiento. un 10

  2. Gracias tio!
    Muy bien explicado todo. Me estaba volviendo loco porque no sabía cual era la ruta en mi servidor, jeje

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.