# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Apache: permitir acceso a un directorio con autenticación para una IP / CIDR


ApacheEn su día, en el artículo de trucos sobre .htaccess vimos como configurar la autenticación (solicitando usuario y password) para un directorio dentro de un website (o para el website completo). En este caso lo que vamos a hacer es proteger un directorio pero excluir una IP o rango CIDR para que pueda acceder al mismo saltando esta protección.

Partimos de la base de que tenemos configurado en nuestro website, dentro del fichero .htaccess (o a nivel de virtualhost) la autenticación para todos los usuarios:

AuthType Basic
AuthName “Prompt”
AuthUserFile /var/webs/test.com/.htpasswd
Require valid-user

Ahora queremos que todos los visitantes se autentiquen excepto los que provengan de la IP 192.168.1.128:

AuthType Basic
AuthName “Prompt”
AuthUserFile /var/webs/test.com/.htpasswd
Require valid-user
Order allow,deny
allow from 192.168.1.128
satisfy any

La directiva satisfy any permite, tanto para la autenticación como el acceso, que en el momento que se cumpla uno de los requerimientos se permita la petición, haciendo así bypass de la autenticación. Si por el contrario, se quisiera que se cumplieran todos los requerimientos para acceder usaríamos satisfy all.

Podríamos tambien permitir rangos completos, denegar a IPs o CIDR, etc

allow from 192.168.1
allow from 192.168.1.0/24
...

Lighttpd: proteger una carpeta o website con contraseña


LighttpdSi utilizamos Lighttpd y necesitamos una funcionalidad similar a la que nos ofrece el servidor web Apache para proteger con password un directorio o virtualhost (en este caso vía .htaccess o directamente en el virtualhost con AuthType, AuthUserFile…) debemos hacer uso del módulo mod_auth y sus directivas. Vamos a ver como configurarlo.

Lo primero que debemos hacer es ver si el módulo está cargado en la configuración, para ello abrimos el fichero de configuración y revisamos la sección server.modules, donde debería mod_auth, sino lo añadís:

/etc/lighttpd/lighttpd.conf
server.modules              = (
            "mod_access",
            "mod_accesslog",
            "mod_fastcgi",
            "mod_rewrite",
            "mod_auth",
            "mod_cgi"
)

Después tenemos que configurar las tres directivas disponibles para la autenticación, el tipo de autenticación, el fichero en el que se almacenarán los datos de usuarios y claves y el nivel de debug:

auth.backend               = "htpasswd"
auth.backend.htpasswd.userfile = "/home/miwebsite/.lighttpdpasswd"
auth.debug = 0

Mediante auth.backend podemos especificar el tipo de autenticación, puede ser en texto plano (plain) o mediante htpasswd o LDAP. Elegimos htpasswd para tener la clave encriptada. Luego el fichero donde se almacenan las claves lo especificamos también (auth.backend.htpasswd.userfile). Finalmente el debug para verificar el funcionamiento, con 0 queda desactivado, con 1 vuelca a los logs cuando la autenticación es correcta y con 2 vuelca todo (access.log y error.log).

Ahora creamos fuera de la carpeta pública del sitio web el fichero con los usuarios y sus claves encriptadas por htpasswd:

# vim /home/miwebsite/.lighttpdpasswd
foo:soAb7vp63UATv7uaA2
chown lighttpd /home/miwebsite/.lighttpdpasswd && chmod 0600 .lighttpdpassword

Finalmente sólo nos queda seleccionar que directorio o website queremos proteger. Para ello buscaremos la sección $HTTP["host"] que contenga la web/directorio a proteger:

En negrita lo relacionado con la autenticación:

$HTTP["host"]  =~ "test.com" {
  server.document-root = "/home/test-com/"
  accesslog.filename         = "/var/log/lighttpd/test-access.log"
 auth.require = ( "/carpeta-protegida/" =>
 (
  "method" => "basic",
  "realm" => "Password protected area",
  "require" => "user=foo"
 )
 )
}

Y ya podemos reiniciar lighttpd para activar los cambios. En este caso la carpeta test.com/carpeta-protegida/ quedará protegida y únicamente el usuario foo podrá acceder.

# /etc/init.d/lighttpd restart

Generar fichero htpasswd desde línea de comandos


Un “truco” para generar usuarios y passwords para la protección de carpetas directamente desde la shell:

htpasswd -cb .htpasswd <usuario> <contraseña>

En este ejemplo, nos generaría el fichero .htpasswd siguiente:

root@localhost:~# cat .htpasswd
usuario:ktRS/8rW/AFmY

Después simplemente hay que añadir al fichero .htaccess correspondiente la autenticación, ejemplo:

AuthType Basic
AuthName "Area de acceso restringido"
AuthUserFile /ruta/al/.htpasswd
Require valid-user

¡Gracias vaxter!