GNU/Linux >> Tutoriales Linux >  >> Linux

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. Cimentó su posición como la aplicación de servidor web perfecta desde su creación hace 15 años. Nginx es conocido por su rendimiento superior, que es aproximadamente 2,5 veces más rápido que Apache. Se adapta mejor a los sitios web que manejan una gran cantidad de activos estáticos, pero también se puede usar para sitios web de propósito 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 Motor X y tiene diversos casos de uso en la escena web moderna. Se puede utilizar para potenciar 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 Linux o sistemas UNIX similares.

1. Los fundamentos de Nginx

Es necesario que obtenga los conceptos básicos antes de continuar con cualquier tema técnico. Entonces, aquí presentamos algunas cosas fundamentales con respecto a Nginx. Hay varios sabores de esta aplicación, incluidas variaciones 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.

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

2. Activando SELinux

SELinux (Linux con seguridad mejorada) es una característica convincente 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. Debe utilizar el getsebool -a comando 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 están activadas y desactivadas. Debe deshabilitar todas las entidades que su sistema no requiera para obtener la máxima seguridad. Estas configuraciones se conocen colectivamente como valores booleanos de SELinux. Establecer valores apropiados para estas variables hará que su sistema sea mucho más seguro para evitar 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 no necesite su servidor. 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 malicioso obtiene acceso a su servidor, llevará mucho tiempo y habilidad obtener el control total del sistema.

Los siguientes comandos demuestran cómo deshabilitar SSI y el módulo de indexación automática que está instalado de manera 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. Minimización de los privilegios de red

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. Esencialmente, esto significa que puede servir todas sus páginas web a través de particiones separadas. Para hacer esto, deberá crear particiones adicionales y montarlas en /nginx localización. Asegúrese de montarlos con los permisos noexec, nodev y nosetuid.

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 algunas configuraciones de red y kernel. Edite el /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 usar para proteger su sistema. Serán útiles en caso de que alguien infrinja 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 ingresen a su sistema. Muchas aplicaciones pueden recibir datos borrosos para obtener el encabezado de la versión del software del servidor. Los usuarios malintencionados a menudo hacen esto para averiguar la información exacta del servidor para poder detectar 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ácelas 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 ocurren 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 aprovechan los piratas informáticos experimentados. Si se diseñan con éxito, los ataques de desbordamiento de búfer pueden permitir que personas no deseadas ingresen y tomen el control de su sistema. Puede evitar estos ataques en gran medida limitando los tamaños de búfer para todos los clientes. Agregue lo siguiente a su nginx.conf archivo.

# 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.

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 específicas o direcciones IP.

limit_zone slimits $binary_remote_addr 5m;
limit_conn slimits 5;

Agregue las líneas anteriores en su nginx.conf expediente. 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 de acceso a dominios

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 aleatoriamente e intentan encontrar todos los dominios asociados. Puede negarlos fácilmente agregando las siguientes líneas a su nginx.conf archivo.

# 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 HTTP métodos utilizados para obtener páginas web en función de las solicitudes de los usuarios. Algunos de ellos son GET , PUBLICAR , PONER y ELIMINAR . Sin embargo, hay un montón de 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 el OBTENER , CABEZA y POST los métodos 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. Los navegadores web de Ubuntu son los principales agentes de usuario web en mi sistema.

A veces, es posible que desee restringir el acceso de agentes de usuarios específicos a su servidor, como esos navegadores sin cabeza que buscan continuamente extraer datos de su sitio web. Esto también es útil cuando se bloquean botnets, ya que a menudo usan 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 botella de chatarra .

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

Puede bloquear cualquier agente 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 referencia

Los spams de referencia 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 en el motor de búsqueda para que obtengan más tráfico en su sitio. Es particularmente peligroso para los servidores web de alta carga, ya que puede causar daños graves en la clasificación de un sitio. Afortunadamente, puede bloquear la mayoría de estos correos no deseados 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 nginx.conf archivo para bloquear algunos de los spam de referencia 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

La vinculación de imágenes se ha convertido en una práctica común para muchos administradores web. En esta práctica, los administradores a menudo usan imágenes personalizadas de su servidor web para atender las solicitudes de sus clientes. Esto puede ser muy dañino 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 evitar esto fácilmente y ahorrar su preciado 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 imágenes del servidor web mencionado. De esta manera, su servidor predeterminado de Nginx solo entregará imágenes a solicitudes de clientes auténticas. Además, es posible que desee utilizar el mapa Nginx para bloquear la vinculación activa 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 denegar 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;
}

Agréguelos a su configuración de Nginx y reemplace /docs/ con directorios que contienen información sensible. 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 a nginx.conf archivo.

# 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.

Hay muchas formas de configurar SSL para un sitio web. Los administradores pueden crear certificados SSL autofirmados, usar autoridades de certificación populares o configurar proxies inversos SSL. Si es relativamente nuevo en la administración de servidores web, le recomendamos 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 lenguajes del lado del servidor más utilizados y sirve 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 /etc/php.ini archivo 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 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. Configuración de los permisos correctos en /nginx también es extremadamente importante. Para saber 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. Use el siguiente comando para eliminar cualquier archivo no deseado creado por vi u otros editores de texto de Linux.

$ 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

Verificar 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. Por este motivo, la capacidad de supervisar los registros del servidor de forma adecuada es un recurso útil para los webmasters.

Puede encontrar los archivos de registro de su servidor en /usr/local/nginx/logs directorio. Los siguientes comandos nos muestran cómo grep 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 verificarán los registros de Nginx en tiempo real 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 de FreeBSD, XEN y otros emuladores virtuales de Linux. Estos se conocen colectivamente como chroot jails 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á la detección de tipos de contenido por parte de algunos navegadores.

add_header X-Content-Type-Options nosniff;

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

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

Hay numerosas características útiles que puede encontrar en la documentación de Nginx. Sin embargo, asegúrese de entender lo que hacen antes de aplicar cualquier cosa. De lo contrario, su sitio puede enfrentar tiempo de inactividad debido a una mala configuración.

Pensamientos finales

Hay demasiadas razones para la popularidad de los servidores web Nginx. Se ha convertido en el mejor software de servidor debido a su rico conjunto de funciones 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 características y la flexibilidad que ofrece Nginx de esta manera. Es por eso que nuestros editores se han tomado la libertad de resumir estas mejores prácticas ante usted. Con suerte, pudimos satisfacer su interés y ayudarlo a aprender algo nuevo.


Linux
  1. 30 cosas que no sabías sobre el kernel de Linux

  2. Apache vs Nginx:qué servidor web debe elegir

  3. Cómo instalar el servidor web Nginx en Linux

  4. Instalar Nginx en Windows

  5. Nginx incluye en la lista blanca ciertas IP

Las 10 características principales de SSH que DEBE conocer para ser más productivo

Cómo instalar el servidor web Nginx en Ubuntu 20.04

25 comandos de Nginx que deben conocer los desarrolladores y administradores

Todo lo que necesita saber sobre el servidor Linux Ubuntu

Todo lo que necesita saber sobre el servidor Linux OpenSSH

Apache vs Nginx:¿Qué servidor web es el mejor para usted?