Skip to content

Instantly share code, notes, and snippets.

@oneohthree
Last active June 6, 2022 20:16
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oneohthree/f173c9aae9b6170db7af4ef8b006bb5b to your computer and use it in GitHub Desktop.
Save oneohthree/f173c9aae9b6170db7af4ef8b006bb5b to your computer and use it in GitHub Desktop.

Protección de las credenciales enviadas por el navegador al servidor proxy

Problema

Es sabido que durante el proceso de autenticación en un servidor proxy HTTP las credenciales se envian en texto plano. Lo anterior pudiera convertirse en un problema de seguridad. Esta vulnerabilidad permite a un usuario malicioso capturar fácilmente el par usuario contraseña utilizando un ataque de tipo MitM.

Solución

Una solución viable consiste en configurar el servidor proxy con soporte para SSL, de modo que el tráfico enviado desde el navegador hacia este viaje por un canal seguro. Para esto, el navegador debe ser capaz de comunicarse con el servidor proxy a través del protocolo HTTP sobre SSL/TLS.

En este tipo de comunicación el navegador debe 'confiar' en el certificado enviado por el servidor proxy el cual debe estar firmado por una Autoridad Certificadora (CA) reconocida y autorizada.

Una solución muy conveniente sería utilizar Let's Encrypt. Let’s Encrypt es una autoridad certificadora completamente gratuita, automatizada y abierta, mediante la cual se pueden obtener certificados SSL.

Una vez configurado correctamente el servidor proxy con soporte para SSL, es necesario preparar el navegador para que se pueda comunicar de forma segura con este. Actualmente, ningún navegador permite la configuración manual del proxy a través de HTTPS. Afortunadamente, la mayoría de los navegadores más populares son capaces de recibir la configuración a través del protocolo WPAD.

Requerimientos

  • Debian 11 (Bullseye) 64 bits
  • Certificados SSL (a través de Let's Encrypt)
  • Squid (con soporte para SSL)
  • Servidor Web (para el archivo proxy PAC)
  • Firefox

Instalación de paquetes necesarios

apt install squid-openssl squidclient

Configuración de squid

Añadir la siguiente línea al archivo /etc/squid/squid.conf justo al inicio.

https_port 3129 tls-cert=/ruta/al/certificado/fullchain.pem tls-key=/ruta/a/la/llave/privkey.pem options=TLS1_3

En el parámetro tls-cert se especifica la ruta del certificado público y en tls-key la de la llave privada. En options se especifica qué versiones de SSL/TLS se soportarán, en este caso solamente TLSv1.3 desechando versiones de SSL vulnerables.

Para que toda la comunicación entre los navegadores y el servidor proxy sea exclusivamente sobre SSL por el puerto 3129, es necesario configurar el parámetro http_port de modo que solamente el localhost pueda comunicarse con este puerto.

http_port 127.0.0.1:3128

No sería recomendable deshabilitar completamente el puerto porque certbot o acme.sh no podrían comunicarse a través de un proxy SSL/TLS.

Configuración del servicio WPAD

WPAD (Web Proxy AutoDiscovery Protocol) consiste en servir un fichero a través del protocolo HTTP que contiene los parámetros de configuración del proxy. Dadas las diferentes formas en las que los navegadores intentan obtenerlo, la misma configuración debe existir en 3 archivos diferentes: wpad.pad, wpad.pa y proxy.pac

Para esto debe prepararse un servidor web que sirva los tres archivos y puedan obtenerse a través de una dirección con esta forma: http://wpad.dominio.tld/wpad.pad. Pudiera utilizarse cualquier servidor web existente para estos propósitos.

Generalmente se crea el archivo wpad.pad y posteriormente se generan enlaces simbólicos de este para evitar mantener 3 archivos distintos con el mismo contenido.

Es necesario crear un nuevo registro en el servidor DNS que apunte a wpad.dominio.tld

El contenido de estos archivos puede quedar como sigue.

function FindProxyForURL(url, host)
{
  if (isPlainHostName(host)) return "DIRECT";

  if (isInNet(host, "127.0.0.0", "255.0.0.0") ||
      isInNet(host, "10.0.0.0", "255.0.0.0") ||
      isInNet(host, "172.16.0.0", "255.240.0.0") ||
      isInNet(host, "192.168.0.0", "255.255.0.0"))
  return "DIRECT";

  if (dnsDomainIs(host, ".foo.tld") ||
      dnsDomainIs(host, ".bar.tld") ||
      dnsDomainIs(host, ".baz.tld"))
  return "DIRECT";

  return "HTTPS proxy.dominio.tld:3129";
}

Configuración de Firefox

Configurar Firefox (versiones +56) para que autodetecte la configuración del proxy a través de WPAD.

  • Clic en Opciones (o en el ícono de tres barras)
  • Clic en General
  • Desplazarse hasta el apartado Proxy de red
  • Clic en Configuración
  • En URL de configuración automática de proxy especificar http://wpad.dominio.tld/wpad.dat
  • Clic en Aceptar

Limitaciones

Herramientas como wget, curl, npm, pip, entre otras, no son compatibles con proxies HTTPS.

Referencias

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment