Trucos de Protección con Contraseña HTAccess

♦ Publicado por Jeff Starr en .htaccess, Seguridad
Actualizado el 30 de junio de 2018 * 25 comentarios

Recientemente, un lector preguntó cómo proteger con contraseña un directorio para cada IP especificada y, al mismo tiempo, permitir el acceso abierto a todos los demás. En mi artículo, Trucos estúpidos de htaccess, muestro cómo proteger con contraseña un directorio para cada IP excepto la especificada, pero no para el caso inverso. En este artículo, demostraré esta técnica junto con una amplia variedad de otros trucos útiles de protección con contraseña, incluidos algunos de mi estúpido artículo de trucos de htaccess. Antes de entrar en las cosas jugosas, revisaremos algunos conceptos básicos de la protección con contraseña de HTAccess.

La protección por contraseña de HTAccess funciona en cascada

Antes de comenzar, hay algunas cosas que necesita saber sobre las diversas directivas de protección por contraseña de Apache. En primer lugar, estos trucos de protección con contraseña se aplican al directorio en el que se colocan. Por ejemplo, para proteger con contraseña todo el sitio, debe colocar uno de estos trucos en el archivo HTAccess raíz accesible a través de la web para su sitio. Las directivas HTAccess se aplican en la estructura de directorios, de forma en cascada, de modo que todos los subdirectorios también están protegidos.

Necesita dos archivos para la protección con contraseña: htaccess y htpasswd

La segunda cosa que necesita saber es que, en la mayoría de los casos, hay dos partes en cualquier implementación de protección con contraseña: el archivo .htaccess y el archivo .htpasswd. El archivo . htaccess contendrá cualquiera de los trucos proporcionados en este artículo, mientras que el archivo .htpasswd contendrá el nombre de usuario requerido y una versión cifrada de su contraseña.

Hay varias formas de generar su archivo .htpasswd. Si se siente cómodo con Unix, simplemente puede ejecutar el comando «htpasswd«. Por ejemplo, al introducir el siguiente comando se creará un archivo de contraseña de trabajo en el directorio /home/path/ :

htpasswd -bc /home/path/.htpasswd username password

Colocar el archivo de contraseña sobre el directorio raíz accesible a través de la web es una buena medida de seguridad. Si examina el archivo después de que se haya creado, lo único que contendrá es una línea que se vea similar a esta:

username:Mx1lbGn.nkP8

En lugar de ejecutar un comando Unix, es posible que prefiera utilizar uno de los 200.000 servicios en línea que proporcionan un generador de contraseñas en línea.

Independientemente de cómo o dónde decida crear su archivo . htpasswd, tenga en cuenta su ubicación para usarlo en sus archivos HTAccess asociados. Y sí, puede usar un archivo . htpasswd para varios archivos HTAccess colocados en varios directorios.

Sepa qué versión de Apache está utilizando

En cada uno de los ejemplos a continuación, las directivas están encerradas dentro de un contenedor <IfModule>. Esto es para evitar que su servidor se bloquee si los módulos de Apache requeridos no están disponibles o no están instalados. Generalmente, los módulos requeridos estarán presentes, pero la comprobación <IfModule> es una buena medida de precaución.

Al implementar cualquiera de los métodos de protección con contraseña de este artículo, asegúrese de verificar qué versión de Apache está utilizando antes de comenzar. Los ejemplos de este artículo suponen que está utilizando Apache 1.3 o 2.0, ya que los contenedores <IfModule> están comprobando la presencia del módulo mod_auth. Por lo tanto, si está ejecutando Apache 2.2 (o superior), querrá reemplazar los contenedores <IfModule> actuales con lo siguiente:

<IfModule mod_authn_file.c></IfModule>

En caso de duda, pregunte a su anfitrión, instale la extensión ShowIP Firefox o explore el panel de control de su servidor. Y, si simplemente no lo sabe, no le importa o no puede averiguarlo, simplemente elimine las etiquetas <IfModule> de apertura y cierre del método que desea usar y llámelo bueno. Sin ellos, si su servidor no está equipado con el módulo requerido, simplemente devolverá un mensaje de error 500, que se resuelve fácilmente eliminando las directivas de contraseña.

Puede personalizar el diálogo en el mensaje de contraseña

Lo último que debe saber antes de sumergirse en algunos trucos dulces es que puede personalizar el mensaje que se muestra en el mensaje de contraseña editando la siguiente línea en cada uno de los ejemplos de este artículo:

AuthName "Username and password required"

Al cambiar el texto dentro de las comillas, puede usar cualquier idioma que desee para la solicitud de contraseña.

Así que ahora, en este punto de nuestra aventura, estamos listos para sumergirnos en algunos jugosos trucos de protección con contraseña de HTAccess..

Protección básica con contraseña

Para proteger con contraseña su sitio o cualquier directorio, coloque este código en el archivo HTAccess asociado:

# basic password protection<IfModule mod_auth.c> AuthUserFile /home/path/.htpasswd AuthName "Username and password required" AuthType Basic <Limit GET POST> Require valid-user </Limit></IfModule>

Eso es lo más básico posible. Recuerde crear su archivo de contraseña y especificar su directorio en la primera línea. Pasemos a algo más interesante.

Acceso abierto para una IP, proteja con contraseña a todos los demás

Este método es excelente durante el desarrollo del proyecto, donde desea acceso abierto con la capacidad de dar acceso a otros a través de contraseña:

# password protect excluding specific ip<IfModule mod_auth.c> AuthName "Username and password required" AuthUserFile /home/path/.htpasswd AuthType Basic Require valid-user Order Deny,Allow Deny from all Allow from 111.222.333.444 Satisfy Any</IfModule>

Al colocar ese código en el archivo HTAccess del directorio que desea proteger, solo se permitirá el acceso abierto a la IP especificada; todos los demás deberán ingresar el nombre de usuario y la contraseña adecuados.

Acceso abierto múltiples direcciones IP, protección con contraseña para todos los demás

El código anterior se puede modificar fácilmente para proporcionar acceso abierto a múltiples direcciones IP y denegar a todos los demás:

# password protect excluding specific ips<IfModule mod_auth.c> AuthName "Username and password required" AuthUserFile /home/path/.htpasswd AuthType Basic Require valid-user Order Deny,Allow Deny from all Allow from localhost Allow from 111.222.333.444 Allow from 555.666.777.888 Satisfy Any</IfModule>

Puede agregar tantas IPs como sea necesario. Este método es excelente durante el desarrollo del proyecto, donde se aplicarán las siguientes condiciones:

  • El desarrollo del proyecto sigue siendo privado para los visitantes habituales
  • Se puede conceder acceso a los clientes (o a cualquier persona) proporcionando la contraseña
  • Los miembros del equipo de desarrollo tienen acceso abierto en sus máquinas respectivas

Además de proporcionar acceso sin restricciones a su equipo, es posible que también desee tener en cuenta ciertos servicios web incluyendo las siguientes directivas 7865> directiva):

Allow from validator.w3.org
Allow from jigsaw.w3.org
Allow from google.com

Acceso abierto para todos con protección por contraseña para direcciones IP específicas

Este método es útil para una variedad de situaciones, incluidos los casos en los que desea bloquear una lista de direcciones IP maliciosas.

# password protect only for specified ips<IfModule mod_auth.c> AuthName "Username and password required" AuthUserFile /home/path/.htpasswd AuthType Basic Require valid-user Order Allow,Deny Allow from all Deny from 111.222.333.444 Deny from 555.666.777.888 Satisfy Any</IfModule>

Puede enumerar tantas direcciones IP como sea necesario. También puede denegar desde bloques de IP completos truncando la dirección en consecuencia. Por ejemplo, para bloquear a todos los que vienen de una dirección IP que comienza con «999.888«, agregaríamos la siguiente directiva:

Deny from 999.888

Para obtener más información sobre cómo funciona esto, consulte esta sección de mi estúpido artículo Trucos de htaccess.

Acceso abierto para todos con protección por contraseña para un número CIDR específico

Similar al método anterior, aquí hay una técnica para requerir una contraseña solo de un número CIDR seleccionado. Este método es útil para bloquear mega spammers como RIPE, Optinet y otros. Si, por ejemplo, se encuentra agregando línea tras línea de directivas Apache Deny para direcciones que comienzan con los mismos primeros números, elija uno de ellos e intente una búsqueda whois. Dentro de los resultados de whois se mostrará el valor CIDR que representa cada dirección IP asociada a esa red en particular. Por lo tanto, el bloqueo a través de CIDR es una forma efectiva de evitar de manera elocuente que todas las instancias de IP del delincuente accedan a su sitio. Aquí hay un ejemplo generalizado de bloqueo por CIDR:

# password protect only for specified CIDR<IfModule mod_auth.c> AuthName "Username and password required" AuthUserFile /home/path/.htpasswd AuthType Basic Require valid-user Order Allow,Deny Allow from all Deny from 10.1.0.0/16 Deny from 80.0.0/8 Satisfy Any</IfModule>

Proteger con contraseña un solo archivo

He utilizado esta técnica innumerables veces. Para proteger con contraseña un solo archivo, simplemente agréguelo a su archivo HTAccess:

# password protect single file<IfModule mod_auth.c> <Files "protected.html"> AuthName "Username and password required" AuthUserFile /home/path/.htpasswd Require valid-user AuthType Basic </Files></IfModule>

Aquí estamos protegiendo un archivo llamado «protected.html » del acceso. El archivo solo estará disponible después de enviar el nombre de usuario y la contraseña adecuados.

Protección con contraseña de varios archivos

Para proteger varios archivos, el método es muy similar, solo que esta vez estamos utilizando la directiva FilesMatch de Apache. Esto nos permite listar tantos archivos como sea necesario:

# password protect mulitple files<IfModule mod_auth.c> <FilesMatch "(protected\.html)|(passwords\.txt)"> AuthName "Username and password required" AuthUserFile /home/path/.htpasswd Require valid-user AuthType Basic </FilesMatch></IfModule>

En este ejemplo, protegemos con contraseña dos archivos, » protected.html«y» passwords.txt«. Para agregar más, simplemente incluya más instancias de «|(filename\.ext) » en la lista de archivos.

Protección con contraseña de varios tipos de archivos

Con este método, estamos utilizando la directiva FilesMatch de Apache para proteger con contraseña varios tipos de archivos. Aquí hay un ejemplo:

# password protect mulitple file types<IfModule mod_auth.c> <FilesMatch "\.(inc|txt|log|dat|zip|rar)$"> AuthName "Username and password required" AuthUserFile /home/path/.htpasswd Require valid-user AuthType Basic </FilesMatch></IfModule>

Una vez en su lugar, este código requerirá una contraseña para acceder a los siguientes tipos de archivos: .inc, .txt, .log, .dat, .zip, y .rar. Personalice para satisfacer sus necesidades.

Protección con contraseña para todo, excepto para un solo archivo

Gracias a Brett Batie por esta poderosa técnica para permitir el acceso a un solo archivo mientras protege con contraseña todo lo demás:

# password protect everything except a single file<IfModule mod_auth.c> AuthName "Username and password required" AuthUserFile /home/path/.htpasswd Require valid-user AuthType Basic <Files "open-access.html"> Order Deny,Allow Deny from all Allow from 123.456.789 Satisfy any </Files></IfModule>

Cuando se coloca en el directorio raíz o en cualquier directorio padre, este código protegerá con contraseña todo excepto el archivo llamado » open-access.html«, que a su vez puede estar ubicado en cualquier directorio o subdirectorio posterior.

Para proteger todo y permitir el acceso a varios archivos, podemos usar la directiva FilesMatch de Apache en su lugar. Aquí hay un ejemplo que permite el acceso a «open-access-1.html«, «open-access-2.html«, y «open-access-3.html«:

# password protect everything except specified files<IfModule mod_auth.c> AuthName "Username and password required" AuthUserFile /home/path/.htpasswd Require valid-user AuthType Basic <FilesMatch "(open-access-1.html)|(open-access-2.html)|(open-access-3.html)"> Order Deny,Allow Deny from all Allow from 123.456.789 Satisfy any </FilesMatch></IfModule>

Tenga en cuenta que podemos consolidar la lista de archivos de la siguiente manera:

<FilesMatch "open-access-\.html">

Un enfoque alternativo para permitir el acceso abierto a cualquier archivo o grupo de archivos es ubicarlos en su propio directorio con las siguientes directivas agregadas a su archivo HTAccess:

Allow from all
satisfy any

Como puede ver, la funcionalidad mod_auth de Apache hace posible configurar casi la configuración de protección de contraseña que pueda necesitar. Desde impedir el acceso desde direcciones IP y dominios específicos hasta permitir el acceso solo para archivos y directorios específicos, Apache hace posible proteger sus archivos de manera fácil y segura. Y ni siquiera hemos entrado en las muchas posibilidades disponibles para configurar autorizaciones de usuarios y grupos específicos. Creo que lo guardaré para otro artículo. Mientras tanto, para obtener más información sobre el potente mod_auth de Apache, consulte la Documentación Oficial.

Jeff Starr

Sobre el Autor
Jeff Starr = Desarrollador Web. Especialista en Seguridad. Potenciador de WordPress.