Filtrar por usuario mediante squid + ldap | Algo de Linux

sábado, 16 de noviembre de 2013

Filtrar por usuario mediante squid + ldap

Lo más habitual es que utilicemos Squid en modo transparente para filtrar tráfico en nuestra organización y  supongo que se debe a que es la opción que menos trabajo da porque no nos obliga a configurar cada navegador de cada equipo para usar nuestro proxy. No obstante, en ocasiones puede ser muy interesante filtrar en modo no transparente o, si no tenemos posibilidad de cambiarlo todo, usar ambos mecanismos.

Así que, si pensáis en que queréis o necesitáis filtrar por usuario, es imprescindible que éste acceda a internet en modo no transparente. De otro modo, el filtrado por usuario no va a funcionar. ¿Y qué implica ésto? Que el usuario deberá introducir su login y su password cada vez que abra el navegador. Y os dirán que es muy incómodo tener que teclearlo una y otra vez. Bueno, pues les decís que dejen que el navegador guarde los datos de acceso.

Autenticación externa.- 
Para lograr que squid filtre por usuario vamos a utilizar un programa de autenticación externo. Si queréis, podéis escribir vuestro propio programa/script de autenticación externo, pero no os preocupéis porque squid ya nos proporciona unos cuantos.

En Debian, encontraréis los programas de autenticación externos que squid nos proporciona en el directorio /usr/lib/squid/. Como nuestra autenticación está basada en ldap, de todos los programas que hay, usaremos dos:
  • ldap_auth: Para validar usuarios.
  • squid_ldap_group: Para validar grupos.

Validación de usuarios.-
Antes de configurar squid, lo mejor que podemos hacer es utilizar el programa de autenticación externa desde un terminal para comprobar que funcionan las consultas que el programa va a realizar al servidor ldap. Veamos cómo:

Suponiendo que el nombre de nuestro servidor es "ldap", la base del árbol ldap donde se encuentran los usuarios es "ou=People,dc=instituto,dc=extremadura,dc=es" y utilizamos la versión 3 del protocolo LDAP, abrimos un terminal y ejecutamos el programa:

# /usr/lib/squid/ldap_auth -h ldap -b "ou=People,dc=instituto,dc=extremadura,dc=es" -v 3

Al ejecutarlo, el programa quedará esperando a que introduzcamos un usuario y su contraseña, separados por un espacio en blanco.

Si introducimos un usuario y un password válidos en ldap, nos devolverá OK:

root@ldap:~# /usr/lib/squid/ldap_auth -h ldap -b "ou=People,dc=instituto,dc=extremadura,dc=es" -v 3

profesor claveprofesor

OK

Si introducimos un usuario que no existe o el password introducido no es válido en ldap, nos devolverá ERR Success:

root@ldap:~# /usr/lib/squid/ldap_auth -h ldap -b "ou=People,dc=instituto,dc=extremadura,dc=es" -v 3

profesor claveerronea

ERR Success

Cuando terminemos de hacer comprobaciones, pulsamos Ctrl+C y saldremos del programa.

Validación de grupos.-
Además de establecer un control por usuario, puede que nos interese realizar también un control por grupos,  para establecer reglas en squid que controlen el acceso a los contenidos en función del grupo al que pertenece el usuario.
Al igual que en el caso anterior, lo mejor que podemos hacer es utilizar el programa de autenticación externa desde un terminal para comprobar que funcionan las consultas que el programa va a realizar al servidor ldap. Veamos cómo:

Suponiendo que el nombre de nuestro servidor es "ldap", la base del árbol ldap donde se encuentran los grupos es "ou=Group,dc=instituto,dc=extremadura,dc=es" y utilizamos la versión 3 del protocolo LDAP, abrimos un terminal y ejecutamos el programa:

# /usr/lib/squid/squid_ldap_group -h ldap -b "ou=Group,dc=instituto,dc=extremadura,dc=es" -f "(&(objectClass=posixGroup)(cn=%a)(memberuid=%v))" -B "ou=People,dc=instituto,dc=extremadura,dc=es" -v 3 -s sub

Como podéis ver, con el parámetro -f, indicamos el filtro para comprobar que un usuario es miembro de un grupo. Al ejecutarlo, el programa quedará esperando a que introduzcamos un usuario y un grupo, separados por un espacio en blanco.

Si introducimos un usuario y un grupo al que pertenece el usuario, nos devolverá OK:

# /usr/lib/squid/squid_ldap_group -h ldap -b "ou=Group,dc=instituto,dc=extremadura,dc=es" -f "(&(objectClass=posixGroup)(cn=%a)(memberuid=%v))" -B "ou=People,dc=instituto,dc=extremadura,dc=es" -v 3 -s sub

ponente teachers
OK

Si introducimos un usuario que no existe o existe pero no pertenece al grupo introducido, nos devolverá ERR:

# /usr/lib/squid/squid_ldap_group -h ldap -b "ou=Group,dc=instituto,dc=extremadura,dc=es" -f "(&(objectClass=posixGroup)(cn=%a)(memberuid=%v))" -B "ou=People,dc=instituto,dc=extremadura,dc=es" -v 3 -s sub

ponente students

ERR

Cuando terminemos de hacer comprobaciones, pulsamos Ctrl+C y saldremos del programa.

Configurar squid para autenticar usuarios.-
Bien, pues una vez que hemos visto cuáles son los programas de autenticación de usuarios y grupos mediante ldap que squid nos proporciona, ahora vamos a ver cómo configurar squid para autenticar usuarios.

Lo primero que haremos será editar el fichero /etc/squid/squid.conf:

# nano /etc/squid/squid.conf

Una vez abierto, buscamos el TAG: auth_param. Si no lo tenéis porque habéis quitado los comentarios de este fichero, buscadlo en el archivo squid.conf original, que viene completamente comentado, para saber en qué parte del squid.conf debéis insertar las siguientes líneas y las insertamos al final de la sección TAG: auth_param:

auth_param basic program /usr/lib/squid/ldap_auth -h ldap -b "ou=People,dc=instituto,dc=extremadura,dc=es" -v 3
auth_param basic children 5

Como podéis ver, básicamente estamos definiendo el programa que vamos a usar como autenticador y es el mismo que habíamos comprobado que funcionaba desde la línea de comandos.

A continuación nos vamos a la sección del documento donde se definen las ACL. Para ello buscamos el TAG: acl, nos desplazamos al final de esta sección e insertamos la siguiente línea:

# acl ldapauth proxy_auth REQUIRED

Por último, buscamos el TAG: http_access e insertamos una línea como la siguiente:

# http_access allow ldapauth

Esta vez no insertamos la línea al final de la sección. Tendremos que insertarla en el lugar que corresponda de acuerdo con las otras reglas que tengamos establecidas.

Una vez hecho ésto, reiniciamos squid para aplicar los cambios y listo:

# service squid restart

Configurar squid para restringir algunos usuarios.-
Por otra parte, en la sección donde se definen las ACL podríamos definir una nueva como la siguiente:

# acl usuariosrestringidos proxy_auth "/etc/squid/acl/deny_users"

Y en la sección de reglas definir reglas de filtrado para los usuarios que especifiquemos en el archivo /etc/squid/acl/deny_users

Configurar squid para autenticar grupos.-
Con lo expuesto anteriormente, todos aquellos usuarios registrados en el servidor ldap podrán navegar por internet. Eso sí, al abrir el navegador se les solicitará que introduzcan su usuario y contraseña.

Si ahora queremos ir un paso más allá y permitir o denegar que los usuarios de un cierto grupo naveguen o que lo hagan de forma limitada,  vamos a volver a modificar el fichero squid.conf.

# nano /etc/squid/squid.conf

Una vez abierto el fichero, buscamos la regla:

http_access allow ldapauth

Y la comentamos:

# http_access allow ldapauth

A continuación, buscamos el TAG: external_acl_type y al final de esta sección insertarmos lo siguiente:

external_acl_type group_auth %LOGIN /usr/lib/squid/squid_ldap_group -b "ou=Group,dc=instituto,dc=extremadura,dc=es" -f "(&(objectclass=posixGroup)(cn=%a)(memberuid=%v))" -h ldap -B "ou=People,dc=instituto,dc=extremadura,dc=es" -v 3 -s sub

Esta acl externa a la que hemos llamado group_auth, nos va a permitir lograr que squid compruebe si un usuario es miembro de un grupo.

A continuación nos vamos a la sección del documento donde se definen las ACL. Para ello buscamos el TAG: acl, nos desplazamos al final de esta sección e insertamos las acl que queramos. Por ejemplo, podemos especificar una acl para profesores:

# acl profesores external group_auth teachers

Donde, teachers es uno de los grupos registrados en nuestro servidor ldap.

También podríamos crear una acl para usar en reglas de filtrado para alumnos:

# acl alumnos external group_auth students

Por último, buscamos el TAG: http_access e insertamos reglas de filtrado:

http_access allow profesores

Esta vez no insertamos la línea al final de la sección. Tendremos que insertarla en el lugar que corresponda de acuerdo con las otras reglas que tengamos establecidas y dependiendo de cómo queráis filtrar.

Una vez hecho ésto, reiniciamos squid para aplicar los cambios y listo:

# service squid restart

Publicado por primera vez en http://enavas.blogspot.com.es