miércoles, 30 de agosto de 2017

Configurando Squid como proxy transparente HTTPS: Configuración de SslBump en Squid

En este punto, la terminología empieza a ser un poco confusa. Como ya lo he dicho, muchas otras guías consiguen lo mismo en Debian Jessie usando Squid 3.4 (1, 2); CentOS 7 (1 la cual a su modo es muy completa) y CentOS 6 (1) entre otros.

Fue esta guía (Squid (v3.5+) proxy with SSL Bump la que señala la forma correcta de configurar ssl_bump en squid v3.5+; básandome en ella, hago una mejora mínima con la cuestión del certificado.
Crear un certificado puede ser algo tan sencillo como se recoge en Intercept HTTPS CONNECT messages with SSL-Bump, pero ese procedimiento tiene el inconveniente de enviar al cliente la clave pública y privada con la que funciona el servidor. La separamos creando primero la clave privada de la siguiente forma:
 $ openssl genrsa -out myCA.key 4096                                                                                                                                                                          [0/1508]
Generating RSA private key, 4096 bit long modulus
..........++
.....................................................................++
e is 65537 (0x010001)
Y luego la clave pública así:
$ openssl req -sha256 -new -x509 -days 1826 -key myCA.key -out myCA.crt
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) [AU]:SV
State or Province Name (full name) [Some-State]:San Salvador
Locality Name (eg, city) []:San Salvador
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Dirección Central
Organizational Unit Name (eg, section) []:Establecimiento
Common Name (e.g. server FQDN or YOUR name) []:Establecimiento dependiente
Email Address []:vtacius@gmail.com
Cambiamos un poco el esquema de seguridad para los ficheros de la siguiente forma. Incluso las podría haber mejores
$ usermod -G ssl-cert proxy
$ chmod 770 /etc/ssl/private/
$ chmod 640 myCA.*
$ chown root:proxy myCA.*
$ cp -a myCA.key /etc/ssl/private/
$ cp -a myCA.crt /etc/ssl/certs/
Ahora configuramos precisamente a squid. No se necesita más que asegur tener las siguientes líneas:
http_port 10.168.4.1:3128
http_port 10.168.4.1:3129 transparent
https_port 10.168.4.1:3130 ssl-bump intercept generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/ssl/certs/myCA.crt key=/etc/ssl/private/myCA.key

...
ssl_bump stare all
ssl_bump splice all
...
La configuración de ssl_bump aún sigue siendo un poco complicada, aún cuando existe bastante documentación al respecto, hasta ahora entiendo que va de esta forma:
  • ssl_bump stare all:  Básicamente, permite una primera conexión con el servidor remoto. Por este paso es que se requiere que los clientes que usen proxy transparente tenga bien configurado la resolución DNS. Y no, no encuentro una mejor forma de cambiar este paso, si no se especifica, pues que la conexión no realiza bien.
  • ssl_bumps splice all: En esta parte hacemos precisamente la conexión. Usar splice en lugar de bump permite al tráfico salir con menos trabajo por parte del servidor. En este punto, ni siquiera entiendo para iría a necesitar tanto trabajo por parte del proxy
En las guías anteriores, se recomiendan configuraciones como
ssl_bump server first all  
sslproxy_cert_error deny all  
sslproxy_flags DONT_VERIFY_PEER 
Pero ninguna de estas deberían ser necesarias para esta versión de squid. La otra opción que valdría la pena configurar es:
sslcrtd_program /usr/lib/squid/ssl_crtd -s /var/lib/squid_ssl/ -M 4MB
Ya que los valores por defecto no están del todo bien:
sslcrtd_program /usr/local/squid/libexec/ssl_crtd -s /var/lib/ssl_db -M 4MB
En ambos casos, es necesario inicializar el directorio mencionado:
/usr/lib/squid/ssl_crtd -c -s /var/lib/squid_ssl/
Initialization SSL db...
Done
TODO: Pueden hacerse bastante mejoras aún con el certificado

martes, 29 de agosto de 2017

Configurando Squid como proxy transparente HTTPS: Squid con soporte SSL

 Build errors with Squid 3.5.24 under Debian
