¡¡Compartenos!!

viernes, 5 de octubre de 2012

Proteger carpetas 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

  • 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
NOTA: La configuracion del Vhost (site en debian) en el que queramos activar la proteccion, ha te estar la directiva AllowOverride All (puede estar a AuthConfig FileInfo) que es algo mas seguro que All pero....

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. 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/secure/.htpasswd". 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 :

<?php
    die($_SERVER["DOCUMENT_ROOT"]);
?>

Recuerden: Dejen siempre el archivo .htpasswd fuera del alcance público y con un nombre distinto a .htpasswd, en caso de que eso no sea posible, cambienle el nombre por algo del estilo .aSf5cHJ9D y dejenlo en la carpeta de la web. 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. NOTA: SIEMPRE HA DE IR ENTRE COMILLAS

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 .htpasswd (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

<Files "miwebporno.html">
 Require valid-user
</Files>

<Files "misvideosxxx.html">
 Require user test123
</Files>

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 -c /home/secure/.htpasswd usuario contraseña

Esta linea es la mas basica. -c indica que se cree el fichero siempre

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 :

<?php
$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.

Enlaces de Interés

No hay comentarios:

Publicar un comentario