Cuando se procede con la implementación de controles de PCI DSS en un entorno informático suele ser muy común encontrar servicios de red que, por alguna razon (obsolescencia, limitaciones técnicas del fabricante, limitaciones de hardware, problemas de compatibilidad, etc.), no ofrecen los niveles de seguridad exigidos por el estándar pero que son necesarios en términos operativos. En este tipo de situaciones se requiere buscar alternativas de implementación que permitan la gestión segura de dichos servicios sin afectar la operación (controles compensatorios).
Todos los artículos de la serie "Casos de estudio de PCI DSS":
En este nuevo caso de estudio se analizará el proceso de aseguramiento de protocolos y servicios inseguros (SMTP, POP3, IMAP, HTTP, MYSQL, VNC, CIFS, etc.) empleando tunelización y redirección de tráfico vía TLS, lo cual permitirá el cumplimiento de siguientes requerimientos de PCI DSS:
- 1.1.6 Documentación y justificación de negocio para el uso de todos los servicios, protocolos y puertos permitidos, incluida la documentación de las funciones de seguridad implementadas en aquellos protocolos que se consideran inseguros.
- 2.2.3 Implementar funciones de seguridad adicionales para los servicios, protocolos o daemons requeridos que no se consideren seguros.
- 2.3 Cifre todo el acceso administrativo que no sea de consola utilizando un cifrado sólido.
- 4.1 Utilizar criptografía sólida y protocolos de seguridad para proteger los datos del titular de la tarjeta confidenciales durante la transmisión por redes públicas abiertas.
Tunelización y redirección de tráfico empleando stunnel
El concepto de tunelización (o encapsulación) permite la inserción de un paquete de datos de un protocolo específico dentro de la carga útil («payload») de otro. Esta técnica es ampliamente utilizada para la creación de túneles de VPN (IPSEC, PPTP, L2TP), enrutamiento (GRE, PPP, P2P) e incluso para evitar controles de filtrado de paquetes en firewalls.
En este caso, se empleará como ejemplo la herramienta stunnel, que permite la encapsulación de protocolos arbitrarios dentro del protocolo TLS.
NOTA: En este ejemplo se usará stunnel debido a su facilidad de configuración e integración, pero también se pueden emplear otras herramientas alternativas que ofrecen la misma funcionalidad, como tlstunnel, hitch TLS proxy, HAProxy o incluso SSH.
Supongamos que tenemos un servicio HTTP que permite una conexión administrativa a un servicio dentro del entorno PCI DSS. No obstante, el proveedor de este software no ofrece una versión segura para la conexión (como HTTPS) por lo que se estaría incumpliento el requerimiento 2.3 de PCI DSS. Esto es muy común en consolas OOB o en servicios de administración simple.
En este caso, se empleará stunnel para crear un túnel que encapsule el trafico HTTP nativo de la aplicación insegura dentro del protocolo TLS, garantizando que todo el tráfico estará encriptado punto a punto entre el cliente y el servidor. Todas las conexiones remotas serán gestionadas por stunnel a través del puerto 443, que redireccionará el tráfico a la aplicación local al puerto 80. La aplicación insegura seguirá activa sin ninguna modificación operativa, pero solamente recibirá conexiones desde localhost provenientes del daemon de stunnel.
En primer lugar, se requiere la generación de un certificado digital que será usado en la conexión. En este ejemplo se usará un certificado autofirmado, pero también se puede optar por emplear certificados generados por una CA confiable (como es el caso de Let’s Encrypt) si el servicio estará expuesto a redes públicas abiertas para cumplir con el requerimiento 4.1.
1 |
$ openssl req -x509 -nodes -newkey rsa:2048 -keyout pr_cert.pem -out pub_cert.pem -days 365 |
Posteriormente, se procede con la instalación de stunnel (disponible para Android, GNU/Linux y Windows, incluyendo una GUI). En este caso particular se empleará una instalación en GNU/Linux (Debian):
1 |
$ sudo apt-get install stunnel |
Luego, editar el fichero /etc/default/stunnel y cambiar la variable “ENABLED” a 1.
Para poder gestionar el servicio empleando systemctl, es necesario crear un archivo de parámetros llamado “stunnel.service” en /lib/systemd/system:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
root@localhost /lib/systemd/system # cd /lib/systemd/system root@localhost /lib/systemd/system # pico stunnel.service [Unit] Description=SSL tunnel for network daemons After=network.target After=syslog.target [Install] WantedBy=multi-user.target Alias=stunnel.target [Service] Type=forking ExecStart=/usr/bin/stunnel /etc/stunnel/stunnel.conf ExecStop=/usr/bin/killall -9 stunnel # Give up if ping don't get an answer TimeoutSec=600 Restart=always PrivateTmp=false |
Y luego lo habilitamos para funcionar vía systemctl:
1 2 3 |
root@localhost /lib/systemd/system # systemctl enable stunnel.service Created symlink /etc/systemd/system/stunnel.target → /lib/systemd/system/stunnel.service. Created symlink /etc/systemd/system/multi-user.target.wants/stunnel.service → /lib/systemd/system/stunnel.service. |
Luego, editamos el archivo /etc/stunnel/stunnel.conf con los siguientes parámetros:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
root@localhost /etc/stunnel # more stunnel.conf setuid = stunnel setgid = stunnel debug = 7 output = /var/log/stunnel.log pid = /var/run/stunnel/stunnel.pid socket = l:TCP_NODELAY=1 sslVersion = TLSv1.2 options = NO_SSLv2 options = NO_SSLv3 options = CIPHER_SERVER_PREFERENCE cert = /etc/certificates/pub_cert.pem ciphers = ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:DHE-RSA-AES256-SHA256 [https-server] accept = 0.0.0.0:443 connect = 127.0.0.1:80 TIMEOUTclose = 0 |
Con esto, se ha implementado un túnel TLS 1.2 que soporta un conjunto de cifrado con algoritmos robustos, escuchando en el puerto 443 y redireccionando el tráfico al puerto 80 de localhost en donde se encuentra instalada la aplicación insegura.
Finalmente, bloqueamos a nivel de red el tráfico entrante al puerto 80 (HTTP) para evitar conexiones inseguras:
1 2 |
#/sbin/iptables -A INPUT -p tcp -s localhost --dport 80 -j ACCEPT #/sbin/iptables -A INPUT -p tcp --dport 25 -j DROP |
Varios temas adicionales:
- stunnel soporta TLS v1.3 (sslVersion = TLSv1.3). Si se activa esta opción, se requiere definir el conjunto de cifrado con el parámetro «ciphersuites = CIPHERSUITES_LIST».
- Si se descarga el código fuente de stunnel y se compila, es muy importante que se tenga la última versión de OpenSSL. En este caso, cualquier versión de SSL estará desactivada por defecto.
- La página del manual de stunnel enumera todos los parámetros que son configurables. El ejemplo anterior es bastante sencillo, pero stunnel se puede configurar para soportar autenticación, balanceo de carga, proxy transparente, envío de sus logs a un syslog remoto, etc.
- La misma técnica se puede emplear para encriptar tráfico de transacciones de MySQL, VNC, etc.