20 cosas esenciales que debe saber si está en el servidor web Nginx

Nginx Web Server es uno de los dos servidores web más utilizados del mundo. Consolidó su posición como la aplicación de servidor web perfecta desde sus inicios hace 15 años. Nginx es conocido por su rendimiento superior, que es aproximadamente 2,5 veces más rápido que Apache . Es más adecuado para sitios web que se ocupan de una gran cantidad de activos estáticos, pero también se puede utilizar para sitios web de uso general. Ha superado su uso previsto hace mucho tiempo y ahora se usa para una gran cantidad de tareas como proxy inverso, almacenamiento en caché, equilibrio de carga, transmisión de medios y más.

Datos sobre el servidor web Nginx

Nginx se pronuncia como Engine X y tiene diversos casos de uso en la escena web moderna. Se puede utilizar para alimentar una amplia gama de servicios web, como microservicios, computación en la nube y puertas de enlace API, junto con su función estándar como servidor web. Continuaremos nuestra discusión asumiendo que el servidor web Nginx se ejecuta en .

1. Los conceptos básicos de Nginx

Es necesario que entienda bien los conceptos básicos antes de seguir adelante con cualquier tema técnico. Entonces, aquí presentamos algunas cosas fundamentales con respecto a Nginx. Hay varios tipos de esta aplicación, incluidas las versiones pagas y gratuitas. Sin embargo, el servidor Nginx de código abierto es el más utilizado por los desarrolladores simplemente porque ofrece casi todas las funciones que se te ocurran y no tiene precio.

Servidor web Nginx

Una vez instalado, puede ejecutar sudo service Nginx start para encender su servidor. Los archivos de configuración del servidor se almacenan en los directorios / usr / local / nginx / conf / o / etc / nginx / . Los documentos web se almacenan en los directorios / usr / local / nginx / html / o / var / www / html . Puede detener un servidor en ejecución emitiendo el comando sudo nginx -s stop.

2. Encendido de SELinux

SELinux (Security-Enhanced Linux) es una característica atractiva del kernel de Linux, que proporciona un mayor control sobre la seguridad del sistema a través de políticas de seguridad de control de acceso. Es una práctica común habilitar SELinux en sistemas que pretenden ejecutar servidores web dedicados. Necesita utilizar el comando getsebool -a para esto.

$ sudo getsebool -a | less
$ sudo getsebool -a | grep off
$ sudo getsebool -a | grep on

Los comandos anteriores le proporcionarán información sobre qué configuraciones booleanas se activan y desactivan. Debe deshabilitar todas las entidades que su sistema no requiera para obtener la máxima seguridad. Estas configuraciones se conocen colectivamente como booleanos SELinux. Establecer valores apropiados para estas variables hará que su sistema sea mucho más seguro para prevenir ataques web estándar.

3. Eliminación de módulos Nginx no deseados

A pesar de la naturaleza liviana del servidor predeterminado de Nginx, siempre es una buena idea eliminar cualquier módulo no deseado que su servidor no necesite. Esto minimizará significativamente la huella de memoria y hará que su servidor sea más rápido de lo habitual. Además, limita muchas capacidades de su servidor, por lo que incluso si un usuario malintencionado obtiene acceso a su servidor, tomará mucho tiempo y habilidad obtener el control total del sistema en sí.

Los siguientes comandos demuestran cómo deshabilitar SSI y el módulo de índice automático que se instala de forma predeterminada con su binario Nginx.

sudo ./configure --without-http_autoindex_module --without-http_ssi_module
sudo make
sudo make install

Puede usar el siguiente comando para ver los módulos que se pueden desactivar al compilar su servidor Nginx.

sudo ./configure --help | less

4. Minimizar los privilegios de las redes

Minimizar el privilegio de red de su servidor web también ayuda a aumentar la seguridad. Puede aprovechar las opciones de montaje para este trabajo. Básicamente, esto significa que puede servir todas sus páginas web a través de particiones separadas. Para hacer esto, deberá y montarlas en la ubicación / nginx . Asegúrese de montarlos con permisos noexec, nodev y nosetuid.

privilegios de red

Puede hacerlo editando el archivo / etc / fstab . Edite esto con su editor favorito y agregue lo siguiente al final del archivo.

LABEL=/nginx /nginx ext3 defaults,nosuid,noexec,nodev 1 2

Si su sistema se ejecuta en un sistema de archivos diferente, reemplace ext3 con el nombre de ese sistema de archivos. Necesitará privilegios de sudo para hacer esto.

5. Fortalecimiento de la configuración de red para Nginx

Puede solidificar aún más la seguridad de su sistema mediante la configuración de algunos ajustes de red y kernel. Edite el archivo / etc / sysctl. conf y agregue las siguientes líneas para fortalecer el sistema de su servidor.

# prevent smurf attacks
net.ipv4.icmp_echo_ignore_broadcasts= 1

# stopping being a router
net.ipv4.ip_forward= 0
net.ipv4.conf.all.send_redirects= 0
net.ipv4.conf.default.send_redirects= 0

# prevent alteration of routing tables
net.ipv4.conf.all.accept_redirects= 0
net.ipv4.conf.default.accept_redirects= 0
net.ipv4.conf.all.secure_redirects= 0
net.ipv4.conf.default.secure_redirects= 0

Hay una gran cantidad de opciones disponibles que puede utilizar para proteger su sistema. Serán útiles en caso de que alguien viole la seguridad de su servidor.

6. Cambiar el encabezado de la versión de Nginx

Cambiar el encabezado de la versión de su servidor predeterminado de Nginx es una excelente manera de evitar que los aspirantes a piratas informáticos entren en su sistema. Muchas aplicaciones pueden recibir datos difusos para obtener el encabezado de la versión del software del servidor. Los usuarios malintencionados suelen hacer esto para averiguar la información exacta del servidor para poder apuntar y buscar vulnerabilidades específicas para ellos.

Busque las siguientes líneas del archivo src / http / ngx_http_header_filter_module.c .

static char ngx_http_server_string[]= "Server: nginx" CRLF;
static char ngx_http_server_full_string[]= "Server: " NGINX_VER CRLF;

Reemplácelos con las siguientes líneas.

static char ngx_http_server_string[]= "Server: Ninja Web Server" CRLF;
static char ngx_http_server_full_string[]= "Server: Ninja Web Server" CRLF;

Esto muestra información falsa sobre la versión del servidor a posibles atacantes.

7. Prevención de desbordamientos de búfer

Los desbordamientos de búfer se producen cuando los fragmentos de código escriben datos más allá de su límite. Es un problema clásico de ingeniería de software que es aprovechado por piratas informáticos experimentados. Si se diseñan con éxito, los ataques de desbordamiento de búfer pueden permitir que partes no deseadas entren y tomen el control de su sistema. Puede evitar estos ataques en gran medida limitando el tamaño del búfer para todos los clientes. Agregue lo siguiente a su archivo nginx.conf .

# limit buffer sizes
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;

# set timeouts
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;

Estas opciones esencialmente cambian el valor predeterminado de estos parámetros y disminuyen la superficie de ataque. Puede jugar con ellos para descubrir qué se adapta a su servidor web Nginx.

desbordamiento del búfer del servidor predeterminado de nginx

8. Control de conexiones simultáneas

No importa si está ejecutando el servidor predeterminado de Nginx o algo más, siempre es una buena práctica limitar la cantidad de conexiones simultáneas. Puede ser útil en muchas situaciones, como la prevención de ataques de denegación de servicio y un mejor equilibrio de carga. El módulo NginxHttpLimitZone permite a los administradores limitar las conexiones simultáneas para sesiones o direcciones IP específicas.

limit_zone slimits $binary_remote_addr 5m;
limit_conn slimits 5;

Agregue las líneas anteriores en su archivo nginx.conf . Limita el número de conexiones simultáneas permitidas a 5 por IP. Puede reemplazar fácilmente este valor para que se ajuste a sus requisitos.

9. Filtrado del acceso al dominio

Uno de los tipos de problemas más comunes que enfrentan los servidores web Nginx modernos son las redes de bots. A menudo escanean servidores de forma aleatoria e intentan encontrar todos los dominios asociados. Puede rechazarlos fácilmente agregando las siguientes líneas a su archivo nginx.conf .

# encompass client requests to specified domains

if ($host !~ ^(url.domain|www.url.domain|url.subdomain.domain)$ ) {
return 444;
}

Agregar estas líneas a este archivo permite solicitudes de clientes solo para los dominios mencionados. Puede especificar varios dominios utilizando o “|” operador.

10. Limitación de los métodos disponibles

Hay varios métodos HTTP que se utilizan para obtener páginas web en función de las solicitudes de los usuarios. Algunos de ellos son GET , POST , PUT y DELETE . Sin embargo, hay varios métodos adicionales. Siempre es una buena idea restringir estos métodos para un usuario. Esto ayudará a disminuir las violaciones de datos no deseadas y agrega una capa adicional de seguridad. Agregue las siguientes líneas a su configuración de Nginx.

# allow only GET && HEAD && POST
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}

Ahora, los usuarios no pueden realizar una solicitud de eliminación o búsqueda en su servidor. Solo los métodos GET , HEAD y POST están disponibles para ellos. Puede encontrar más información sobre los métodos HTTP aquí .

11. Restricción de agentes de usuario

Los agentes de usuario son programas informáticos que permiten a los usuarios interactuar con un servicio. son los principales agentes de usuario web de mi sistema.

agente de usuario

A veces, es posible que desee restringir el acceso de agentes de usuarios específicos a su servidor, como esos navegadores sin cabeza que continuamente buscan extraer datos de su sitio web. Esto también resulta útil al bloquear redes de bots, ya que a menudo utilizan el mismo agente de usuario.

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

Agregarlos a su configuración de Nginx bloqueará los agentes de descarga conocidos como wget y BBBike. Las siguientes líneas bloquearán algunos robots conocidos llamados msnbot y scrapbot .

#block robots
if ($http_user_agent ~* msnbot|scrapbot) {
return 403;
}

Puede bloquear los agentes de usuario que desee. Sin embargo, tenga cuidado o podría bloquear el tráfico legítimo a su servidor web Nginx.

12. Bloqueo de spam de referencias

Los spam de referencias son un problema común al que se enfrentan muchos servidores web en la actualidad. Es una técnica utilizada para anunciar sitios web específicos al motor de búsqueda para que obtengan más tráfico a su sitio. Es particularmente peligroso para los servidores web de alta carga, ya que puede causar un daño severo a la clasificación de un sitio. Afortunadamente, puede bloquear la mayoría de estos spam agregando solo unas pocas líneas a su configuración de Nginx.

#deny certain referers
if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) )
{
# return 404;
return 403;
}

Agregue las líneas anteriores a su archivo nginx.conf para bloquear algunos de los spam de referencias más comunes. Puede agregar más palabras a estas líneas según sea necesario.

13. Prevención de enlaces directos de imágenes

El enlace directo de imágenes se ha convertido en una práctica común para muchos administradores web. En esta práctica, los administradores suelen utilizar imágenes personalizadas de su servidor web para atender las solicitudes de sus clientes. Esto puede ser seriamente perjudicial si no se atiende, ya que su servidor web puede ser responsable de entregar los activos de imagen solicitados por los usuarios de otro servidor web. Puede evitarlo fácilmente y ahorrar su valioso ancho de banda, como se muestra a continuación.

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

Agregar estas líneas a su archivo de configuración de Nginx bloqueará las solicitudes de imagen del servidor web mencionado. De esta manera, su servidor predeterminado de Nginx solo entregará imágenes a solicitudes auténticas de los clientes. Además, es posible que desee utilizar el mapa Nginx para bloquear el enlace directo de imágenes para una gran cantidad de dominios.

14. Restricción del acceso al directorio

A menudo puede encontrar toneladas de páginas web que no restringen sus directorios. Son excepcionalmente vulnerables a los usuarios malintencionados, ya que les permiten atravesar el sitio como quieran y, a menudo, conducen a una mayor escalada de los privilegios del sitio. El siguiente fragmento le mostrará cómo bloquear usuarios específicos, permitir rangos de IP particulares y negar todos los demás al directorio / docs / .

location /docs/ {
# block one user
deny 192.168.1.1;

# allow anyone in 192.168.1.0/24
allow 192.168.1.0/24;

# drop rest
deny all;
}

Agregue estos a su configuración de Nginx y reemplace / docs / con directorios que contengan información confidencial. También puede proteger sus directorios con contraseñas, como se muestra a continuación. Primero, cree un archivo de contraseña y agregue un USUARIO

$ sudo mkdir /usr/local/nginx/conf/.htpasswd/
$ sudo htpasswd -c /usr/local/nginx/conf/.htpasswd/passwd USER

Ahora agregue estas líneas al archivo nginx.conf .

# password rotect /personal-images/ and /delta/ directories
location ~ /(personal-images/.*|delta/.*) {
auth_basic "Restricted";
auth_basic_user_file /usr/local/nginx/conf/.htpasswd/passwd;
}

15. Configuración de SSL para el servidor web Nginx

SSL (Secure Sockets Layer) se ha convertido en el estándar de seguridad de facto de los servidores web modernos. Cualquier sitio que no implemente esta tecnología se considera inseguro para muchos profesionales de la seguridad. Afortunadamente, es sencillo configurar y mantener la seguridad SSL para los servidores Nginx.

servidor web nginx con ssl

Hay muchas formas de configurar SSL para un sitio web. Los administradores pueden crear certificados SSL autofirmados, utilizar autoridades de certificación populares o establecer proxies inversos SSL. Si es relativamente nuevo en la administración de servidores web, le recomendaremos que utilice la popular certificación Let’s Encrypt . Es una autoridad de certificación gratuita y fácil de usar, que proporciona certificados SSL / TLS seguros. Le mostraremos cómo hacer esto en una guía separada.

16. Aumento de la seguridad de PHP

PHP es uno de los y sirve a una cantidad considerable de páginas web en Internet. Sin embargo, es bastante antiguo y propenso a varias vulnerabilidades de seguridad. Por lo tanto, si está utilizando PHP en su servidor Nginx, siempre debe tener cuidado e implementar estándares de seguridad específicos. Por ejemplo, agregar las siguientes líneas a su archivo /etc/php.ini mejorará la seguridad en un factor significativo.

# reject crucial functions
disable_functions= phpinfo, system, mail, exec
# max execution time for scripts, in seconds
max_execution_time= 30
# max memory limit for scripts, in MB
memory_limit= 4M
# max allowable POST data
post_max_size= 4M
# restrict PHP information
expose_php= Off
# log errors
log_errors= On
# enable SQL safe mode
sql.safe_mode= On

Hay muchas más instrucciones para mejorar la seguridad que puede agregar en este archivo para que su servidor sea resistente a los daños.

17. Mejora de la seguridad del servidor predeterminado de Nginx

Los usuarios de Linux pueden mejorar fácilmente la seguridad general de los servidores Nginx mediante alguna configuración manual. Como se mencionó anteriormente, debe activar SELinux en cualquier máquina que ejecute Nginx para una protección óptima. Configurar los permisos correctos en / nginx también es extremadamente importante. Para encontrar qué permisos tienen los usuarios en sus documentos Nginx, ejecute el siguiente comando.

$ sudo find /nginx -user nginx
$ sudo find /usr/local/nginx/html -user nginx

Asegúrese de que solo la raíz o el propietario de estos documentos tengan acceso de escritura a ellos. Puede ser un salvavidas en caso de futuros robos, ya que los atacantes requerirán más tiempo y experiencia para obtener más privilegios para la máquina. Utilice el siguiente comando para eliminar cualquier archivo no deseado creado por vi u otros .

$ sudo find /nginx -name '.?*' -not -name .ht* -or -name '*~' -or -name '*.bak*' -or -name '*.old*'
$ sudo find /usr/local/nginx/html/ -name '.?*' -not -name .ht* -or -name '*~' -or -name '*.bak*' -or -name '*.old*'

18. Auditoría de registros de Nginx

La verificación de los archivos de registro de su servidor Nginx le proporcionará información valiosa, como el interés de los usuarios, los intentos de autenticación no deseados, etc. La capacidad de adecuada es un activo útil para los webmasters por este motivo.

registros nginx

Puede encontrar los archivos de registro de su servidor en el directorio / usr / local / nginx / logs . Los siguientes comandos nos muestran cómo agruparlos para obtener información confidencial.

$ sudo grep "/login.php??" /usr/local/nginx/logs/access_log
$ sudo grep "...etc/passwd" /usr/local/nginx/logs/access_log
$ sudo egrep -i "denied|error|warn" /usr/local/nginx/logs/error_log

También puede instalar o crear aplicaciones de auditoría específicas que y lo mantendrán informado sobre lo que sucede en su servidor.

19. Ejecución de Nginx en contenedores

La mayoría de los profesionales aconsejan a los usuarios que ejecuten su servidor Nginx desde dentro de un contenedor dedicado. Los contenedores son entornos aislados en las máquinas del servidor que se construyeron para mantener los procesos separados entre sí. Puede instalar y ejecutar fácilmente su servidor Nginx en contenedores como LXD, Docker, cárceles FreeBSD, XEN y otros . Estos se conocen colectivamente como cárceles chroot entre los webmasters.

Un contenedor dedicado para su servidor contendrá todos los recursos necesarios para ejecutar el servidor y manejar las solicitudes de los clientes. La ventaja que obtiene es el aislamiento de este servidor del resto de su máquina. Por lo tanto, incluso si alguien obtiene acceso no autorizado a su servidor a través de algunas lagunas, no podrá controlar el núcleo de su sistema.

20. Algunas sugerencias útiles

Puede configurar fácilmente los diferentes aspectos de su servidor web Nginx modificando el archivo de configuración centralizado. Hay muchas cosas que hacer. Por ejemplo, utilice lo siguiente para evitar el secuestro de clics.

add_header X-Frame-Options SAMEORIGIN;

La siguiente línea deshabilitará los tipos de contenido que detectan algunos navegadores.

add_header X-Content-Type-Options nosniff;

Para habilitar los filtros de secuencias de comandos entre sitios (XSS), puede utilizar

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

Existen numerosas funciones útiles que puede encontrar en la documentación de Nginx . Sin embargo, asegúrese de comprender lo que hacen antes de aplicar cualquier cosa. De lo contrario, su sitio puede enfrentarse a un tiempo de inactividad debido a una configuración incorrecta.

Pensamientos finales

Hay demasiadas razones para la popularidad de los servidores web Nginx. Se ha convertido en el debido a su rico conjunto de características y un número aparentemente ilimitado de capacidades de configuración. A menudo vemos a muchos administradores simplemente instalando y usando el servidor predeterminado de Nginx. Les faltan muchas funciones y la flexibilidad que ofrece Nginx de esta manera. Es por eso que nuestros editores se han tomado la libertad de describir estas mejores prácticas antes que usted. Con suerte, pudimos satisfacer su interés y ayudarlo a aprender algo nuevo.

Leave a Comment

Your email address will not be published.