lunes, 17 de octubre de 2016

Squid: Un error común al combinar ACL's


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.ec
Las 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.com
Las 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 all
Por qué?:
http_access allow usuarios_contabilidad paginas_basicas paginas_bancos
Es 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_bancos
Es 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:

"Transporta un puñado de tierra todos los días y construirás una montaña" - Confucio