La mejor forma de modificar los parámetros de compilación en Debian es mediante sus herramientas de compilación, casi, casi como si fuéramos a trabajar como empaquetadores.

Que bien podría bajarse el source desde la página oficial, pero había que configurar más cosas a manos y olvidarnos del soporte de Debian; podríamos bajar una versión o rama más novedosa (Para squid, v4 esta en Beta, aunque la gente de Fedora ya la considera lo suficientemente estable como para incluirla como versión por defecto)

Por tanto, los pasos a realizar serán básicamente los siguientes:
apt-get install dpkg-dev devscripts quilt libcrypto++-dev libssl1.0-dev

mkdir /root/paquetes
chown _apt -R paquetes/
cd paquetes/ 
apt-get source squid
apt-get build-dep squid

# Podríamos verificar el caso improbable que el proceso de compilación del paquete tenga problemas
cd squid3-3.5.23/ 
debuild -b -uc -us
Respecto al siguiente paso, hay varias versiones de lo que podríamos hacer. El parche podría trabajarse de la siguiente forma
quilt push -a
quilt new 0032-add_ssl_crtd.patch
quilt add debian/rules
## Hacemos la modificación en este punto
quilt refresh
quilt pop -a -f
Pero es un poco innecesario, creo que realizando la modificación directamente en el fichero correpondiente, debian/rules no debería haber mayores problemas: Modificamos DEB_CONFIGURE_EXTRA_FLAGS agregando estas opciones:
vim debian/rules
+       --with-openssl \
+       --enable-ssl-crtd \
Sea como sea, una vez modificadas las reglas de configuración previas, podemos contruir el paquete.
debuild -b -uc -us
Pues deberían haberse construido los paquetes y podemos probar a instalar en el mismo equipo
apt-get install squid-langpack libdbi-perl libcap2-bin libecap3
dpkg -i ../squid-common_3.5.23-5_all.deb ../squid_3.5.23-5_amd64.deb ../squid3_3.5.23-5_all.deb
Ahora, la mejor recomendación que puedo hacer es que se construyan los paquetes en un equipo diferente al firewall. Una máquina virtual incluso debería funcionar Una vez contruidos, los enviamos al firewall y lo instalamos de la siguiente forma:
apt-get install squid-langpack libdbi-perl libcap2-bin libecap3 libssl1.1
dpkg -i squid_3.5.23-5_amd64.deb squid-common_3.5.23-5_all.deb squidclient_3.5.23-5_amd64.deb squid3_3.5.23-5_all.deb
# A partir de este punto, todo paquete que dependa de squid se dará por satisfecho. Por ejemplo
apt-get install squidguard{,-doc} sarg
Escojo pinning como método para evitar que el paquete sea actualizado
cat <<MAFI >/etc/apt/preferences.d/squid
Package: squid 
Pin: release n=stretch
Pin-Priority: -1

Package: squid3
Pin: release n=stretch
Pin-Priority: -1

Package: squid-common
Pin: release n=stretch
Pin-Priority: -1

Package: squidclient
Pin: release n=stretch
Pin-Priority: -1
MAFI
Fuentes: 1, 2

lunes, 28 de agosto de 2017

Configurando Squid como proxy transparente HTTPS: Introducción

La comunidad ha esperado mucho para llegar a este punto. Los manuales sobre la configuración aún siguen siendo bastante confusos al respecto, pero al fin logré una configuración funcional a integrar en mi proyecto ya existente.

Descrito pronto, el proyecto usa a squid como proxy caché, y este, usa a squidGuard mediante  url_rewrite_program para filtrar la navegación de los usuarios mediante las listas negras de shallalist .

Esta configuración mejora el proyecto en dos cosas básicamente:
  • Los usuarios no necesitan configurar proxy para navegar por HTTPS (Aunque si necesitarían instalar un certificado)
  • Los usuarios podrán ver un mensaje de error cuando navegan a un sitio bloqueado que usa HTTPS, aunque parezca poca cosa, se considera en realidad un gran avance de cara a los usuarios
 En este momento, me preocupan dos cosas que también deberían preocuparle a todos los que quieran seguir esta guía:
  • El rendimiento por parte de squid para servir las páginas
  • ¿Tendrá algún sitio demasiados problemas para funcionar con esta configuración?
