Stunnel y cómo cifrar los mensajes de log de GNU/Linux

Publicado por Diego Córdoba en

Hoy vamos a hablar sobre una interesante manera de cifrar los mensajes de log que viajan en la red hacia un servidor de log remoto mediante stunnel… por supuesto, apto para SysVInit.


Cuando un mensaje de log es generado, el equipo local lo «captura» mediante el daemon de syslog. En el caso particular de Debian, por defecto se trata del rsyslog.

La configuración de rsyslog permite, entre otras cosas, establecer como acción determinada para un mensaje de log el envío a un daemon de log atendiendo en un puerto tcp o udp en un equipo remoto, y el equipo lo recibirá y tratará como un mensaje de log más.stunnel syslog

Ahora bien, en el común de los casos, no habrá ningún problema con el envío, pero en ciertas ocasiones será necesario cifrar su contenido durante la transferencia, puesto que viaja, por defecto, en texto plano.

Cuándo cifrarlo? generalmente cuando estamos trabajando con servidores de logs remotos en una red hostil, una DMZ, o incluso, en Internet, un vps, o instancia en la cloud.

Configuración general

Supongamos que tenemos un rsyslog cliente y uno servidor. Supongamos que armamos un túnel para que el rsyslog cliente envíe sus mensajes al _stunnel_ en el tcp61514, y el _stunnel_ reenvíe sus mensajes al puerto tcp60514 del equipo remoto.
Por otro lado, el servidor escuchará los mensajes del rsyslog cliente remoto en el puerto tcp60514, y todas las conexiones serán reenviadas al puerto local tcp61514 en el que estará atendiendo el rsyslog servidor.

Instalación de Stunnel en Debian

En ambos equipos deberemos tener instalados el rsyslog y el stunnel4 para poder trabajar:

aptitude install rsyslog stunnel4

Configuración del servidor

Primero debemos crear un certificado digital x509 en el servidor para poder realizar la conexión SSL, y proveer las claves de cifrado asimétrico.
Stunnel_ ya provee sus certificados por default, y pueden encontrarse en /etc/stunnel/stunnel.pem, pero es aconsejable generar nuestros propios certificados y claves por una cuestión de seguridad.Para ello:

cd /etc/stunnel/
openssl req -new -x509 -days 3650 -nodes -out stunnel.pem -keyout stunnel.pem

Responderemos las preguntas que nos haga (pais, nombre, mail, etc) y tendremos el certificado creado y listo para utilizarse, junto con su clave privada asociada.

Lo siguiente que tenemos que hacer es configurar el stunnel. Para ello, creamos el archivo /etc/stunnel/syslog-server.conf con el siguiente contenido:

cert = /etc/stunnel/stunnel.pem
debug = 7
foreground=yes

[ssyslog]
accept  = 60514
connect = 61514

En el especificamos el archivo de certificado generado previamente, algunas opciones de ejecución y debugging, y los puertos tcp, 60514 para aceptar conexiones remotas, y 61514 donde estará atendiendo el servidor de log.

Y por último configuramos el rsyslog para atender conexiones en el puerto tcp 61514. Para ello editamos el archivo /etc/rsyslog.conf y descomentamos y modificamos las siguientes líneas:

$ModLoad imtcp
$InputTCPServerRun 61514

Luego reiniciamos el rsyslog y corremos el stunnel en el servidor:

# service rsyslog restart
# nohup stunnel4 etc/stunnel/syslog-server.conf

Configuración del cliente

La configuración del cliente es más sencilla. Debemos editar el archivo /etc/stunnel/syslog-client.conf para que tenga el siguiente contenido:

debug = 7
foreground=yes
client=yes
[ssyslog]
accept  = 127.0.0.1:61514
connect = aa.bb.cc.dd:60514

En este caso, aa.bb.cc.dd es la dirección ip en la que estará atendiendo el servidor rsyslog remoto.

Corremos entonces en el cliente el _stunnel_:

# nohup stunnel4 etc/stunnel/syslog-client.conf

En este caso usamos nohup para que el proceso generado no dependa de la terminal de nuestro usuario… nadie quiere que «muera» el túnel al cerrar la terminal, verdad? 😛

Por último, en el cliente configuramos el rsyslog para enviar todos los mensajes al servidor utilizando el _stunnel_ mediante la ip local y el puerto local:

*.*        @@127.0.0.1:61514

De esta forma los mensajes de log locales serán reenviados al puerto local del stunnel, y el stunnel enviará la info al extremo remoto, en formato cifrado. Así, el stunnel remoto descifrará los datos y se los hará llegar al rsyslog remoto.

En este caso estaremos reenviando todos los mensajes de cualquier recurso y con cualquier severidad. De mas está decir que podemos limitar y enviar vía stunnel solo los mensajes que deseemos.

Conclusiones

Podemos probar nuestro _stunnel+rsyslog ejecutando un simple:

logger test

O, en el caso de que hayamos reenviado solo algunos tipos de mensajes por medio del _stunnel, podremos testearlo de esta forma:

logger -p recurso.severidad "mensaje"

Por otra parte, podemos utilizar tcpdump para capturar el tráfico intercambiado por el _stunnel, para verificar que efectivamente va cifrado y para el ojo humano resulta ilegible.

Les recomiendo estos artículos para aprender a usar tcpdump:

Cable aclarar también que rsyslog server estará atendiendo en el puerto especificado, pero en cualquiera de las direcciones ip que tenga configuradas, y cualquier cliente remoto podrá contactarlo. Debido a que todavía rsyslog no permite configurar una dirección IP en la que atender el servicio, no es mala idea protegerlo mediante iptables para que solo las ip’s habilitadas puedan contactarlo.

Espero les sea de utilidad!

En futuros artículos hablaremos sobre stunnel específicamente, y de cómo implementar logs remotos seguros en sistemas systemd.

Fuente: http://www.rsyslog.com/doc/rsyslog_stunnel.html


Ampliaremos este contenido en nuestro canal de youtube!

No dejen de suscribirse para estar al tanto! Los esperamos!!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador