Las listas de control de acceso es el punto que mas problemas causa en la configuración de squid.

A lo largo de este capítulo intentare clarificar tan importante punto.

Bases

Permitir o denegar el acceso a la caché es sólo una de las funciones del ACL. El ACL es usado también para las jerarquías de cachés. Por tanto, primero se define una lista ACL y después se permite o deniega el acceso a una función de la caché. En la mayoría de las ocasiones, esta función es "http_access", que permite o deniega a un navegador el acceso a squid. Usaremos esta funcioón como un ejemplo para los casos siguientes (como "icp_access").

Squid lee las directivas de arriba a abajo, para determinar que regla aplicar, e incluso determinar si debe permitir o denegar el acceso. Por tanto, si dispone de una clase C de direcciones, y quiere permitir sólo a esas máquinas acceder a la caché, utilizaremos estas directivas (asumiendo que la clase C 196.4.160.0  entera tendrá acceso):

acl hostpermitidos src 196.4.160.0/255.255.255.0
acl all src 0.0.0.0/0.0.0.0

http_access allow hostpermitidos
http_access deny all

La opción "src" de la primera línea es una de las opciones que se puede utilizar para decidir en que lista acl el usuario está incluido. Incluso es posible utilizar aspectos como el tiempo actual, o el sitio al que se dirigen. Para mas opciones, vea el fichero por defecto de squid (squid.conf.default).

Si un usuario del rango 196.4.160.* se conecta a squid usando TCP para solicitar una URL, squid leerá las líneas referentes a "http_access" (ya que es una conexión TCP y el cliente va a utilizar el método HTTP para solicitar el objeto). La lectura se realiza de arriba hacia abajo, y se para en la primera coincidencia para decidir si permitir o denegar la petición. En el ejemplo anterior, squid verá que la primera línea de "http_access" se cumple, y procederá a aplicarla. En este caso, permitirá el acceso y ejecutará la petición.

Pero tengamos en cuenta el siguiente ejemplo:

acl hostpermitidos src 196.4.160.0/255.255.255.0
acl all src 0.0.0.0/0.0.0.0

http_access deny all
http_access allow hostspermitidos

En este caso no funcionará, ya que squid aplicará la primera coincidencia (la primera línea) y denegará el acceso.


Opciones Avanzadas

En el fichero de configuración encontramos otros parámetros:

acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl all src 0.0.0.0/0.0.0.0

http_access deny manager !localhost
http_access allow  all

El campo "proto" de la primera línea se refiere que el acl bloquea un protocolo específico, en este caso el protocolo "cache_object". Puede utilizarse también otro protocolo, como "http" o "ftp". En concreto, se trata de un protocolo propio de squid. Este protocolo retorna información acerca de cómo está configurada la cache, o cómo se está ejecutando. Está dentro de la sección "http_access" ya que se trata de una petición HTTP a squid, pero en lugar de conectar a un servidor remoto es squid quien gestiona la información.

El ejemplo anterior indica: si squid recibe una petición intentando utilizar el protocolo "cache_object" (definido en el acl de manager), debe denegarla a no ser que provenga de localhost. De este modo, un programa que este ejecutándose en el servidor de caché puede obtener información del estado interno de squid, pero no una máquina del exterior. Recuerde que el carácter "!" significa NO, por lo que estamos diciendo "denegar manager NO localhost".

Acls basados en direcciónes de destino

Existe un caso frecuente, consistente en prohibir el acceso a una lista de sitios consideramos como "inapropiados". Squid no está optimizado para gestionar una larga lista de sitios, pero puede gestionar un número concreto de sitios sin problemas.

acl adultos dstdomain playboy.com sex.com
acl hostpermitidos src 196.4.160.0/255.255.255.0
acl all src 0.0.0.0/0.0.0.0

http_access deny adultos
http_access allow hostspermitidos
http_access deny all

Este ejemplo indica que las URLs playboy.com o sex.com serán denegadas, ya que así lo especifica la primera línea de la directiva "http_access". Si se piden otras URL´s, lógicamente la primera línea no es aplicable, y squid pasa a considerar la segunda y tercera. Por tanto, si el cliente se conecta dentro del rango permitido se cursará la petición. De lo contrario, la petición será rechazada.

Una última observación, este método considera exclusivamente los dominios. Para evitar conexiones especificando la IP de la máquina, debe utilizarse la directiva dsf acl.