miércoles, 25 de junio de 2014

Cómo filtrar el tráfico https en Squid en modo transparente

Squid es un proxy muy potente y aquí hemos trabajado con él. Hoy veremos cómo usar la técnica SSL Bump para poner a Squid "en el medio" interceptando en modo transparente el tráfico "seguro" que va a través del puerto 443 y el protocolo https. Noten que esto no es muy ético y sería buena idea alertar a los usuarios de la red local que esto se está haciendo con fines de auditoría.

Como vimos en un post anterior, podemos crear nuestros propios certificados autofirmados para tratar con https en Apache y otras posibles aplicaciones locales, incluyendo Squid. A los fines de esta guía asumiremos que ya tenemos a Squid trabajando en modo transparente y que solamente estamos trabajando sobre el tráfico https.

Lo primero será crear un certificado autofirmado para Squid. Lamentablemente no podemos usar los mismos que fueron creados para Apache, ya que Squid solo trabaja con los certificados en formato PEM. Usando comandos similares podemos crear tanto la llave privada como el certificado o ambos en un mismo fichero, que sería el certificado con la llave privada incluida.

Creando el certificado
En un solo fichero crearemos el certificado autofirmado y su llave privada, usando el comando openssl, como en el post anterior. Vamos respondiendo interactivamente los requerimientos.
[fraterneo@rainbow ~]$ openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout squidcert.pem -out squidcert.pem 
Generating a 1024 bit RSA private key
.++++++
.....................++++++
writing new private key to 'squidcert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:DO
State or Province Name (full name) []:Santiago
Locality Name (eg, city) [Default City]:Santiago de los Caballeros
Organization Name (eg, company) [Default Company Ltd]:fraterneo
Organizational Unit Name (eg, section) []:fraterneo
Common Name (eg, your name or your server's hostname) []:rainbow.local
Email Address []:certad@yahoo.com
Configurando Squid
Ya con el certificado listo y antes de continuar, debemos asegurarnos que el Squid que tenemos instalado en nuestro sistema fue compilado con los parámetros que le ayudarán a soportar el procedimiento que estamos haciendo. Estos parámetros son --enable-icap-client y --enable-ssl, y con los siguientes comandos estos parámetros, de existir, saldrán resaltados en color. En Fedora, sistema usado para esta guía, Squid ya los tiene.
[fraterneo@rainbow ~]$ squid -v | grep ssl
[fraterneo@rainbow ~]$ squid -v | grep icap
Ahora copiamos el certificado en una ruta adecuada desde donde Squid lo pueda usar y configuramos el caché donde Squid guardará las copias de dichos certificados.
[fraterneo@rainbow ~]$ sudo mkdir /etc/squid/ssl_cert/
[fraterneo@rainbow ~]$ sudo cp squidcert.pem /etc/squid/ssl_cert/
[fraterneo@rainbow ~]$ sudo /usr/lib64/squid/ssl_crtd -c -s /var/lib/ssl_db
[fraterneo@rainbow ~]$ sudo chown squid /var/lib/ssl_db/
Editamos el fichero de configuración de Squid para agregarle algunos parámetros de SSL Bump y la ruta a nuestro certificado autofirmado.
#
# Recommended minimum configuration:
#

acl homenetwork src 192.168.2.0/24
acl pxenetwork src 10.0.2.0/24
acl forbidden url_regex "/etc/squid/forbidden"

acl SSL_ports port 443
acl Safe_ports port 80  # http
acl Safe_ports port 21  # ftp
acl Safe_ports port 443  # https
acl Safe_ports port 70  # gopher
acl Safe_ports port 210  # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280  # http-mgmt
acl Safe_ports port 488  # gss-http
acl Safe_ports port 591  # filemaker
acl Safe_ports port 777  # multiling http
acl CONNECT method CONNECT
#
# Recommended minimum Access Permission configuration:
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#HTTPS (SSL) trafic interception options
always_direct allow all
ssl_bump client-first all
#sslproxy_cert_error deny all
sslproxy_flags DONT_VERIFY_PEER
sslcrtd_program /usr/lib64/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB
sslcrtd_children 8 startup=1 idle=1

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access deny forbidden
http_access allow homenetwork
http_access allow pxenetwork
http_access allow localhost

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
http_port 10.0.2.1:3128 intercept

# Config for SSL interception
https_port 10.0.2.1:3129 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl_cert/squidcert.pem

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp:  1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern .  0 20% 4320

# Hostname of the local machine
visible_hostname rainbow.local
Configurando el Firewall (iptables)
Es necesario configurar nuestro Firewall para que trate el tráfico entrante a los puertos correspondientes de la forma en que esperamos.
[fraterneo@rainbow ~]$ sudo iptables -t nat -A PREROUTING -i em+ -p tcp --dport 443 -j DNAT --to-destination 10.0.2.1:3129
[fraterneo@rainbow ~]$ sudo iptables -t nat -A PREROUTING -i em+ -p udp --dport 443 -j DNAT --to-destination 10.0.2.1:3129
[fraterneo@rainbow ~]$ sudo iptables -t filter -A INPUT -m state --state NEW -m tcp -p tcp --dport 3129 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables -t filter -A INPUT -m state --state NEW -m udp -p udp --dport 3129 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables -t filter -A FORWARD -i em+ -m state --state NEW -m tcp -p tcp -d 10.0.2.1 --dport 3129 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables -t filter -A FORWARD -i em+ -m state --state NEW -m udp -p udp -d 10.0.2.1 --dport 3129 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables-save
[fraterneo@rainbow ~]$ sudo systemctl restart iptables.service
Configurando los clientes
En los clientes no es necesario hacer configuración, pero sí tomar en cuenta que la dirección IP de nuestro servidor Squid debe ser el gateway de los clientes para que los mismos procuren todo el tráfico http y https a través de Squid. Teniendo siempre presente que muchos sitios como facebook.com rechazan el certificado debido a que no está firmado por una autoridad, como ya mencionamos antes.


Más recursos:
http://wiki.squid-cache.org/Features/SslBump
http://www.squid-cache.org/Doc/config/https_port/
http://www.squid-cache.org/Doc/config/always_direct/

Artículos relacionados



Widget by Hoctro | Jack Book

30 comentarios:

  1. que versionn de squid usas y que version de linux

    ResponderEliminar
  2. y una consulta no tienes una guia para centos????

    ResponderEliminar
    Respuestas
    1. No. Pero la guía debiera funcionar, con los ajustes necesarios, igual en cualquier distribución de GNU/Linux.

      Eliminar
  3. tengo fallas para interceptar https en ubuntu

    ResponderEliminar
  4. Hice todos los pasos en Centos 7 y el squid funciona pero no se como probar que este funcionando con https. Cuando pido una pagina como www.hotmail.com que usa https el log del squid muestra esto: TCP MISS/301 770 GET http://www.hotmail.com/ HIER DIRECT/65.55.85.12 text/html. Puedo entrar y ver el correo pero no aparece registro alguno en el log. Solo algo parecido cuando leo un email o cuando salgo de hotmail. Fui en Linux al Sistema de Archivos donde se guardarían los certificados pero tampoco logre ver ninguno. Podrían orientarme?. Gracias.

    ResponderEliminar
    Respuestas
    1. Bueno, lo recomendable es que haga la guía tal cual está y luego la adapte a su escenario.

      El ejemplo no es la mejor forma. Es la única.

      Eliminar
  5. Tengo una consulta , squid me intercepta sin problemas las paginas seguras , y unicamente me permite acceder a las que indico en mis reglas acl. El problema esta en que necesito entrar en una pagina segura donde si necesito cargar un certificado valido instalado en mi navegador y no se como evitarlo
    Gracias

    ResponderEliminar
  6. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
    Respuestas
    1. Hola Juan.

      Para permitir solo tu PC debes crear una acl solo con la IP: 192.168.10.255. Para que sea la red completa: 192.168.10.0/24. El 24 es la máscara, eso equivale a poner 255.255.255.0, y te permitirá la red 10 completa.

      Pero ten en cuenta que la 255 es broadcast, mejor usa otra IP para tu PC, como de 254 hacia abajo.

      Un saludo.

      Eliminar
    2. muchas gracias claudio :) creo que comprendi, disculpa que borre el comentario anterior, estaba probando blogspot (nunca lo use) je... muchas gracias y buen blog!!!

      Eliminar
  7. Muy buen blog y excelente el artículo. No lo he probado pero tiene mucho sentido. Solo deseo preguntar si un certificado comercial comprado puede reemplazar a uno generado y firmado por nosotros mismos para evitar bloqueos al facebook u mensajes de advertencia. Muchas gracias

    ResponderEliminar
    Respuestas
    1. César, gracias por su comentario.

      Efectivamente, como dices, un certificado adquirido por un ente autorizado como Verisign evitará problemas de carga en los sitios.

      Un saludo.

      Eliminar
    2. segui paso lo del manual pero no me funciona, una pregunta como deben de estar configurada las reglas ip tables por defecto?........ademas de las que hay que agregar segun este manual

      gracias

      Eliminar
    3. Hola.

      Si no modificó nada de esta guía, todo debe funcionar. Verifique los logs del sistema y revise los puertos con nmap y el firewall desde otro equipo.

      Saludos.

      Eliminar
  8. hola soy nuevo quiero hacer un repositorio local de centos como ago que herramientas utilizo

    ResponderEliminar
    Respuestas
    1. Esto le puede ser de ayuda http://fraterneo.blogspot.com/2014/04/como-configurar-un-repositorio-local.html

      Saludos.

      Eliminar
  9. pero el puerto dice 3129 en iptables y el trasparente 3128

    ResponderEliminar
    Respuestas
    1. Eso es porque ya el 3128 se asume que fue trabajado. Lo que se está trabajando en esta guía en iptables es lo concerniente al puerto 3129. Pero ambos están en squid.conf.

      Saludos.

      Eliminar
  10. Hola Claudio,
    Soy Gabriel y trabajo para una importante empresa Argentina en el área de redes. Esta empresa cuenta con mas de 100 sucursales. En estos momentos estamos instalando Internet de cortesía a todas las sucursales. El todas las sucursales tenemos router cisco de la serie 800. El problema que tenemos es que no contamos con filtro de contenido. Para esto se me ocurrió la idea de instalar Squid con algún complemento, el tema es que no quiero instalar uno por cada sucursal, te imaginas que el costo de equipos sería muy alto y a su vez la administración se también se incrementara notoriamente.
    Mi idea es hacer una VPN con casa central montar un único squid en casa central. Pero lo que no se si se puede hacer es que salgan a Internet a través del enlace local y que las consultas para permitir o no el trafico sea al único squid de casa central.
    Que pensas? Si se te ocurre avísame a que mail te puedo escribir.
    Mil gracias
    Saludos
    Gabriel

    ResponderEliminar
    Respuestas
    1. Hola Gabriel. Gracias por tu comentario.

      Está genial tu idea.

      Entiendo que al configurar la VPN debes indicarle a la misma que envíe como Gateway a los clientes la IP del host o servidor donde está Squid en modo transparente.

      Saludos cordiales.

      Eliminar
    2. necesito que me ayudes a denagar descarga desde las paginas https, saludos desde cuba

      Eliminar
  11. Nuevamente configure siguiendo este articulo mi Centos 7 y si funciono, puedo ver los https en el log de squid y los certificados en /var/lib/ssl db. El problema es que en los clientes los navegadores encuentran problema con el Certificado. Me parece bien la idea de sustituirlo por uno comprado de una institución como Verisign ahora Symantec pero estoy confundido no se cual escoger de los que venden. Cómo lo han solucionado para que las páginas abran bien? Agradezco la ayuda.

    ResponderEliminar
  12. Hola
    Seguí tu configuración y me sale un error al querer reiniciar squid (No valid signing SSL certificate configured for https_port :3129)
    Podrías ayudarme?
    Necesito un algun tipo de certificado en específico?

    ResponderEliminar
  13. Hola mi consulta es la siguiente, yo quiero realizar el filtro pero de forma selectiva, digamos que a algunos miembros de la red pueden ingresar y otros no

    ResponderEliminar
  14. Amigo sabes como puedo hacer esto con Zentyal?

    Te agradeciese mucho ya que no puedo bloquear por modo transparente los sitios HTTPS

    ResponderEliminar
  15. Tengo una consulta, como podría hacer con esto con un certificado firmado digitamente con empresa autorizada y cuales son las empresas autorizadas para dicho trabajo para no tener problemas.

    ResponderEliminar
  16. Hola, he comprobado que el squid no fue instalado con enable ssl, ¿que debo hacer? ¿debo reinstalar?

    ResponderEliminar