Este artículo proporciona una descripción general de Perfect Forward Secrecy (PFS) y cómo habilitarlo en servidores web Apache® o Nginx®.
¿Qué es PFS?
PFS protege los datos compartidos entre el cliente y el servidor incluso si la clave privada se ve comprometida. Puede lograr esto generando una clave de sesión para cada transacción realizada.
¿Por qué implementar PFS en un sitio web?
Un certificado TLS o SSL funciona mediante el uso de una clave pública y una clave privada. Cuando el navegador web y el servidor intercambian claves, el sistema crea una clave de sesión mediante un mecanismo de intercambio de claves llamado RSA, donde se cifra toda la información entre el cliente y el servidor. RSA crea un enlace entre la clave privada del servidor y la clave de sesión creada para cada sesión segura única.
La sesión puede sufrir un ataque de fuerza bruta; esto consiste en un ataque que inyecta al servidor combinaciones de claves de seguridad hasta que encuentra la correcta. Aunque este proceso puede llevar mucho tiempo, si la clave privada del servidor se ve comprometida, los atacantes pueden ver tanto los datos de la sesión como todas las transacciones del cliente.
Cómo PFS protege un sitio web
PFS permite que el servidor no dependa de una única clave de sesión. En lugar de usar la misma clave de cifrado cada vez que un usuario o servicio realiza una conexión, PFS genera una clave de sesión única para cada conexión.
Habilite PFS mediante el uso de mecanismos de intercambio:Ephemeral Diffie-Hellman (DHE)
y Elliptic Curve Diffie-Hellman (ECDHE)
. Si los atacantes fuerzan bruscamente la clave de sesión, solo pueden descifrar la información de esa sesión y no de las demás.
Requisitos para implementar PFS en un servidor web
Utilice una de las siguientes herramientas para implementar PFS:
- OpenSSL 1.0.1c+
- Apache 2.4 o
- Nginx 1.0.6+ y 1.1.0+
Puede verificar las versiones de estos paquetes ejecutando los siguientes comandos:
Nota :Los resultados pueden variar a medida que los proveedores lanzan nuevas versiones.
[root@rackspace-test ~]$ openssl version
OpenSSL 1.1.1g FIPS 21 Apr 2020
[root@rackspace-test ~]$ httpd -v
Server version: Apache/2.4.37 (centos)
Server built: Nov 4 2020 03:20:37
Para servidores de sistemas operativos Debian® o Ubuntu®, el comando es apache2ctl -v
.
[root@rackspace-test ~]$ nginx -v
nginx version: nginx/1.14.1
Configuración del protocolo SSL
Verifique qué sitios web tienen SSL implementado ejecutando los comandos en las siguientes secciones.
Estos ejemplos implementan PFS en un dominio llamado example.com .
Instrucciones de Apache
Hay dos opciones para verificar qué sitios web tienen un certificado SSL:
[root@rackspace-test ~]# grep -ir "SSLEngine" /etc/httpd/
/etc/httpd/conf.d/example.com.conf: SSLEngine on
O bien, puede usar los comandos httpd -S
o apachectl -S
para CentOS® o RedHat® Enterprise Linux® (RHEL) y apache2ctl -S
para sistemas operativos Debian o Ubuntu.
[root@rackspace-test ~]# httpd -S | grep 443
*:443 is a NameVirtualHost
port 443 namevhost www.example.com (/etc/httpd/conf.d/example.com.conf:10)
Agregue los siguientes parámetros a la configuración de vhost con su editor de texto favorito:
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"
Cuando busca la palabra SSL en el host virtual, la salida debe ser similar a la siguiente después de la implementación:
[root@rackspace-test ~]# egrep 'SSL' /etc/httpd/conf.d/example.com.conf
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"
SSLCertificateFile /etc/ssl/certs/2022-example.com.crt
SSLCertificateKeyFile /etc/ssl/private/2022-example.com.key
Asegúrese de que la sintaxis sea correcta y reinicie Apache.
[root@rackspace-test ~]# httpd -t
Syntax OK
[root@rackspace-test ~]# apachectl -k restart
Instrucciones de Nginx
Enumere los sitios web que tienen un certificado SSL instalado:
[root@rackspace-test ~]# egrep -ir 'SSL' /etc/nginx/conf.d/
/etc/nginx/conf.d/example.com.conf: listen 443 ssl;
/etc/nginx/conf.d/example.com.conf: ssl_certificate /etc/ssl/certs/2022-example.com.chained.crt;
/etc/nginx/conf.d/example.com.conf: ssl_certificate_key /etc/ssl/private/2022-example.com.key;
Agregue los siguientes parámetros a la configuración de vhost con su editor de texto favorito:
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
Cuando busca la palabra SSL en el host virtual, la salida debe ser similar a la siguiente después de la implementación:
[root@racksapce-test ~]# egrep -ir 'SSL' /etc/nginx/conf.d/example.com.conf
listen 443 ssl;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
ssl_certificate /etc/ssl/certs/2022-example.com.chained.crt;
ssl_certificate_key /etc/ssl/private/2022-example.com.key;
Asegúrese de que la sintaxis sea correcta y reinicie Nginx.
[root@rackspace-test ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@rackspace-test ~]# nginx -s reload
Al seguir los pasos anteriores, puede implementar PFS correctamente para sus sitios web.
Use la pestaña Comentarios para hacer cualquier comentario o hacer preguntas. También puede iniciar una conversación con nosotros.