Basado en las cosas maravillosas de las que has oído hablar Nginx, tal vez decidió intentarlo. Es posible que le haya gustado tanto que esté considerando reemplazar sus instalaciones de Apache con Nginx después de leer algunos de los artículos sobre el tema que hemos publicado en este sitio.
Si es así, estoy seguro de que recibirá esta guía con los brazos abiertos, ya que vamos a cubrir 12 consejos para aumentar la seguridad de su Nginx servidores (desde mantener Nginx actualizado hasta usar TLS y redirigir HTTP a HTTPS), y notará que algunos de ellos son muy similares a lo que haría con Apache.
No te pierdas:
13 Consejos de seguridad y refuerzo del servidor web Apache
25 trucos de Apache Htaccess para proteger el servidor web Apache
Usaremos el siguiente entorno en esta guía:
Con eso en mente, comencemos.
En el momento de escribir este artículo, las últimas versiones de Nginx en CentOS (en EPEL) y los repositorios de Debian son 1.6.3 y 1.6.2-5, respectivamente.
No te pierdas:Instale la última versión estable de Nginx desde repositorios y fuentes
Aunque instalar software desde los repositorios es más fácil que compilar el programa desde el código fuente, esta última opción tiene dos ventajas: 1) le permite crear módulos adicionales en Nginx (como mod_security), y 2) siempre proporcionará una versión más nueva que los repositorios (1.9.9 a partir de hoy). Las notas de la versión siempre están disponibles en el sitio web de Nginx.
No te pierdas:
Proteja Apache contra ataques de fuerza bruta y DDoS mediante Mod_Security y Mod_Evasive
Para eliminar explícitamente módulos de Nginx durante la instalación desde la fuente, haga lo siguiente:
# ./configure --without-module1 --without-module2 --without-module3.
Por ejemplo:
# ./configure --without-http_dav_module --withouthttp_spdy_module
Como probablemente adivinará, eliminar módulos de una instalación anterior de Nginx desde la fuente requiere realizar la compilación nuevamente.
Una palabra de precaución: Los módulos proporcionan las directivas de configuración. ¡Asegúrese de no inhabilitar un módulo que contenga una directiva que necesitará más adelante! Deberías comprobar el documentos nginx para obtener la lista de directivas disponibles en cada módulo antes de tomar una decisión sobre la desactivación de los módulos.
El server_tokens
La directiva le dice a Nginx que muestre su versión actual en las páginas de error. Esto no es deseable ya que no desea compartir esa información con el mundo para evitar ataques a su servidor web causados por vulnerabilidades conocidas en esa versión específica.
Para deshabilitar el server_tokens
directiva, establezca si en apagado dentro de un bloque de servidor:
servidor {escuchar 192.168.0.25:80; server_tokens off; nombre_servidor tecmintlovesnginx.com www.tecmintlovesnginx.com; access_log /var/www/logs/tecmintlovesnginx.access.log; error_log /var/www/logs/tecmintlovesnginx.error.log error; root /var/www/tecmintlovesnginx.com/public_html; index index.html index.htm; }
Reinicie nginx y verifique los cambios:
Un agente de usuario HTTP es un software que se utiliza para la negociación de contenido contra un servidor web. Esto también incluye rastreadores y robots de malware que pueden terminar afectando el rendimiento de su servidor web al desperdiciar recursos del sistema.
Para mantener más fácilmente la lista de agentes de usuario no deseados, cree un archivo (/etc/nginx/blockuseragents.rules
por ejemplo) con el siguiente contenido:
map $ http_user_agent $ blockedagent {predeterminado 0; ~ * malicioso 1; ~ * bot 1; ~ * puerta trasera 1; ~ * rastreador 1; ~ * bandido 1; }
A continuación, coloque la siguiente línea antes de la definición del bloque del servidor:
incluir /etc/nginx/blockuseragents.rules;
Y una declaración if para devolver una respuesta 403 si la cadena del agente de usuario está en la lista negra definida anteriormente:
Reinicie nginx y todos los agentes de usuario cuya cadena coincida con la anterior no podrán acceder a su servidor web. Reemplazar 192.168.0.25 con la IP de su servidor y siéntase libre de elegir una cadena diferente para el --agente de usuario
interruptor de wget:
# wget http://192.168.0.25/index.html. # wget --user-agent "Soy un bandido jaja" http://192.168.0.25/index.html
También conocidos como verbos, los métodos HTTP indican la acción que se desea realizar en un recurso servido por Nginx. Para aplicaciones y sitios web comunes, solo debe permitir OBTENER, CORREO, y CABEZA y deshabilite todos los demás.
Para hacerlo, coloque las siguientes líneas dentro de un bloque de servidor. A 444 La respuesta HTTP significa una respuesta vacía y se usa a menudo en Nginx para engañar a los ataques de malware:
if ($ request_method! ~ ^ (GET | HEAD | POST) $) {return 444; }
Para probar, use rizo para enviar un ELIMINAR Solicite y compare la salida con la que envía un OBTENER:
# curl -X BORRAR http://192.168.0.25/index.html. # curl -X POST http://192.168.0.25/index.html
Para evitar ataques de desbordamiento de búfer contra su servidor web Nginx, configure las siguientes directivas en un archivo separado (cree un nuevo archivo llamado /etc/nginx/conf.d/buffer.conf
, por ejemplo):
client_body_buffer_size 1k; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k;
Las directivas anteriores garantizarán que las solicitudes realizadas a su servidor web no provoquen un desbordamiento del búfer en su sistema. Una vez más, consulte los documentos para obtener más detalles sobre lo que hace cada uno de ellos.
Luego agregue una directiva de inclusión en el archivo de configuración:
incluir /etc/nginx/conf.d/*.conf;
Para limitar las conexiones por IP, utilice el limit_conn_zone
(en un contexto http o al menos fuera del bloque del servidor) y las directivas limit_conn (en un http, bloque del servidor o contexto de ubicación).
Sin embargo, tenga en cuenta que no se cuentan todas las conexiones, sino solo aquellas que tienen una solicitud procesada por el servidor y se ha leído todo el encabezado de la solicitud.
Por ejemplo, establezcamos el número máximo de conexiones en 1
(sí, es una exageración, pero funcionará bien en este caso) en una zona llamada addr (puede configurar esto con el nombre que desee):
limit_conn_zone $ binary_remote_addr zone = addr: 5m; limit_conn addr 1;
Una simple prueba con Benchmark de Apache (realizar carga de Nginx) donde 10
las conexiones totales se hacen con 2
Las solicitudes simultáneas nos ayudarán a demostrar nuestro punto:
# ab -n 10 -c 2 http://192.168.0.25/index.html.
Consulte el siguiente consejo para obtener más detalles.
Una vez que haya realizado la prueba descrita en el consejo anterior, verifique el registro de errores que está definido para el bloque del servidor:
Es posible que desee utilizar grep para filtrar los registros de solicitudes fallidas realizadas al agregarr zona definida en SUGERENCIA # 7:
# grep addr /var/www/logs/tecmintlovesnginx.error.log --color = auto.
Asimismo, puede filtrar el registro de acceso para obtener información de interés, como por ejemplo:
Y tome las medidas adecuadas si detecta alguna actividad inusual o no deseada.
El enlace directo de imágenes ocurre cuando una persona muestra en otro sitio una imagen alojada en el suyo. Esto provoca un aumento en el uso de su ancho de banda (por el que paga) mientras que la otra persona muestra alegremente la imagen como si fuera de su propiedad. En otras palabras, es una doble pérdida para ti.
Por ejemplo, supongamos que tiene un subdirectorio llamado img
dentro de su bloque de servidor donde almacena todas las imágenes utilizadas en ese host virtual. Para evitar que otros sitios utilicen sus imágenes, deberá insertar el siguiente bloque de ubicación dentro de su definición de host virtual:
location / img / {valid_referers ninguno bloqueado 192.168.0.25; if ($ invalid_referer) {return 403; } }
Luego modifique el index.html
archivo en cada host virtual de la siguiente manera:
192.168.0.26 |
192.168.0.25 |
¡Nginx significa poder! |
¡Tecmint ama a Nginx! |
Ahora navegue a cada sitio y, como puede ver, la imagen se muestra correctamente en 192.168.0.25 pero es reemplazado por un 403 respuesta en 192.168.0.26:
Tenga en cuenta que este consejo depende de que el navegador remoto envíe el campo Referer.
Siempre que sea posible, haga lo que sea necesario para evitar SSL en cualquiera de sus versiones y uso TLS en lugar de. La siguiente ssl_protocols
debe colocarse en un servidor o contexto http en su archivo de host virtual o es un archivo separado a través de una directiva de inclusión (algunas personas usan un archivo llamado ssl.conf
, pero depende totalmente de usted):
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Por ejemplo:
En primer lugar, genere una clave y un certificado. No dude en utilizar un tipo de cifrado diferente si lo desea:
# openssl genrsa -aes256 -out tecmintlovesnginx.key 1024. # openssl req -new -key tecmintlovesnginx.key -out tecmintlovesnginx.csr. # cp tecmintlovesnginx.key tecmintlovesnginx.key.org. # openssl rsa -in tecmintlovesnginx.key.org -out tecmintlovesnginx.key. # openssl x509 -req -days 365 -in tecmintlovesnginx.csr -signkey tecmintlovesnginx.key -out tecmintlovesnginx.crt.
Luego agregue las siguientes líneas dentro de un bloque de servidor separado en preparación para el siguiente consejo (http -> https
redirección) y mueva las directivas relacionadas con SSL al nuevo bloque también:
servidor {escuchar 192.168.0.25:443 ssl; server_tokens off; nombre_servidor tecmintlovesnginx.com www.tecmintlovesnginx.com; root /var/www/tecmintlovesnginx.com/public_html; ssl_certificate /etc/nginx/sites-enabled/certs/tecmintlovesnginx.crt; ssl_certificate_key /etc/nginx/sites-enabled/certs/tecmintlovesnginx.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; }
En el siguiente consejo, verificaremos cómo nuestro sitio ahora usa un certificado autofirmado y TLS.
Agregue la siguiente línea al primer bloque del servidor:
volver 301 https://$server_name$request_uri;
La directiva anterior devolverá un 301 (Movido permanentemente) respuesta, que se utiliza para la redirección de URL permanente cada vez que se realiza una solicitud a puerto 80 de su host virtual, y redirigirá la solicitud al bloque de servidor que agregamos en el anterior propina.
La siguiente imagen muestra la redirección y confirma el hecho de que estamos usando TLS 1.2 y AES-256 para cifrado:
En este artículo, hemos compartido algunos consejos para proteger su servidor web Nginx. Nos encantaría saber lo que piensa y, si tiene otros consejos que le gustaría compartir el resto de la comunidad, no dude en hacérnoslo saber enviándonos una nota mediante el formulario de comentarios debajo.