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

Imagen de iknaxio

Tema: 

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 area 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:

Comentarios

Creo que tienes un error,

Creo que tienes un error, supongo que de tipeo. Las ACL siguientes:

acl paginas_basicas src "/etc/squid/paginas_basicas"
acl paginas_bancos src "/etc/squid/paginas_bancos"

¿No deberían ser de tipo "dst" o "dstdomain"?

Saludos,

- Edwin

----
Edwin Boza
about.me/edwinboza

Gracias

Imagen de iknaxio

Yo también pague con esta novatada. Y mas aun, mi tesis de grado era sobre una interfaz gráfica para squid, y no sabia porque diantres no funcionaba, hasta que me puse a leer documentación y allí estaba la respuesta jejeje

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

Hay otro punto en el que

Imagen de deathUser

Hay otro punto en el que suelen fallar (equivocarse), en uno de los URLs que citas como referencias se puede leer:

[quote]For each request that Squid receives it will look through all the http_access statements in order until it finds a line that matches. It then either accepts or denys depending on your setting. The remaining rules are ignored.[/quote]

Es decir, que las reglas se leen en orden, hasta que se encuentra una regla que hace match, y el resto es ignorado, por lo que si primero se puso un accept y luego se quiere poner un deny, pues no llega hasta el deny, ojo con el orden de las reglas ;)

bye
;)

Eso es cierto

Imagen de iknaxio

El orden de las reglas también es un error muy común al implementar squid y esto también aplica en iptables.

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