Al momento de escribir esta entrada, esta configuración no ha entrado en producción, so...

Tome en cuenta que como debo instalar en varios firewall, la idea será compilar en un equipo independiente de lo que sea el firewall. De hecho, aún cuando se compile para un sólo equipo, debería considerar trabajar de esta forma.

Voy a repetir lo que ya se ha dicho hasta el cansancio: Hay cuestiones éticas muy importantes en esta configuración. Básicamente, lo mejor es explicar al usuario lo que se esta haciendo.

jueves, 22 de junio de 2017

Apuntes sobre el error de Squid / SquidGuard en Debian: Solucionado

La nueva versión de Debian ha salido el sábado pasado. Y me aventuré a probar que se hubiera solucionado el problema con redirector protocol que detuvo tan mal a mi proyecto de firewall.

Pues resulta que no, el problema seguía siendo tal, pero esta vez tenía un poco más de tiempo disponible que la última vez (Y un problema más serio, al estar dos lanzamientos atrasados con el sistema base).

Lo quiero resumir de esta forma: El problema no era tal.
Básicamente porque es un problema que es posible resolver con un cambio en la configuración, no se debía (No del todo, al menos) a un falta de actualización en la forma en que squidGuard entendía el redirector protocol, como yo pensé en mi primer post

El truco está en la configuración del redirector en Squid. Por defecto, yo tenía
url_rewrite_children 15 startup=0 idle=1 concurrency=3
Pero según la documentación en Squid configuration directive url_rewrite_children:
concurrency=

 The number of requests each redirector helper can handle in
 parallel. Defaults to 0 which indicates the redirector
 is a old-style single threaded redirector.

 When this directive is set to a value >= 1 then the protocol
 used to communicate with the helper is modified to include
 an ID in front of the request/response. The ID from the request
 must be echoed back with the response to that request.
 
La cuestión es que al programa configurado como redirector le debe llegar una petición por parte de squid de la siguiente forma:
"http://www.google.com.sv/ 10.168.3.5/10.168.3.5 - GET myip=10.168.3.1 myport=3128";
Pero configurado concurrency, tal como lo ha dicho la documentación, se le antepone un identificador, de modo que la consulta queda de la siguiente forma.
"0 http://www.google.com.sv/ 10.168.3.5/10.168.3.5 - GET myip=10.168.3.1 myport=3128";
Lo que pasa es que lo interpreta mal: Para el, la URL que se solicita es 0 y el identificador del cliente es la URL; de hecho, toma a http: como la dirección IP del cliente, es decir, la primera parte de ip_cliente/fqdn...

La solución es algo tan sencillo como retirar concurrency:
url_rewrite_children 15 startup=0 idle=1 concurrency=0 

Si bien squidGuard debería ser capaz de manejar este problema, pues no, no voy a reclamarle tanto a la única opción viable frente a cosas como e2guardian.
Yo mismo he intentando parchear el paquete en Debian, intentando quitar el ID de la petición antes de que squidGuard lo siguiera parseando, pero tampoco, es que aunque ha funcionado parece que todo va mal, las respuestas hacia el cliente ralentizan la navegación. Que ni siquiera revisé los log de Squid con mayor detenimiento, es que tampoco tengo todo el tiempo del mundo.

miércoles, 31 de mayo de 2017

Integrando (Un poco) pyramid en Eclipse: Test Automatizados

Esto será breve. Es más bien una revisión, porque con la forma en que lo hemos configurado esto se ha hecho automáticamente, y bien.

Por otra parte, acá hay algo raro que será mejor verificar: Desde una consola de nuestro entorno virtual, hay que instalar nose, y en Fedora, al menos para mí, webtest, así, en minúsculas
virtualenv proyecto-ambiente
pip install nose
pip search webtest
Buscamos a proyecto en Project Explorer. Accedemos a propiedades con Alt + Enter o desde el menú desplegable al hacer click derecho.

Buscamos la pestaña Run/Debug Settings. Hay dos perfiles configurados. En general, el que nos importa es aquel que se llama <nombre del proyecto>_test. En nuestro caso que nuestro proyecto se llama proyecto:

Lo seleccionamos en la lista, y hacemos click en Edit y aparece un cuadro de diálogo con las configuración de dichos perfiles

