Cómo fortalecer y asegurar el servidor web NGINX en Linux

Podría decirse que Nginx es uno de los servidores web gratuitos y de código abierto más utilizados para alojar sitios web de alto tráfico. Es bien conocido por su estabilidad, rendimiento estelar, bajo consumo de recursos y configuración ajustada. Algunos de los sitios populares impulsados ​​por Nginx incluyen WordPress.com, GitHub, Netflix, Airbnb, Hulu, Eventbrite, Pinterest y SoundCloud, por mencionar algunos.

Si bien es potente y estable, las configuraciones predeterminadas no son seguras y se requieren ajustes adicionales para fortalecer el servidor web y brindarle la seguridad que tanto necesita para evitar ataques e infracciones.

En este artículo, nos basamos en algunos de los pasos que puede seguir para fortalecer y proteger su servidor web Nginx y aprovecharlo al máximo.

1) Implementar Certificado SSL

Uno de los pasos preliminares y cruciales para fortalecer su servidor web Nginx es asegurarlo mediante el uso de un certificado SSL. El certificado SSL es un certificado digital criptográfico que cifra el tráfico entre su servidor web y los navegadores web de los visitantes de su sitio. También obliga a su sitio a usar el protocolo HTTPS seguro y descartar HTTP, que envía tráfico en texto sin formato. Al hacerlo, la comunicación de ida y vuelta se asegura y se mantiene a salvo de piratas informáticos que podrían intentar espiar y robar información confidencial, como nombres de usuario, contraseñas e información de tarjetas de crédito.

Puede aprovechar el certificado SSL gratuito Let’s Encrypt que es fácil de instalar y configurar y tiene una validez de 90 días. Una vez que lo haya instalado, puede verificar la fuerza del cifrado SSL probando su dominio en Laboratorios SSL. Los resultados se muestran a continuación.

SSL-Informe-antes-deshabilitar-débil-ssl-tls

Como puede ver, el dominio que estamos usando obtuvo una calificación B, debido al débil soporte de protocolo resaltado en amarillo. Todavía tenemos que hacer algunos ajustes para llevarlo al Grado A. Veamos cómo podemos mejorar el soporte del Protocolo en el próximo paso.

2) Deshabilitar protocolos SSL / TLS débiles

Como ha visto en los resultados, implementar SSL no implica necesariamente que su sitio esté totalmente protegido. Las versiones obsoletas como TLS 1.0, TLS 1.1 y SSL 3 se consideran débiles y presentan vulnerabilidades que los piratas informáticos pueden explotar y, finalmente, comprometer su servidor web. Estos protocolos son propensos a vulnerabilidades como POODLE, BEAST y CRIME.

De hecho, los navegadores web más populares y ampliamente utilizados han anunciado el fin del soporte para TLS 1.0 y TLS 1.1 dentro de los plazos que se muestran.

  • Nombre del navegador Fecha
  • Google Chrome enero de 2020
  • Mozilla Firefox marzo de 2020
  • Safari/Webkit Marzo de 2020
  • Microsoft Edge junio de 2020

Con esta información a la mano, sería prudente cumplir con los protocolos de seguridad más recientes y, al momento de escribir este artículo, el protocolo más reciente es TLS 1.2 con TLS 1.3 esperado más adelante en 2020.

Para implementar TLS 1.2 y TLS 1.3, vamos a editar 2 archivos:

  • /etc/nginx/nginx.conf: este es el archivo de configuración principal de nginx
  • /etc/nginx/sitios-disponibles/ejemplo.com (o /predeterminado)

Si está ejecutando Let’s Encrypt SSL, asegúrese de editar los siguientes archivos

  • /etc/nginx/nginx.conf
  • /etc/letsencrypt/options-ssl-nginx.conf

Use los siguientes pasos para deshabilitar los protocolos SSL / TLS débiles

Paso 1) Edite el archivo nginx.conf

En primer lugar, asegúrese de realizar una copia de seguridad del archivo /etc/nginx/nginx.conf antes de realizar cualquier cambio. Luego abra el archivo usando el editor de texto de su elección

$ sudo vi /etc/nginx/nginx.conf

