navegación autenticada con Squid

7 de junio de 2010

El siguiente post muestra un ejemplo de cómo permitir que alguien pueda navegar por Internet solo si se ha autenticado. Es un ejemplo real donde todos los usuarios reciben una IP por DHCP (192.168.1.0/24) y los usuarios "invitados" reciben por DHCP una IP de un rango concreto (192.168.10.0/24).

Dado que todos los usuarios acceden a Internet vía Squid utilizaremos las opciones de autentificación (auth_parm) para logear a los usuarios. Primero de todo creamos un archivo con los usuarios y passwords de los invitados:

# touch /etc/squid/squid.users
# htpasswd /etc/squid/squid.users invitado1
# htpasswd /etc/squid/squid.users invitado2
...

Ahora editamos el archivo de configuración de Squid y configuramos los parámetros auth_parm:
auth_param basic children 3
auth_param basic realm Acceso a Internet restringido. Introduzca su usaurio y 
   contraseña...
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/squid.users
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

Esta es la descripción de los parámetros anteriores:

+ auth_parm basic children: numero de procesos/daemons que realizaran la autentificación. Dependerá un poco del número total de usuarios que puedan acceder a Internet en un momento dado.
+ auth_parm basic real: es el mensaje que saldrá en la ventana de login de tú navegado.
+ auth_parm basic program: definimos el sistema de autentificación y dónde debe buscar los usuarios. + auth_parm basic credentialsttl: especifica el tiempo que estará validado el usuario antes de volverle a pedirle el login.
+ auth_parm basic casesensitive: define si el nombre de usuario es case-sensitive.

Creamos ahora la ACL para decirle sobre que rango debe Squid pedir un login:
acl ip_invitados src 192.168.10.0/24
acl ip_lan src 192.168.1.0/24
acl auth_invitados proxy_auth REQUIRED
...
http_access allow ip_invitados auth_invitados
http_access allow ip_lan
http_access deny all

Básicamente lo que se necesita son dos listas de accesos. Una para definir las IPs que queremos logear (ip_invitados) y otra para definir el requisito de una autentificación (auth_invitados).

Existen varios métodos de autentificación cómo Basic, Digest, NTLM, Negotiate, cada uno de ellos pudiendo atacar contra un backend diferente: LDAP, MySQL, Radius, Active Direcotory, etc. Aquí hay algunos ejemplo con diferentes configuraciones.