En la pestaña Main, debe estar configurado de la siguiente manera. Si se configuro tal como en el post anterior, ya debería estar así

En Arguments, debe estar checado Override PyUnit preferences for this launch?, de esta forma podremos configurar Nose test runner al elegirlo desde la lista desplegable

En la pestaña Interpreter, pues si, debería configurarse python_proyecto, el intepréte personalizado que configuramos en el post anterior pero parece haber un bug en esto, aunque se elija y configure tal, no se queda configurado
Por último, la verificación es de lo más sencilla. Corremos los test que vienen por defecto en la plantilla de proyecto starter de pyramid:
Vemos que, en hacia el fondo de la aplicación, hallamos la ventana Console con el resultado de la operación:

Dos cosas por si se me olvida registrarlas después:
  • Para hacer más test, lo mejor será borrar el fichero test.py y luego crear una carpeta test/. Asimismo, el nombre de cada fichero debe comenzar con test
  •  

martes, 30 de mayo de 2017

Integrando (Un poco) pyramid en Eclipse

Una vez hayamos creado un proyecto (Uno sencillo, como este), configuramos a Eclipse para trabajar de forma más o menos integrada con pyramid. No, no va estar del todo integrado, apenas lo suficiente para asegurarnos de que va a autocompletar con las librerías de pyramid y para realizar los test automatizados sin mayores inconvenientes. Es que, básicamente, esto va sobre configurar el entorno virtual que creamos para este proyecto.

Y antes de otra cosa, es necesario tener instalado PyDev para que esto funcione. Y como hay guías más especializadas allá fuera, no repetiré

Abrimos el menú para abrir proyectos en File > Open Project from File System. Aparece el siguiente cuadro de diálogo

Haciendo click en Directory, nos aparece un cuadro de dialogo del sistema para buscar el directorio donde se encuentra nuestro proyecto.
Yo escogí proyecto-ambiente/proyecto (Para coincidir con el punto donde configuro el repositorio git, gusto mío), pero habrá quién prefiera proyecto-ambiente/proyecto/proyecto, que es donde se encuentra precisamente nuestro código.

Luego, se verá de la siguiente manera una vez configurado. Haciendo click en Finish, habremos terminado de configurar nuestro proyecto.

A continuación, necesitamos que Eclipse reconozca que el proyecto es python para que active ciertas funciones.
En el Project Explorer, usualmente a la izquierda, hacemos click derecho en nuestro proyecto; en el menú desplegable que aparece nos dirigimos a PyDev > Set as PyDev Project.


También podría bastar con abrir una fichero python, pero no es que la primera sea la "forma más correcta", sino que habría que pelearse más con la configuración.

Ahora, en el anterior menú desplegable del proyecto buscamos Properties o hacemos Alt + Enter para acceder al siguiente cuadro de diálogo.



Nuestra primera pestaña a configurar será PyDev - Interpreter/Grammar

La idea es configurar en Interpreter al que se encuentra instalado en nuestro entorno virtual proyecto-ambiente, y para ellos habrá que configurarlo haciendo click en Click here to configure an interpreter not listed
Aparece la siguiente ventana
Haciendo click en New, nos aparece el siguiente Cuadro de diálogo.

En Interpreter Name, configuramos un nombre cualquiera vagamente descriptivo, tanto más si vamos a trabajar en varios proyectos a la vez. 

Para Interpreter Executable, hacemos click en Browse, y si, aparece un cuadro de diálogo de tipo fichero. Buscamos dentro de nuestro entorno virtual proyecto-ambiente el directorio de ejectubles bin/, y dentro de este, a python. El cuadro de diálogo queda de la siguiente forma:

Al hacer click en Ok, nos aparece un cuadro de diálogo Selection needed, donde se nos pide agregar las librerías que se corresponden con ese interprete

Ahora, se puede ver este nuevo intérprete configurado

En este punto, podemos configurarlo como intérprete de nuestro proyecto en la lista desplegable Interpreter.

Hacemos click en Apply para seguir configurando. O en Ok, que esto sigue en otro post.

Mi objetivo se cumple: El autocompletado se rebusca en las librerías del entorno virtual


lunes, 29 de mayo de 2017

Integrando (Un poco) pyramid en Eclipse: Creando el proyecto

Este artículo muestra la forma más sencilla de empezar un proyecto con Pyramid, ya que a diferencia de Primero pasos con Pyramid no se modifica nada en orden de iniciar un gran proyecto. Además, esta vez hice algunas capturas de pantalla y creo que esa es la principal justificación

Creamos un entorno virtual para el proyecto de nombre proyecto y entramos al directorio creado
virtualenv proyecto-ambiente
cd proyecto-ambiente
Activamos el entorno virtual. Esto lo hacemos siempre que vayamos a usarlo. Así es como usamos las librerías y ejecutables que instalemos en él y no los del sistema.
source bin/activate
En este momento, el entorno se ve más o menos de esta forma:
Instalamos pyramid
pip install pyramid
Creamos un proyecto de nombre proyecto con la plantilla starter
pcreate -s starter proyecto
El pcreate ha creado un directorio proyecto:
Instalamos los paquetes python que este proyecto en específico necesita. Se configuran en proyecto/setup.py, por ahora lo dejamos tal como se configuro por defecto
python proyecto/setup.py develop
Y nuestro proyecto se ve de esta forma
Y eso es todo.

lunes, 13 de marzo de 2017

Usando snapshot para equipos virtualizados con XEN en Debian

Pese al título, esta entrada aún necesita llevar un subtítulo: "Usando qcow en máquinas virtuales en Debian Jessie", y ya, no se necesitaría mayor introducción al respecto.

Cuando se sigue una guía de virtualización en Debian, se cae por defecto en la virtualización con XEN. No hay problema, pero parece que hasta Jessie, las herramientas para administración por defecto siguen sin manejar la cuestión de snapshot para las máquinas virtuales.

Tampoco fuí capaz de encontrar una opción en xen-create-image que permita crear las imágenes con formato qcow. Crear la imagen con qemu-img create y luego apuntarla en xen-create-image con --image-dev y --swap-dev  no funciona porque sin importar qué, xen-create-image convierte las imágenes a raw.

Con todo esto, es necesario complicar el proceso de instalación de la siguiente manera:
  • Creamos la máquina virtual con un disco raw, que es el formato por defecto:
xen-create-image  --hostname=pdc.salud.gob.sv --vcpus=2 --size=20Gb --memory=896Mb --ip=10.20.20.10 --gateway=10.20.20.1 --bridge=xenbr0 --arch=amd64 --role=udev --dir=/var/lib/xen/
La instalación del sistema base empezará creando dos imágenes: disk.img y swap.img , dentro de /var/lib/xen/domains/pdc.salud.gob.sv/ en este caso según el hostname dado.

  • Lo convertimos a qcow (Respecto a preallocation: Resulta que en Jessie no es posible usar full, además, no soy capaz de decir si para el caso de conversión esta opción tiene algún tipo de efecto)
qemu-img convert -O qcow2 -o preallocation=metadata /var/lib/xen/domains/pdc.salud.gob.sv/disk.img /var/lib/xen/domains/pdc.salud.gob.sv/disk.qcow2
  • Ahora, modificamos el fichero que define a la máquina virtual para que apunte al nuevo disco: Por xen-create-image, el fichero había quedado de esta forma:
#
#  Disk device(s).
#
root        = '/dev/xvda2 ro'
disk        = [
                  'file:/var/lib/xen/images/domains/pdc.salud.gob.sv/disk.img,xvda2,w',
                  'file:/var/lib/xen/images/domains/pdc.salud.gob.sv/swap.img,xvda1,w',
              ]
Y el gran cambio será file: por tap:qcow2: y la extensión: .img por .qcow2 en donde se apunte al disco que cambiamos
#
#  Disk device(s).
#
root        = '/dev/xvda2 ro'
disk        = [
                  'tap:qcow2:/var/lib/xen/images/domains/pdc.salud.gob.sv/disk.qcow2,xvda2,w',
                  'file:/var/lib/xen/images/domains/pdc.salud.gob.sv/swap.img,xvda1,w',
              ]
Fuentes:
Using qcow2 images in Xen 4.1 on Debian 

Otros apuntes interesantes

Otros apuntes interesantes