Esta semana me llamó un colega que recién está incursionando en el mundo de Squid (y en GNU/Linux en general) y me indicaba que estaba configurando unas reglas para restringir la navegación de sus usuarios pero que no le funcionaban.
Al revisar al detalle su configuración me volví a encontrar con un error común que cometemos cuando hacemos nuestros primeros pininos en Squid. A continuación detallo este error común para los novatos y también para los avanzados, considerando que estos últimos podrían hacer hincapie de esto en las clases o asesorias que imparten.
El Caso:
Se tiene un Servidor Proxy Cache implementado con GNU/Linux y Squid dentro de una red local 192.168.31.0/24.
Inicialmente se tienen 2 tipos de usuarios: Jefes y los demás usuarios. Los Jefes tienen acceso a todo y los demás usuarios solo a las páginas del grupo industrial.
La implementación de este requerimiento inicial se ve representada en la sgte configuración:
/etc/squid/usuarios_jefes: 192.168.31.20 192.168.31.21 192.168.31.22 192.168.31.23
/etc/squid/paginas_basicas: .miempresa.com.ec .miasociada.com.ec .misubsidiaria.com.ecLas ACL's y reglas que se tienen en squid.conf son:
acl usuarios_jefes src "/etc/squid/usuarios_jefes" acl paginas_basicas dstdomain "/etc/squid/paginas_basicas" acl red_local src 192.168.31.0/255.255.255.0
http_access allow usuarios_jefes http_access allow red_local paginas_basicas http_access deny all
Hasta aquí todo funciona bien, los Jefes tienen acceso a todo y el resto de usuarios de la red local solo a las páginas del grupo industrial.
A partir de este momento nace otro requerimiento, el cual es, de que el área contable de la empresa adicionalmente tenga acceso a las paginas de algunos bancos. Para lo cual se agrega la siguiente configuración:
/etc/squid/usuarios_contabilidad: 192.168.31.41 192.168.31.42 192.168.31.43 192.168.31.44
/etc/squid/paginas_bancos: .pichincha.com .bp.fin.ec .sfbp.fin.ec .intermatico.com .bancointernacional.com.ec .bancomachala.com .bancoguayaquil.com .cashbg.bankguay.comLas ACL's y reglas en squid.conf quedan de la siguiente manera:
acl usuarios_jefes src "/etc/squid/usuarios_jefes" acl usuarios_contabilidad src "/etc/squid/usuarios_contabilidad" acl paginas_basicas dstdomain "/etc/squid/paginas_basicas" acl paginas_bancos dstdomain "/etc/squid/paginas_bancos" acl red_local src 192.168.31.0/255.255.255.0
http_access allow usuarios_jefes http_access allow usuarios_contabilidad paginas_basicas paginas_bancos http_access allow red_local paginas_basicas http_access deny all
El problema es que los usuarios de Contabilidad siguen sin acceder a las páginas de los bancos.
La Solución:
http_access allow usuarios_jefes http_access allow usuarios_contabilidad paginas_basicas http_access allow usuarios_contabilidad paginas_bancos http_access allow red_local paginas_basicas http_access deny allPor qué?:
http_access allow usuarios_contabilidad paginas_basicas paginas_bancosEs como si yo dijera:
- PERMITIR el acceso SI se cumple: usuarios_contabilidad AND paginas_basicas AND paginas_bancos
Es decir nunca se va a cumplir la condición porque no hay forma que usuarios_contabilidad vaya al mismo tiempo a paginas_basicas y a paginas_bancos.
En cambio:
http_access allow usuarios_contabilidad paginas_basicas http_access allow usuarios_contabilidad paginas_bancosEs como si yo dijera:
- PERMITIR el acceso SI se cumple: usuarios_contabilidad AND paginas_basicas OR
- PERMITIR el acceso SI se cumple: usuarios_contabilidad AND paginas_bancos
Lo cual si se va a cumplir ;)
Para resumir:
La lógica de combinación de ACL's es así:
http_access allow|deny acl AND acl AND ... OR http_access allow|deny acl AND acl AND ... OR ...Es importante tenerlo bien en claro :D
Referencias: