Proteger servidores Debian/Ubuntu contra Logjam
Este tutorial describe los pasos necesarios para proteger un servidor Linux Ubuntu o Debian frente a la vulnerabilidad Logjam. Logjam ataca el intercambio de claves Diffie‑Hellman, usado en protocolos de cifrado como HTTPS, TLS, SMTPS, SSH y otros. Una descripción detallada está disponible en https://weakdh.org/.
Este tutorial es compatible con instalaciones de ISPConfig 3 en Debian y Ubuntu. Los comandos deben ejecutarse como usuario root en la shell.
Resumen de la metodología
- Generar un grupo DH único con OpenSSL (dhparams.pem).
- Ajustar las suites de cifrado seguras en los servicios (Apache, Nginx, Postfix, Dovecot, Pure‑FTPd).
- Si el software lo soporta, configurar el uso del archivo DH en el servidor web (Apache/Nginx).
- Reiniciar servicios y verificar.
Importante: Incluso si no puedes aplicar el grupo DH en Apache por versión, actualizar las suites de cifrado ya reduce la exposición frente a ciphers débiles.
Generar un grupo DH único
El primer paso es generar un DH Group único con OpenSSL. El ejemplo crea el archivo en /etc/ssl/private/. Si no existe, créalo con:
mkdir -p /etc/ssl/private
chmod 710 /etc/ssl/private
Ahora crea dhparams.pem y establece permisos seguros:
cd /etc/ssl/private
openssl dhparam -out dhparams.pem 2048
chmod 600 dhparams.pem
Nota: 2048 bits es la recomendación mínima práctica hoy; 3072 bits ofrece mayor seguridad a costa de más CPU.
Apache
Añade una suite de cifrado segura según las recomendaciones de weakdh.org. Edita:
nano /etc/apache2/mods-available/ssl.conf
Cambia o añade estas líneas (SSLCipherSuite es una sola línea larga; no introducir saltos de línea):
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder on
La segunda parte es indicar el grupo DH en Apache. La directiva SSLOpenSSLConfCmd está disponible en Apache 2.4.8 o superior y requiere OpenSSL 1.0.2 o superior. Comprueba versiones:
apache2 -v
Ejemplo de salida en Debian 7:
root@server1:/etc/apache2# apache2 -v
Server version: Apache/2.2.22 (Debian)
Server built: Dec 23 2014 22:48:29
Comprueba OpenSSL:
openssl version
Ejemplo de salida:
root@server1:/# openssl version
OpenSSL 1.0.1e 11 Feb 2013
Si tu Apache o OpenSSL no cumplen los requisitos, no podrás configurar SSLOpenSSLConfCmd. Aun así, la primera parte (bloquear ciphers débiles) ya mejora la seguridad. Si dispones de Apache >= 2.4.8 y OpenSSL >= 1.0.2, añade esto en /etc/apache2/mods-available/ssl.conf:
SSLOpenSSLConfCmd DHParameters "/etc/ssl/private/dhparams.pem"
Y reinicia Apache:
service apache2 restart
Nota: Compilar OpenSSL desde fuente es una opción avanzada; sigue guías oficiales y haz pruebas en un entorno no productivo.
Nginx
Edita el archivo de configuración de Nginx:
nano /etc/nginx/nginx.conf
Dentro del bloque http { … } añade o sustituye:
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/private/dhparams.pem;
Reinicia Nginx:
service nginx restart
Postfix
Ejecuta estos comandos para establecer la suite de cifrado y el archivo DH:
postconf -e "smtpd_tls_mandatory_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA"
postconf -e "smtpd_tls_dh1024_param_file = /etc/ssl/private/dhparams.pem"
Y reinicia postfix:
service postfix restart
Nota: Revisa los parámetros existentes antes de sobrescribirlos en entornos personalizados.
Dovecot
Edita /etc/dovecot/dovecot.conf:
nano /etc/dovecot/dovecot.conf
Añade junto a ssl_protocols la siguiente línea:
ssl_cipher_list=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
Comprueba la versión de dovecot:
dovecot --version
- Si la versión es >= 2.2.6, añade:
ssl_prefer_server_ciphers = yes
- Si la versión es >= 2.2.7, además añade:
ssl_dh_parameters_length = 2048
Reinicia dovecot:
service dovecot restart
Pure‑FTPd
En Debian/Ubuntu, el script /usr/sbin/pure-ftpd-wrapper no soporta la opción -J por defecto. Añade soporte editando el wrapper:
nano /usr/sbin/pure-ftpd-wrapper
Busca la línea:
'TLS' => ['-Y %d', \&parse_number_1],
Y añade justo después:
'TLSCipherSuite' => ['-J %s', \&parse_string],
Crea (o edita) /etc/pure-ftpd/conf/TLSCipherSuite:
nano /etc/pure-ftpd/conf/TLSCipherSuite
Introduce la siguiente lista de cifrados (reemplaza si el archivo ya existía):
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
Reinicia pure‑ftpd:
service pure-ftpd-mysql restart
Verificación y pruebas
- Comprueba los puertos TLS/SSL con herramientas externas (por ejemplo, SSL Labs) para validar la cadena de cifrados y la configuración DH.
- En servidores de prueba, habilita logs detallados y compara latencias y carga CPU antes y después de cambiar DH a 2048/3072 bits.
Ficha técnica
- Recomendación DH mínima: 2048 bits (3072 bits para mayor seguridad).
- OpenSSL requerido para SSLOpenSSLConfCmd en Apache: >= 1.0.2.
- Apache requerido para SSLOpenSSLConfCmd: >= 2.4.8.
- Paso esencial: bloquear ciphers débiles (SSLv2/SSLv3, RC4, EXPORT, etc.).
Listas de verificación por rol
Administrador de sistema — antes de aplicar en producción:
- Hacer copia de seguridad de archivos de configuración.
- Generar dhparams en un servidor de pruebas y validar.
- Actualizar paquetes y comprobar compatibilidad de OpenSSL/Apache.
- Aplicar cambios y reiniciar servicios uno a uno.
- Ejecutar escaneos externos y monitorizar logs.
Ingeniero de infraestructura — despliegue por fases:
- Implementar en entorno staging.
- Ejecutar pruebas de carga y latencia.
- Plan de rollback (restaurar configs y reiniciar).
- Programar mantenimiento para producción.
Compatibilidad y migración
- Si tu distribución proporciona versiones antiguas de OpenSSL/Apache, considera backports oficiales o actualizar la distribución. Compilar OpenSSL a mano es posible pero requiere pruebas exhaustivas.
- Para servicios gestionados o en contenedores, aplica la configuración en la imagen base y prueba antes del despliegue.
Glosario rápido
- Logjam: ataque que debilita el intercambio Diffie‑Hellman permitiendo downgrade a parámetros débiles.
- Diffie‑Hellman (DH): método para que dos partes acuerden una clave secreta sobre un canal inseguro.
Riesgos y mitigaciones
Riesgo: incompatibilidad con clientes antiguos tras eliminar ciphers débiles. Mitigación: revisar logs de conexión y, si es necesario, ofrecer endpoints separados para clientes legados mientras se planifica migración.
Riesgo: mayor uso CPU al usar DH 2048/3072. Mitigación: evaluar rendimiento y usar aceleración (hardware o TLS offload) si es necesario.
Resumen final
Generar un dhparams único y actualizar las suites de cifrado es una medida práctica y eficaz para reducir el riesgo por Logjam. Sigue el orden: generar DH, actualizar servicios, comprobar versiones para aprovechar configuraciones avanzadas (por ejemplo SSLOpenSSLConfCmd) y validar con herramientas externas.
Enlaces
Materiales similares

Usar Android como módem sin root

Instalar Linux en Chromebook: guía completa
smartmontools: monitoriza discos con SMART
Proteger servidores Debian/Ubuntu contra Logjam

Dark Sky: pronóstico hiperlocal y alternativas
