Adopte la comunicación web segura: Wildcard HTTPS con Let's Encrypt y Nginx
13:56, 07.12.2023
Una comunicación web segura es crucial para el buen funcionamiento de su servidor.
Muchos enfoques diferentes garantizan que la actividad de su servidor permanezca encriptada y, por tanto, protegida. Es aconsejable, por supuesto, utilizar varias medidas de seguridad combinadas para reforzar la comunicación web.
En este artículo, revisaremos varios métodos de protección web y cómo habilitarlos y combinarlos en su servidor.
Configuración de reglas de cortafuegos para HTTP/S
Un cortafuegos es un software que garantiza la seguridad del sistema operativo regulando el acceso y filtrando la información que proviene de la web. Con un cortafuegos, usted permite o bloquea el tráfico o ciertos tipos de tráfico.
Cuando permite el tráfico HTTP/S, le indica al cortafuegos que habilite el cifrado de datos a través de HTTPS desde la web. Si establece la configuración del tráfico HTTP/S, permite el acceso a sitios web que utilizan los protocolos mencionados en algunas secciones del sitio web o en todo el sitio web que funciona con HTTP/S.
Por ejemplo, las reglas del cortafuegos en CentOS 7 y su configuración por defecto no permiten el acceso a los protocolos HTTP/S. Incluso con el cliente Let's Encrypt, sólo se permitirá el acceso si se cambia la configuración de las reglas del cortafuegos.
Para cambiar la configuración de las reglas por defecto del firewall y permitir el tráfico HTTP/S, necesitará lo siguiente:
- Un servidor en nube con RHEL 7 o CentOS 7 que admita un cortafuegos
- Acceso a su servidor
- Conocimientos básicos de SSH
En primer lugar, inicie sesión en su servidor a través de SSH y asegúrese de que el cortafuegos es compatible utilizando el comando "systemctl status firewalld".
A continuación, ejecute el siguiente comando para HTTP:
sudo firewall-cmd --permanent --zone=public --add-service=http
El comando para HTTPS:
sudo firewall-cmd --permanent --zone=public --add-service=https
Vuelva a cargar el cortafuegos para guardar los cambios utilizando el:
sudo firewall-cmd --reload
Después de completar estos pasos, su servidor tendrá la configuración necesaria para ver las versiones HTTP y HTTPS de su sitio web. Una vez completada la configuración del cortafuegos, puede instalar los certificados.
Gestión de renovaciones de certificados
Puede beneficiarse de los certificados comodín si gestiona varios dominios (hosts) dentro de su servidor. Los certificados comodín son certificados SSL que pueden proporcionar seguridad a varios hosts. Gestionar varios hosts dentro de su servidor con certificados comodín puede ayudarle a ahorrar tiempo y dinero.
En general, Let's Encrypt puede instalar automáticamente los certificados necesarios y ejecutar los servicios web de acuerdo con ellos. Si ya tiene un cliente Let's Encrypt - ¡genial! Si no lo tiene, debe instalar los clientes Nginx y Certbot antes de instalar el cliente Let's Encrypt. Para generar certificados para su servidor, también necesita un nombre de dominio y un proveedor de DNS que soporte el cliente Certbot.
Después de instalar el cliente Certbot, puede empezar a generar certificados.
Tenga en cuenta que el cliente Let's Encrypt exige la verificación de DNS para darle certificados comodín.
Para obtener certificados comodín, utiliza el siguiente comando:
*sudo certbot certonly --manual --preferred-challenges=dns --email xyz@example.com --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d example.com -d .example.com
Donde:
-certonly - solicitar certificados
-manual - obtener certificados
-preferred-challenges=dns - autorización a través de DNS
-server - servidor utilizado para la generación de certificados
-agree-tos - aceptación de los términos y condiciones
-d - dominio (o host) para el que se generan los certificados
Ahora bien, algunos certificados tienen fecha de caducidad. Por lo tanto, cuando finalice el script de obtención de certificados, podrá renovarlos.
Puede probar si la renovación funcionará en los certificados actuales (no caducados), simulando su estado de caducidad con el siguiente comando en Certbot:
sudo certbot renew --dry-run
Para renovar certificados en Certbot, utilice el siguiente comando:
sudo certbot renew
Después de eso, vuelva a cargar el servicio web para los certificados actualizados, utilizando:
sudo nginx -s reload
Si desea que este proceso sea automático, puede hacerlo con el siguiente script.
sudo vi /etc/cron.daily/letsencrypt-renew
#!/bin/sh
if certbot renew > /var/log/letsencrypt/renew.log 2>&1 ; then
nginx -s reload
fi
exit
sudo chmod +x /etc/cron.daily/letsencrypt-renew
El script renueva los certificados y dirige los resultados a un archivo de registro; con una renovación exitosa, el script entonces realiza un reinicio del cliente Nginx para que los cambios se apliquen.
Una vez completado el proceso, puede automatizar el script con Crontab abriendo el crontab del usuario raíz y utilizando el comando de edición que se indica a continuación:
sudo Crontab -e
Para automatizarlo, ponga el siguiente comando en la ventana crontab:
01 02,14 * * * /etc/cron.daily/letsencrypt-renew,
Donde la hora de renovación del script es 02:01 y 14:01, lo que significa que el script se renueva dos veces al día. Puede establecer la hora que más le convenga.
A continuación, guarde los cambios.
Revocación de certificados para mejorar la seguridad
Para eliminar certificados SSL de un servidor, utilice el siguiente comando con el nombre de su dominio (o host):
sudo certbot revoke --cert-path /etc/letsencrypt/live/domain_name/cert.pem
Después de emitir el comando, no recibirá ninguna notificación de cambios en los certificados. Aún así, puede volver a ejecutar el comando, y si dice que el certificado ya ha sido revocado, esto significa que el proceso se ha completado con éxito.
Refuerzo de las medidas de seguridad web
Cuando obtenga o renueve sus certificados, compruebe que el cliente Nginx sigue configurando HTTPS.
Uso exclusivo de protocolos seguros
No todos los protocolos de seguridad se desarrollan de la misma manera, y algunos son menos seguros que otros. Por ejemplo, los certificados SSLv2 y SSLv3 se quedan atrás en cuanto a niveles de seguridad en comparación con los certificados TLS. Se considera que los certificados SSL tienen imperfecciones innatas en cuanto a protocolos de seguridad. De ahí la necesidad de sustituirlos por protocolos mejores. En el caso de SSL, se trata de TLSv1.1 y TLSv1.2.
Sin embargo, incluso con los certificados TLS, es mejor utilizar los certificados más recientes, aunque algunos navegadores sigan exigiendo versiones más antiguas.
Activación de HTTP Strict Transport Security (HSTS)
Strict Transport Security protege los certificados TLS garantizando una comunicación segura con los sitios web que los utilizan. Así, aunque haya problemas de configuración o implementación, HSTS garantizará la seguridad suficiente de los certificados, haciendo que cualquier enlace sea seguro. También avisará a los usuarios de los ataques desactivando la función de advertencia de clic integrada en los certificados.
Puede activar el HTST mediante el siguiente comando:
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
Mejora de las suites de cifrado para la encriptación
La función de los conjuntos de cifrado es evaluar el grado de seguridad de la comunicación entre un servidor web y los clientes visitantes.
A continuación, encontrará un ejemplo creado para claves RSA y ECDSA:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256
Finalmente, el cliente indica las suites de cifrado que utiliza y da a los servidores opciones para elegir suites de cifrado. El cliente pone los cifrados en el servidor en orden descendente, del más seguro al menos seguro. Puede utilizar el siguiente comando para activar esta función:
ssl_prefer_server_ciphers on;
Tenga en cuenta que esto funciona con protocolos SSL, es decir, SSLv3 y posteriores.
Implementación del algoritmo efímero Diffie-Hellman
El algoritmo Diffie-Hellman es un protocolo que intercambia las claves entre dos partes para crear un secreto mutuo que no puede ser descubierto fuera de la comunicación entre las dos partes. DH es básicamente una forma de cifrado que indica a las dos partes que utilicen una clave pública para cifrar o descifrar los datos que intercambian. En pocas palabras, la información secreta se mezcla con la información pública, por lo que sería imposible discernir la información secreta. Es un método útil para establecer la clave compartida entre un servidor y un cliente y utilizar esa clave para cifrar los datos compartidos entre ellos.
El DHE estático se diferencia de su algoritmo efímero porque este último genera una clave temporal para cada interacción sin repetirla. Así, DHE promueve la seguridad a largo plazo, ya que una clave temporal no puede filtrarse, al igual que los datos protegidos por ella.
Puede utilizar el algoritmo DHE mediante el siguiente comando:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
La salida se puede utilizar en la configuración de Nginx, así:
ssl_dhparam /etc/ssl/certs/dhparam.pem;
Redireccionamiento automático de conexiones no cifradas
Una forma útil de garantizar una comunicación web segura es redirigir las conexiones HTTP no cifradas a HTTPS cifradas. Puede hacerlo con el siguiente comando:
server {
listen 80;
server_name domain_name;
return 301 https://$server_name$request_uri;
}
Con él, está creando sólo un segmento de HTTP para que su servidor web pueda detectarlo y actualizar la conexión HTTP a HTTPS. Así, aunque el enlace utilice "http:" se convertirá a "https:".
Integrar todas las medidas de seguridad en la configuración
Aunque el cliente de Certbot guarda la configuración de Nginx cuando se utiliza CentOS, editar manualmente la configuración del cliente Nginx evitará que el archivo se actualice en el futuro. Para ello, cree un nuevo archivo Nginx con el siguiente comando:
sudo vi /etc/nginx/conf.d/domain_name.conf
Con ese comando, crea un archivo Nginx separado que detecta conexiones HTTPS utilizando todas las medidas de seguridad mencionadas anteriormente.
Para añadir las medidas de seguridad, duplica el siguiente ejemplo en Nginx:
# HTTPS server
server {
listen 443 ssl;
server_name domain_name;
ssl_certificate /etc/letsencrypt/live/domain_name/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
#HTTP redirect
server {
listen 80;
server_name domain_name;
return 301 https://$server_name$request_uri;
}
Asegúrese de guardar el archivo en Nginx, y luego reinicie Nginx con el siguiente comando:
sudo systemctl restart nginx
Ahora puede abrir su sitio web en el navegador utilizando la dirección https://domain_name. Si se carga, significa que la instalación se ha realizado correctamente.
Si desea comprobar más a fondo lo bien que funciona el cifrado del servidor en el navegador, utilice una prueba de Qualys SSL Labs. Ponga el nombre de su dominio (host) en su sitio web y pulse el botón Enviar. La prueba le proporcionará información sobre los distintos aspectos del cifrado de su servidor.