Control de acceso (ACL) con Squid Web Proxy

proxyMontar un servidor Web Proxy Cache con Squid es bastante sencillo, no solo a nivel de instalación sino también de configuración. La instalación de Squid es posible a través de repositorios oficiales, tanto de CentOS, RHEL, Fedora, Scientific Linux, etc como Debian o Ubuntu. Para quien tenga dudas sobre su instalación y configuración mínima inicial, tanto a nivel de servidor como de cliente (navegadores) le recomiendo pasarse por este otro artículo que publiqué hace ya unos años: instalación básica de Proxy Squid y configuración en navegadores.

En este artículo nos vamos a centrar en algunas posibilidades que nos ofrece Squid para los controles de acceso y configuración personalizada de parámetros por grupos, entre ellas se encuentra el bloqueo de determinados sitios web y URLs, segmentación de configuraciones por rangos IP, ACLs, etc.

Por un lado, Squid ofrece determinados tipos de elementos ACL que utilizaremos para construir nuestras reglas de control de acceso, algunos de estos elementos son, por ejemplo: src, dst, srcdomain, dstdomain, proto, browser, etc. Luego, tenemos las Access Lists que se combinan con los elementos mencionados anteriormente, algunas de ellas son: http_access, url_rewrite_access, cache, log_access

Ahora veremos algunos ejemplos, si quereéis profundizar y ver todas podéis echar un ojo a la documentación de Squid. Nosotros vamos directos a una serie de ejemplos para ver como construir ACLs. Todo se realiza dentro del archivo de configuración /etc/squid/squid.conf, en la parte final de archivo se especifica la sección en la que añadir nuestra configuración personalizada:

/etc/squid/squid.conf
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

Bloquear acceso a sitios web y URLs

Una de las opciones interesantes a la hora de configurar un Proxy Web a través del cual se ofrece salida a Internet a una determinada LAN es la capacidad de bloquear el acceso a ciertos sitios web. Con las ACL de Squid podemos especificar un listado de sitios web a bloquear a partir de una lista en un fichero de texto y si es necesario especificar un mensaje de error de acceso personalizado.

Con la siguiente configuración, denegamos el acceso a toda la LAN a los sitios web especificados en el archivo /etc/squid/urls-bloqueadas.txt, si os fijais bien usamos url_regex así que podemos usar expresiones regulares al especificar URLs en el archivo de texto (*.foo.com,www.b*.com, etc)

acl urls-bloqueadas url_regex "/etc/squid/urls-bloqueadas.txt"
http_access deny urls-bloqueadas
http_access allow all

La última línea es para especificar que tras todas las restricciones, el resto está permitido. Cuando un usuario que esté conectado al proxy intente acceder a una de esas URL recibirá un error de acceso denegado:

The following error was encountered while trying to retrieve the URL: http://facebook.com/

Access Denied.

Access control configuration prevents your request from being allowed at this time. Please contact your service provider if you feel this is incorrect.

Your cache administrator is root.

Y en el log de squid quedará registrado (realmente todo queda registrado) en el log de acceso:

/var/log/squid/access.log
1413298896.553 1 192.168.1.128 TCP_DENIED/403 3894 GET http://facebook.com/favicon.ico - NONE/- text/html
1413298896.614 1 192.168.1.128 TCP_DENIED/403 3926 GET http://facebook.com/favicon.ico - NONE/- text/html

Podemos personalizar el mensaje de error con la directiva “deny_info”, se puede especificar directamente la URL a la página de error o a un archivo local, siempre especificando a que ACL queremos que se aplique (en este caso urls-bloqueadas):

acl urls-bloqueadas url_regex "/etc/squid/urls-bloqueadas.txt"
deny_info http://miproxy.com/acceso-denegado.html urls-bloqueadas
http_access deny urls-bloqueadas
http_access allow all

Si especificamos un archivo local, debemos crear el archivo en la ruta “/usr/share/squid/errors/templates/” con el mismo nombre indicado en el fichero de configuración. En esa misma ruta tenéis todos las páginas de error por defecto:

/usr/share/squid/errors/templates/ERR_ACCESO_DENEGADO
acl urls-bloqueadas url_regex "/etc/squid/urls-bloqueadas.txt"
deny_info ERR_ACCESO_DENEGADO urls-bloqueadas
http_access deny urls-bloqueadas
http_access allow all

Por supuesto estas páginas de error pueden contener código HTML.

Bloquear acceso a sitios porno, ilegales, maliciosos y de piratería

Si bien esta parte podría entrar en la sección anterior, le he dedicado un punto aparte para que sepáis que existe el website www.squidblacklist.org que cuenta con listados gratuitos de websites por categorías para establecerlos en nuestros filtros. Entre ellos, listas de sitios web porno, sitios web maliciosos, de piratería, web proxies, sites ilegales, etc.

Podemos usar esas listas directamente en nuestro Proxy Squid descargandola e invocandola con una ACL:

acl PornSites url_regex "/usr/local/squid/etc/pornlist"
http_access deny PornSites

Permitir acceso a una URL sólo a una IP o segmento de red

Podemos necesitar que un sitio web o URL sea accesible sólamente desde determinadas IPs o segmentos de red. Lo podemos hacer con una ACL del siguiente modo:

acl vip_users src 192.168.1.0/25
acl vip_url url_regex ^http://www.miurl.com*
http_access allow vip_users vip_url
http_access deny special_url

ACLs basadas en MAC en lugar de IP

Si necesitamos establecer control de acceso en capa 2 a través de las MAC podemos hacerlo con la siguiente configuración

acl MAC1 arp A1:C2:E3:D4:c5:E6
acl MAC2 arp A1:C2:E3:D4:c2:E2
http_access allow MAC1
http_access deny MAC2

Permitir acceso por días u horas

Podemos especificar que ciertas IPs o segmentos de red tengan acceso a través del proxy únicamente en determinado momento, ya sean días u horas. Para ello creamos una ACL y con el valor “time” de ACL podemos especificar los días de la semana (MTWHF…) o el intervalo horario de acceso:

acl USUARIOS_SOLO_TARDES src 192.168.1.100 192.168.1.101 192.168.1.102
acl TARDES time MTWHF 16:00-20:00
http_access allow USUARIOS_SOLO_TARDES TARDES
http_access deny USUARIOS_SOLO_TARDES

Estos son algunos ejemplo de lo que podemos hacer con Squid en relacion a control de acceso. Son bastante útiles cuando usamos el proxy como salida para una conexión común a Internet y queremos establecer distintas políticas de acceso y seguridad por usuarios. Existen muchas más opciones y granularidad a la hora de aplicarlas, si queréis investigar más lo dejo en vuestras manos.

5 comentarios en “Control de acceso (ACL) con Squid Web Proxy

  1. buenas quisiera saber como podria hacer que las paginas que tengo bloqueadas por mi lista llamada prohibidas puedan ser habiertas en ciertas horas es decir, que el bloqueos de la spaginas se elimine una hora al dia

  2. Hola, tengo un proxy corriendo en debian e implementado con AD de un dominio windows server 2008 R2, alguna idea como se puede o si es que se puede permitir acceder a paginas a algunos usuarios?. Por lo que he visto no se puede si se usa squid con AD (Active Directory)

    • Tengo la misma pregunta! hace tres años he buscado por todo internet y sin poder resolver nada. Solo por ip, tengo entendido que cuando se verifica usuario y contraseña el squid te devuelve OK no el nombre del usuario.

  3. Hola, quisiera saber si en lugar del fichero permitidos donde se ha de poner la urls de los sitios de internet permitidos se puede configurar el squid para usar un fichero de permitidos con las IP de los sitios de internet.
    Gracias
    Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *