Guía MUY rápida: POP3 seguro en OpenBSD

Desde la versión 3.0 de OpenBSD, un sistema operativo Libre basado en el sistema tipo UNIX 4.4BSD, popa3d viene de casa con él, un excelente servidor para el protocolo POP3 desarrollado por Solar Designer.

Este servidor está diseñado con sumo cuidado y es suficientemente seguro como para que el staff de OpenBSD haya decidido incluirlo en el sistema base.

Pero esa seguridad se no se refiere a las transmisiones. popa3d(8) únicamente maneja la autentificación con contraseñas en texto plano. Esto es obviamente un problema si queremos salvaguardar las cuentas de los usuarios de nuestro sistema. Si un atacante "escucha" el canal por el que se transmite esa contraseña, esa cuenta quedará comprometida.

Por lo tanto se recomienda el uso de este servidor en entornos seguros o, mediante el empleo de herramientas externas, asegurando la transmisión.

El método más eficiente y seguro es el empleo de túneles SSH, aunque no es nada cómodo para los clientes.

En este documento vamos a implementar una solución distinta: el empleo de stunnel para añadir SSL(8) a nuestro demonio de popa3d para pasar a implementar POP3s (o secure POP3). stunnel es un wrapper que se encarga de encapsular el servicio, de forma que stunnel gestiona la parte referente al cifrado y popa3d la relacionada con POP3.

Además esto tiene ventajas sobre otros sistemas de autentificación seguros como APOP, CRAM-MD5 y similaes: todo el tráfico está cifrado, no solo la autentifiación.

La mayoría de los clientes de correo modernos incluyen soporte nativo para POP3s, con lo que no será necesario crear un túnel seguro manualmente cada vez que deseemos recoger el correo como ocurre con SSH.

Instalando stunnel

Si estamos al día con los ports de OpenBSD, será tan sencillo como hacer:

# cd /usr/ports/security/stunnel && make install clean

Pero es muy importante que usemos un port reciente, porque pueden haber errores en la versión de stunnel de la que diponemos y puede ser mala idea "asegurar" nuestro demonio con una herramienta insegura ;)

Si vemos en la página de stunnel que la última versión corrige algún fallo y nuestro árbol de ports tiene una versión anterior, podemos bajar el fuente de la página de stunnel e instalarlo desde ahí.

Podemos echar un ojo al port para ver qué problemas nos encontraremos compilando el fuente, y evitar así una pequeña sesión de hacking gracias a que el encargado de ese port ya lo ha hecho por nosotros.

Mirando en port los ficheros que hay que parchear, en tools/Makefile.in hay que hacer una pequeña correción, ya que openssl se encuentra en /usr/sbin/ y stunnel lo buscará en /usr/bin/. Sin esta modificación, en acabar la compilación obtendremos un error al intentar generarse automáticamente el certificado necesario para trabajar con stunnel.

Con un vistazo rápido al Makefile del port vemos que hay que llamar a configure con la siguiente linea:

$ ./configure --with-tcp-wrappers \
              --with-pem-dir=/etc/ssl \
              --with-random=/dev/arandom \
              --with-ssl=/usr \
              --localstatedir=/var

Y compilamos e instalamos empleando make(1):

$ make
$ su
# make install

Al final de la compilación, un script nos hará unas preguntas para generar nuestro certificado. Generará un certificado válido por un año.

Las librerias van a parar a /usr/local/lib, en /usr/local/sbin/ tendremos el binario de stunnel. La documentación en /usr/local/share/doc/stunnel/ y la configuración (con el certificado generado) en /usr/local/etc/stunnel.

Con esto tenemos una instalación de stunnel lista para comenzar a trabajar con la herramienta.

Configurando stunnel

Vamos a utilizar stunnel desde inetd, que es una configuración muy sencilla indicada para servidores con tráfico no muy abundante. Para otras configuraciones, por ejemplo corriendo stunnel como demonio, recomiendo consultar la página de manual de stunnel(8), que está muy completa.

Creamos el fichero /usr/local/etc/stunnel/stunnel.conf con el siguiente contenido:

exec = /usr/sbin/popa3d
execargs = popa3d

En nuestro /etc/inetd.conf, substituimos la linea de popa3d por la siguiente:

# antes: pop3   stream  tcp     nowait  root    /usr/sbin/popa3d        popa3d
pop3s   stream  tcp     nowait  root    /usr/local/sbin/stunnel

Y hacemos que nuestro inetd recoja la nueva configuración con:

# kill -HUP `cat /var/run/inetd.pid`

Comprobamos que nuestro POP3 seguro está ahí con:

# netstat -af inet | grep pop3s
tcp        0      0  *.pop3s                *.*                    LISTEN

Probando la configuración

Ahora hay que hacer que nuestro cliente de correo emplee la nueva configuración.

Si usamos KMail, por ejemplo, al pedirle al cliente de correo que compruebe qué soporta el servidor POP3, nos dirá que se puede recoger el correo cifrando con SSL.

Pero no solo nos dirá esto. Además se quejará de que el certificado está firmado por el propio emisor y que, por lo tanto, no es seguro. Es cierto :)

No obstante podemos hacer pública a nuestros usuarios la huella MD5 o incluso instalar el certificado en los clientes para que explícitamente se confie en él. En cualquier caso el cliente de correo nos permitirá "fiarnos" de este certificado si así lo deseamos.

Una vez se confíe en un certificado el cliente nos alertará convenientemente en caso de que cambie, avisándonos así de un posible intento de engaño.

Ahora solo nos queda verificar que realmente se cifra la transmisión, empleando por ejemplo tcpdump*:

# tcpdump -i $IF -w /dev/stdout port pop3s

* realmente hay que ser lince para ver algo capturando paquetes así hasta con POP3 sin cifrar, pero comparando se puede apreciar como la salida de capturar POP3s está cifrada.


Copyright © 2004 Juan J. Martinez <reidrac *at* usebox.net>
Se permite la copia textual y distribución de este documento en su totalidad,
por cualquier medio, siempre y cuando se mantenga esta nota de copyright.

Actualizado en: 27 Marzo 2004