Ubique la siguiente línea

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE

Para deshabilitar los protocolos débiles, simplemente elimine los protocolos TLSv1 y TLSv1.1 y agregue TLSv1.2 y TLSv1.3 al final.

ssl_protocols TLSv1.2  TLSv1.3 ; # Dropping SSLv3, ref: POODLE

Esto debería aparecer de la siguiente manera en la línea 36

Configuración de TLS-SSL-NGINX-Linux

Guarde y salga del archivo de configuración.

Paso 2) Edite el archivo de bloque del servidor Nginx

Los protocolos obsoletos aún pueden estar en sus respectivos archivos de configuración de bloque del servidor Nginx. Los archivos de configuración de bloques se encuentran en el directorio /etc/nginx/sites-available/.

Por lo tanto, proceda y modifique su archivo de configuración de bloques.

$ sudo vi /etc/nginx/sites-available/example.com
OR
$ sudo vi /etc/nginx/sites-available/default

Como antes, desplácese y localice la siguiente línea

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Nuevamente, elimine el protocolo TLSv1 y TLSv1.1 y agregue TLSv1.3 al final.

NOTA: Si está utilizando Let’s Encrypt SSL, modifique el archivo SSL:

$ sudo vi /etc/letsencrypt/options-ssl-nginx.conf

Para que los cambios persistan, reinicie el servidor web Nginx

$ sudo systemctl restart nginx

Ahora diríjase a la prueba de SSL Labs y pruebe su dominio una vez más. Esta vez, debe obtener una calificación A como se muestra.

SSL-Informe-después-de deshabilitar-débil-ssl-tls

3) Prevenir la divulgación de información

Parte de fortalecer su servidor implica limitar la divulgación de información en su servidor web tanto como sea posible. La información se puede filtrar a través de encabezados HTTP o informes de errores. Parte de esta información incluye la versión de Nginx que está ejecutando, y realmente no le gustaría revelar eso a los piratas informáticos.

De forma predeterminada, Nginx muestra información del encabezado HTTP cuando ejecuta el comando:

$ curl -I http://localhost

Curl-nginx-headers-display

En el resultado de la segunda línea, puede ver que se ha revelado la versión de Nginx y el sistema operativo en el que se ejecuta.

Servidor: nginx/1.14.0 (Ubuntu)

La versión también se mostraría en un navegador web si se muestra una página de error, como una página de error 404, como se muestra.

NGINX-WebServer-Verison-OS-Info-Error-Page

Para evitar esta fuga de información, edite el nginx.conf archivo y en la sección http {, elimine el comentario de la siguiente línea

server_tokens off;

Guarde los cambios y salga. Luego reinicie el servidor web para que se reflejen los cambios.

$ sudo systemctl restart nginx

Ahora recarga la página de error y nota la diferencia. Se ha omitido la versión y el sistema operativo Nginx que se está ejecutando.

Ocultar-NGINX-OS-Info-Error-Page

Otra forma de verificar cuánta información se está filtrando de su servidor web es visitando el Sitio de firma del servidor y comprueba tu dominio. Si todo está bien, obtendrá el siguiente resultado.

Servidor-Firma-Comprobación en línea

4) Deshágase de los métodos HTTP no deseados

Otra buena práctica es deshabilitar los protocolos no deseados que el servidor web no va a implementar. La siguiente línea permitirá la implementación de los métodos GET, POST y HEAD y excluirá todos los demás métodos, incluidos TRACE y DELETE. Agregue la siguiente línea en su archivo de bloque de servidor.

location / {
limit_except GET HEAD POST { deny all; }
}

5) Deshabilitar suites de cifrado débiles

Además de la implementación de SSL, tenga como objetivo deshabilitar los cifrados débiles e inseguros, incluidos los cifrados RC4. Estos vienen agrupados de forma predeterminada únicamente con el propósito de compatibilidad con versiones anteriores de Nginx y no hay una buena razón para tenerlos, ya que sirven como vulnerabilidades potenciales que pueden explotarse. Por lo tanto, en su archivo ssl.conf, reemplace los cifrados con el siguiente conjunto de cifrado.

'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

6) Eliminar cualquier módulo innecesario

Para minimizar aún más el panorama de amenazas, se recomienda eliminar los módulos innecesarios de la configuración predeterminada del servidor. Las mejores prácticas exigen que mantenga un perfil esbelto y solo habilite los módulos que se utilizan para servir contenido desde el servidor web. Sin embargo, tenga cuidado de no desinstalar o eliminar los módulos que pueda necesitar. Como recomendación, realice pruebas en un entorno de prueba o control de calidad antes de decidir qué módulos deben deshabilitarse y cuáles son necesarios para su servidor web.

7) Evitar un mejor desbordamiento

En la gestión de memoria, un búfer es una ubicación de almacenamiento que acomoda temporalmente los datos a medida que comienzan a transferirse de una ubicación de memoria a otra.

Cuando el volumen de datos supera la capacidad del búfer de memoria, se produce un desbordamiento del búfer. En otras palabras, los desbordamientos de búfer ocurren cuando un programa escribe más datos en un bloque de memoria que puede contener o manejar.

Un atacante puede explotar esta vulnerabilidad para enviar código malicioso que puede comprometer un sistema. Como práctica estándar, se recomienda realizar algunos ajustes en el servidor web para mitigar estos problemas. Agregue las siguientes líneas de código al archivo nginx.conf.

##buffer policy
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
##end buffer policy

8) Prevenir ataques XSS

Un ataque XSS (cross-site scripting) es un ataque en el que un pirata informático utiliza una aplicación web para inyectar un código malicioso o un script del lado del navegador en un sitio de confianza. Cuando un visitante del sitio visita el sitio, el script se descarga y puede acceder a varios recursos del navegador, como cookies y token de sesión.

Una de las medidas de prevención contra este tipo de ataque es agregar la siguiente línea en el archivo ssl.conf.

add_header X-XSS-Protection "1; mode=block";

9) Evite los ataques de clickjacking

Para mantenerse alejado de los ataques de secuestro de clics, agregue X-Frame-Options en el encabezado HTTP en el archivo nginx.conf como se muestra

add_header X-Frame-Options "SAMEORIGIN";

Una vez hecho esto, guarde y reinicie el servidor web Nginx.

10) Denegar agentes de usuario automatizados

Para mantener su servidor a salvo de bots y otras secuencias de comandos automatizadas que pueden implementar los atacantes para recuperar información de su sitio, es prudente denegar explícitamente agentes de usuario específicos que, en última instancia, pueden conducir a ataques de denegación de servicio DOS. Agregue la siguiente línea en el archivo nginx.conf.

if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
return 403;
}

11) Evitar enlaces directos de imágenes

Hotlinking es una práctica en la que un usuario vincula una imagen a su sitio web en lugar de cargar directamente la imagen en su sitio. Cuando esto sucede, su imagen aparece en su sitio y la otra cara de esto es que termina pagando por ancho de banda adicional.

Para evitar que esto suceda, busque la directiva de ubicación dentro del archivo de configuración de Nginx y agregue el siguiente fragmento

# Stop deep linking or hot linking
location /images/ {
  valid_referers none blocked www.example.com example.com;
   if ($invalid_referer) {
     return   403;
   }
}

También puede especificar las extensiones de imagen como se muestra:

valid_referers blocked www.example.com example.com;
if ($invalid_referer) {
    rewrite ^/images/uploads.*.(gif|jpg|jpeg|png)$ http://www.example.com/banned.jpg last
}

12) Mantenga Nginx actualizado

¿Fácil verdad? Mantener su servidor web actualizado es una de las formas en que puede proteger su servidor. La actualización de su servidor web aplica los parches necesarios que abordan las vulnerabilidades preexistentes que los piratas informáticos pueden explotar para comprometer su servidor.

Ese fue un resumen de algunas de las medidas clave que puede tomar para fortalecer su servidor web Nginx y protegerlo de las técnicas de explotación comunes. Esto contribuirá en gran medida a proteger los archivos de su sitio web y también a los visitantes de su sitio.

Leer también : Cómo configurar NGINX como equilibrador de carga TCP/UDP en Linux

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *