Securitizando tu red: SQUID (Parte 2)

Escrito por Daniel Olivares

Introducción

Este es el segundo artículo de una serie que queremos desplegar para ayudar a securitizar un ambiente de casa o de PyME. Para que, a través de aplicaciones y herramientas Open Source, puedan tener visibilidad y protección de sus equipos y redes.

Dejamos un link al primero de la serie en la que instalamos Pi-Hole.

La seguridad en la red es un tema crítico en la actualidad y una herramienta que puede ayudar a mejorar la seguridad de navegación de los usuarios es un servidor proxy de navegación. Este tipo de servidores controla de manera fácil a qué tipo de contenido se le permite acceder a cada sistema conectado a la red.

SQUID es un “forward proxy” de alto nivel que puede mejorar la seguridad de los usuarios y controlar su navegación al implementar políticas de acceso (ACL). En este tutorial, te mostraremos cómo instalar SQUID en Ubuntu 22 y cómo configurarlo para aumentar la seguridad de tu red.

Prerrequisitos

Para instalar SQUID, idealmente necesitarás una instalación limpia, con acceso a Internet y actualizada de la distribución de tú preferencia. En este tutorial usaremos Ubuntu 22.

Además, tu sistema debe cumplir con los siguientes requisitos mínimos:

  • Tener al menos 2 GB de memoria RAM disponible
  • Tener un procesador de 64 bits
  • Disponer de al menos 10 GB de espacio libre en el disco duro
  • Contar con permisos root para instalar software en tu sistema

Paso 1 – Instalación de SQUID

Antes de continuar nos aseguramos que el sistema operativo se encuentre actualizado, para esto ejecutamos el siguiente comando.

sudo apt update && sudo apt upgrade

Una vez el sistema esté actualizado, procedemos a instalar SQUID con el siguiente comando.

sudo apt install squid

Luego habilitamos SQUID para que inicie con el sistema y reiniciamos

systemctl enable squid
systemctl restart squid

Para verificar que el servicio esté corriendo ejecutamos el siguiente comando

systemctl status squid

El cual debería entregar un output como el siguiente:

● squid.service - Squid Web Proxy Server
Loaded: loaded (/lib/systemd/system/squid.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-06-10 18:31:29 -03; 1h 8min ago
Docs: man:squid(8)

El último paso de su instalación es permitir el del puerto 3128/TCP en el firewall, y para ello vamos a ver la configuración en 3 distintos tipos: UFW, NFTABLES y IPTABLES.

UFW

ufw allow 3128 proto tcp comment "SQUID Proxy"

NFTABLES

nano /etc/nftables.conf
table ip filter {
  chain input {
    type filter hook input priority 0; policy drop;
    ct state established,related accept
    tcp dport 3128 accept
  }
}
sudo nft -f /etc/nftables.conf
sudo nft list ruleset

IPTABLES

sudo iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4

Paso 2 – Configuración SQUID

Antes de comenzar debemos respaldar el archivo de configuración squid.conf

cp -a /etc/squid/squid.conf /etc/squid/squid.conf.bkp

Y luego vaciamos el archivo de configuración con el siguiente comando:

cat /dev/null > /etc/squid/squid.conf

Copiamos la siguiente configuración como base

#       WELCOME TO SQUID 5.2
#----------------------------
# Global Config
http_port 3128
include /etc/squid/conf.d/*.conf
coredump_dir /var/spool/squid
forwarded_for delete
via off

#----------------------------
# Network ACL List
acl allow_network src "/etc/squid/networks/allow_network.txt"

#----------------------------
# Domain ACL List
acl misp_blacklist dstdomain "/etc/squid/sites/misp_blacklist.txt"

#----------------------------
# ACL
http_access deny misp_blacklist
http_access allow allow_network 
#----------------------------
# DENY ALL ACL
http_access deny all

La siguiente tabla detalla cuál es la función de las directivas de SQUID propuestas:

DirectivaDetalle
http_portNúmero de socket donde SQUID escuchará las peticiones de los clientes
coredump_dirPor defecto SQUID, deja los archivos principales en el directorio donde se inicia. Si se establece un directorio con está directiva, SQUID almacenará los archivos de volcado en el directorio indicado
forwarded_forEsta directiva le indica a SQUID como debe ser la IP del cliente en el campo X-Forwarded-For (XFF). Existen cinco posibilidades:
  • ON: SQUID incluirá la IP del cliente en el campo XFF.OFF: En el campo XFF la ip del cliente aparecerá como “unkown”TRANSPARENT: SQUID no modificará el campo XFF.DELETE: SQUID eliminará completamente el campo XXF.TRUNCATE: SQUID eliminará todos los campos XFF y dejará la IP del cliente como un solo campo.
viaSQUID incluirá el header HTTP “via”.
aclEsta directiva se compone de tres partes y es necesaria para definir listas de acceso en SQUID, donde se deberá indicar: Nombre de la ACL, Tipo de ACL y un argumento. Los tipos de ACL pueden ser:
  • IP y dominios
  • Segmentos de redes en formato IP/MASK
  • Listado de IP o dominios desde un archivo
  • Etc
Y el argumento indicar la dirección de la comunicación donde serán evaluados como por ejemplo:
  • src
  • dst
  • dstdomain
  • Etc
http_accessEsta directiva permite o deniega el acceso basándose en las ACL declaradas. Y para su uso se debe declarar una acción y el nombre de una ACL. 

Para mayor detalle sobre cómo configurar las directivas ACL o HTTP_ACCESS te invito a revisar la documentación oficial de SQUID en el siguiente link squid : Optimising Web Delivery (squid-cache.org)

La lectura de la sección ACL por el servicio SQUID es secuencial. En este caso, evaluará primeramente los sitios que se deben bloquear (misp_blacklist) y en caso de no realizar match, evaluará si la IP de origen está autorizada (allow_networks). Si la IP está autorizada, permitirá la navegación y caso contrario se aplicará la última regla con acción DENY ALL.

Paso 2.1 – Configuración de redes permitidas

Continuando con la configuración definiremos las redes e IP que vamos a permitir o denegar en el proxy según se requiera, para esto crearemos una carpeta “networks” en el directorio SQUID, utilizando los siguientes comandos.

mkdir /etc/squid/networks/
chmod 750 /etc/squid/networks/

Luego crearemos el archivo “allow_network.txt”, en donde las redes o IP se agregarán en formato X.X.X.X/Y

Paso 2.2 – Configuración de dominios bloqueados

Luego de configurar las redes e IP permitidas, continuaremos con la creación de un listado de dominios a bloquear. Como base utilizaremos los IOC de dominios disponibles en FINSIN desde el siguiente link:

Liberamos los IOCs de FINSIN! – FINSIN

Comenzamos creando el directorio de SQUID donde se almacenarán las diferentes listas de sitios, utilizamos el siguiente comando:

mkdir /etc/squid/sites/
chmod 750 /etc/squid/sites/

Con el fin de mantener los indicadores actualizados utilizaremos el siguiente SCRIPT que descarga los dominios registrados en los últimos 90 días y los guardará en el archivo “/etc/squid/sites/misp_blacklist.txt”.

nano /etc/squid/domain_update.sh

#!/bin/sh
URL=https://ioc.finsin.cl/Output_FINSIN_Domain
User_Agent= SQUID-Proxy/1.0
curl -s -H "User-Agent: $User_Agent" $URL > /etc/squid/sites/misp_blacklist.txt

Luego reiniciar el servicio de SQUID

systemctl restart squid

Para probar que el script funcione correctamente ejecutamos el siguiente comando:

sh domain_update.sh

Si los IOC se descargan con éxito el archivo “misp_blacklist.txt” se debería ver así:

Luego de validar que el script funciona correctamente, configuremos una tarea de crontab para que el listado se actualice automáticamente cada 6 horas. Para esto ejecutamos:

crontab -e

Luego añadimos la siguiente línea al final del archivo abierto:

* 6 * * * /etc/squid/domain_update.sh

Y finalizamos reiniciando el servicio SQUID

systemctl restart squid

Paso 3 – Validar navegación

Para probar la navegación y asegurar de que los sitios de destino están siendo bloqueados, configuraremos el navegador Firefox para que utilice el proxy HTTP/HTTPS (para que funcione con Edge o Google Chrome ir al cambio manual en el punto 4.3).

Para esto hay que ir a al menú: “Ajustes” 🡪 “General” 🡪 “Ajustes de conexión” 🡪 “Configuraciones”.

Aquí seleccionamos “Configuración manual de proxy” y donde dice “Proxy HTTP” ingresamos la IP del Proxy (en este caso 10.10.10.10) e indicamos como puerto el “3128”, finalmente hacemos click en “Usar también este proxy para HTTPS” y hacemos clic en “Aceptar”.

En el servidor SQUID utilizamos el siguiente comando para revisar las conexiones que se realicen:

tail -f /var/log/squid/access.log

Para la prueba intentaremos ingresar a algún dominio que se encuentre en el listado descargado desde FINSIN, para este caso utilizamos el dominio “equitylaw[.]pro”.

Paso 4 – Protegiendo nuestra red

Una vez configurado nuestro proxy SQUID, tendremos que definir cómo proteger nuestra red interna y para esto tenemos dos opciones: Proxy Transparente o Proxy Explícito.

Un proxy transparente se configura en equipos de red como por ejemplo un firewall o un switch (L4) para que el tráfico que definamos sea enrutado automáticamente hacía el Proxy, evitando tener que realizar la configuración equipo por equipo. Este tipo de configuración no la abordaremos debido a que depende de las capacidades del equipo de borde que cada uno disponga. Por lo que nos enfocaremos en la configuración de Proxy Explícito, la cual puede ser implementada en cualquier entorno.

Un proxy explícito permite varias formas de configuración como por ejemplo:

  • Por archivo WPAD.
  • Por archivo ProxyPAC.
  • Configuración mediante registro.
  • Configuración manual.
  • Configuración vía GPO

A continuación explicaremos cómo realizar la configuración de nuestro proxy mediante WPAD, ProxyPAC y configuración manual. Para los ejemplos utilizaremos un equipo con Windows 10 que no tiene salida a Internet.

Paso 4.1 – Configuración vía WPAD

La configuración que se describe a continuación es recomendada solo para estaciones fijas y en el caso de las estaciones móviles (notebook), es recomendable desactivar la configuración automática del PROXY. Esto en caso de que el equipo se conecte en una red pública comprometida donde el atacante utilice WPAD para manipular el tráfico sin que el usuario se de cuenta.

Una forma más automática de configurar nuestro proxy en los equipos es utilizar WPAD (más información en Wikipedia). Este protocolo se utiliza cuando el equipo utiliza la opción de autodescubrimiento de proxy, que se encuentra en los equipos Windows y en los navegadores como Firefox.

Para esto aprovecharemos lo aprendido en el primer tutorial de como instalar Pihole. Esto debido a que para usar está configuración tendremos que hacer algunas configuraciones adicionales en la red.

Consideraciones

  • Se necesitas un servidor DNS interno para agregar el registro WPAD.
  • También se necesita un servidor WEB para alojar los archivos de configuración. Puedes utilizar el mismo servidor PROXY, al cual se tendría que instalar un servicio web.
  • El servidor DHCP debe entregar el dominio de la red.

El primer paso lo realizaremos en el servidor WEB (interno preferiblemente), para este ejemplo utilizaremos NGINX, pero puedes ocupar cualquier servidor web.

Comenzaremos creando el archivo wpad.dat con los siguientes comandos.

mkdir /var/www/WPAD
touch /var/www/WPAD/wpad.dat
chmod -R 750 /var/www/WPAD
chown -R www-data:www-data /var/www/WPAD
cd /var/www/WPAD
ln -s wpad.dat wpad.da
ln -s wpad.dat proxy.pac

Luego editaremos el archivo wpad.dat y utilizaremos la siguiente configuración como base:

function FindProxyForURL(url,host)
{
return "PROXY :";
}

La siguiente tabla explica la principal directrices de la configuración

DirectivaDescripción
return
Esta directriz puede tener tres valores:
  • DIRECT: Las conexiones se realizan directamente sin usar el Proxy.
  • PROXY: Las conexiones se realizan a través del Proxy.
  • SOCKS: La conexión se realizará por el socket indicado.
Para la navegación por Proxy definimos la variable proxy y utilizaremos la directriz “PROXY” en formato “DIRECTRIZ> <FQDN>:<PORT>”. 

Para poder conocer en detalle las directivas disponibles para la autoconfiguración del archivo, te invitamos a revisar el siguiente link PAC Functions | FindProxyForURL

Con el archivo ya configurado, el siguiente paso será crear el virtualhost en NGINX. Para esto utilizaremos los siguientes comandos:

touch /etc/nginx/sites-available/wpad.conf
chmod -R 750 /etc/nginx/sites-available/wpad.conf
chown -R www-data:www-data /etc/nginx/sites-available/wpad.conf
ln -s /etc/nginx/sites-available/wpad.conf /etc/nginx/sites-enabled/wpad.conf

Y utilizaremos la siguiente configuración como base para el virtualhost

#######################################################################
## WPAD ###
#######################################################################
server {
        listen 80;
        server_name wpad wpad.<dominio>;
        server_tokens off;
        access_log      /var/log/nginx/wpad_access.log;
        error_log       /var/log/nginx/wpad_error.log;
        include mime.types;
        root /var/www/WPAD;
        default_type application/x-ns-proxy-autoconfig;
        index wpad.dat wpad.da proxy.pac;
}

Es importante destacar que la configuración del virtualhost debe realizarse para que solo escuche por puerto HTTP.

La siguiente tabla explica las principales directrices de la configuración propuesta:

DirectrizDetalle
listenAquí se indicará bajo qué puerto está escuchando el VHOST, en este caso será por el puerto 80.
server_nameNombre del “sitio” en este caso será wpad.<dominio>
server_tokenConfiguración de seguridad que oculta información de versión del servidor WEB.
access_log/error_logRuta donde se almacenarán los log de acceso y error al sitio.
includepermite incluir otros archivos a la configuración del sitio, en este caso se considera mime.types
rootRuta donde se encuentra el sitio que queremos publicar.
default_typeDefine cuál será la respuesta por defecto del MIME Type, en este caso será “application/x-ns-proxy-autoconfig”
indexDefine cuál o cuáles serán los archivos que serán utilizados como INDEX

Una vez guardemos el archivo, agregamos el mime.type de WPAD a NGINX. Para esto editamos el archivo “/etc/nginx/mime.types” agregando la siguiente línea:

application/x-ns-proxy-autoconfig dat;

Para verificar que la configuración de NGINX es correcta ejecutamos el comando

nginx -t

En caso de NO detectar errores aparecerá el mensaje “nginx: the configuration file /etc/nginx/nginx.conf syntax is ok”. Si este es el caso solo nos quedaría reiniciar el servicio.

systemctl restart nginx

Ahora configuraremos los registros “A” necesarios en nuestro PiHole, para esto nos dirigimos al menú “Local DNS” → “DNS Records” y agregamos los siguientes registros:

DomainIP
wpad.<dominio><WEB Server>
proxy.<dominio><Proxy Server>

Quedando la configuración de la siguiente forma (ejemplo con dominio aconetwork.cl):

Luego debemos agregar un registro “CNAME”, para esto nos dirigimos al menú “Local DNS” → “CNAME Records” y agregamos el siguiente registro:

DomainTarget
wpadwpad.<domain>

Quedando la configuración de la siguiente forma:

Con esto se tendría todo lo necesario para que nuestro equipo pueda descubrir automáticamente la configuración del Proxy. El siguiente paso es validar que nuestro equipo tenga configurada la opción de autodescubrimiento. Para esto debemos dirigirnos a la “configuración del Equipo” → “Red e Internet” → “Proxy”.

Una vez el equipo detecte la configuración WPAD, ésta se almacenará en la ruta : “Equipo\HKEY_USERS\S-1-5-19\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Wpad”.

Si revisamos el LOG de acceso en el servidor WEB podremos ver que se realizó una conexión desde nuestro equipo, solicitando vía GET el archivo wpad.dat.

Y desde el log del servidor PROXY podremos ver como se comienzan a procesar las conexiones del equipo.

Finalmente verificamos que el PROXY esté realizando el bloqueo a los sitios maliciosos.

Paso 4.2 – Configuración vía ProxyPAC

Para realizar la configuración mediante el archivo ProxyPAC aprovecharemos los siguientes puntos del paso 4.1:

  • El archivo proxy.pac utiliza el mismo formato y opciones del archivo wpad.dat, por lo cual pueden ser los mismos. Este es el motivo por el cual durante la creación de ese archivo se usó el comando “ln -s wpad.dat proxy.pac”.
  • El archivo proxy.pac quedó hosteado en el servidor web, por lo que podremos utilizar su URL para su configuración.

Teniendo esto en cuenta nos dirigimos a la “configuración del Equipo” → “Red e Internet” → “Proxy”y habilitamos la opción “Usar script de configuración”:

En esta parte ingresamos la dirección http://wpad./proxy.pac y luego hacemos clic en Guardar. Debería quedar así:

Está configuración  está se almacenará en la ruta : “Equipo\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings”.

Paso 4.3 – Configuración manual

Para esto debemos dirigirnos a la “configuración del Equipo” → “Red e Internet” → “Proxy”.

Luego bajamos hasta la sección de configuración manual del proxy, la cual debemos activar.

Luego ingresamos la dirección IP y puerto del proxy, y guardamos.

Una vez completamos la configuración el equipo tendrá salida a internet mediante el Proxy de navegación.

Para probar si la navegación funciona correctamente y el bloqueo de los IOC funciona correctamente, navegaremos hacia algún destino conocido y hacía otro malicioso sin tener que realizar alguna configuración adicional en el navegador.

Como se puede apreciar se puede acceder sin problemas al sitio de Emol a través del proxy. Ahora elegiremos un dominio del listado de IOC de FINSIN para probar el bloqueo.

Como era de esperar el dominio fue bloqueado y el Proxy muestra una página de error.

Paso 4.4 – Deshabilitar la configuración automática de Proxy vía REGEDIT (Opcional)

En caso de que necesitemos desactivar la configuración automática de Proxy en un equipo, podremos realizarlo modificando la llave de registro ubicada en “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinHttpAutoProxySvc” de valor “3” a “4”. 

Con esto evitaremos que se inicie el servicio de auto proxy HTTP.

Conclusión

En general, la instalación y configuración de SQUID puede ser una excelente manera de mejorar la seguridad y el rendimiento de una red. Con los pasos y recomendaciones adecuados, esta tarea puede ser realizada con éxito por cualquier administrador, lo que resulta en una red más segura y eficiente para todos los usuarios.

Los indicadores de compromiso también pueden ser filtrados a nivel de proxy de navegación por lo que se puede proteger cualquier red manteniendo los costos bajos a través de herramientas Open-Source.

Con este segundo equipo (el proxy Squid) podemos comenzar a vislumbrar una arquitectura de seguridad que vamos a ir armando a medida que avancen los artículos, esperamos que nos acompañen para el siguiente.

2 respuestas a “Securitizando tu red: SQUID (Parte 2)

Add yours

Deje un comentario

Crea una web o blog en WordPress.com

Subir ↑