English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Análisis detallado de la configuración de seguridad del servidor nginx

Este artículo detalla detalladamente la configuración de seguridad del servidor nginx, como se muestra a continuación:

1. Desactivar SELinux

Linux mejorado en seguridad (SELinux) es una función del núcleo de Linux que proporciona un mecanismo de protección de políticas de control de acceso que soporta.

Sin embargo, la seguridad adicional y la complejidad de uso proporcionados por SELinux no son proporcionales, y no son de gran valor

sed -i /SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config
/usr/sbin/sestatus -v # Ver estado

Dos, montaje en partición para permitir el menor privilegio

El directorio nginx del servidor se monta en una partición separada. Por ejemplo, crear una nueva partición/dev/sda5(primer partición lógica), y montado en/Asegúrate de /nginx se monta con los permisos noexec, nodev y nosetuid

Aquí está el mío/etc/Montaje en fstab/Información de nginx: LABEL=/nginx /nginx ext3 defaults,nosuid,noexec,nodev 1 2

Atención: necesitas usar fdisk y mkfs.ext3comando para crear una nueva partición.

Tres, configuración/etc/sysctl.conf para fortalecer la seguridad de Linux

Puedes editar/etc/sysctl.conf para controlar y configurar el núcleo de Linux y la configuración de red

# Evitar un ataque smurf
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Habilitar protección contra mensajes de error ICMP maliciosos
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Habilitar syncookies para la protección contra ataques de inundación de SYN
net.ipv4.tcp_syncookies = 1
# Habilitar y registrar paquetes falsificados, enrutados desde la fuente y redirigidos
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# No hay paquetes enrutados desde la fuente aquí
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Habilitar el filtrado de rutas inversas
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Asegúrese de que nadie pueda alterar las tablas de enrutamiento
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
# No actuar como enrutador
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Activar execshild
kernel.exec-shield = 1
kernel.randomize_va_space = 1
# Ajuste IPv6
net.ipv6.conf.default.router_solicitations = 0
net.ipv6.conf.default.accept_ra_rtr_pref = 0
net.ipv6.conf.default.accept_ra_pinfo = 0
net.ipv6.conf.default.accept_ra_defrtr = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.default.dad_transmits = 0
net.ipv6.conf.default.max_addresses = 1
# Optimización para el uso de puertos para LBs
# Aumentar el límite de descriptores de archivo del sistema
fs.file-max = 65535
# Permitir más PIDs (para reducir problemas de rold over); puede romper algunos programas 32768
kernel.pid_max = 65536
# Aumentar los límites de puertos IP del sistema
net.ipv4.ip_local_port_range = 2000 65000
# Aumentar el tamaño máximo del buffer TCP configurable usando setsockopt()
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
# Aumentar los límites de ajuste automático de los buffers TCP en Linux
# número mínimo, predeterminado y máximo de bytes a usar
# Establece el máximo al menos 4MB, o mayor si utilizas rutas BDP muy altas
# Tcp Windows etc
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_window_scaling = 1

Cuatro, eliminar todos los módulos de Nginx no necesarios

Necesitas compilar directamente el código fuente de Nginx para minimizar el número de módulos. Al limitar solo el acceso de los módulos al servidor web, puedes reducir al mínimo el riesgo. Puedes configurar e instalar solo los módulos que necesitas en nginx. Por ejemplo, si deseas deshabilitar los módulos SSL y autoindex, puedes ejecutar el siguiente comando:

./configure –without-http_autoindex_module –without-http_ssi_module
make && make install

Cambiar el nombre de la versión de nginx, editar el archivo/http/ngx_http_header_filter_module.c:

vim 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;
//Cambiar a
static char ngx_http_server_string[] = "Server: Ninja Web Server" CRLF;
static char ngx_http_server_full_string[] = "Server: Ninja Web Server" CRLF;

Deshabilitar la visualización del número de versión de nginx

server_tokens off

Cinco, restricciones del firewall Iptables

El siguiente script de firewall bloquea cualquier cosa excepto lo permitido:

  • proveniente de HTTP (puerto TCP)8solicitud de 0)
  • Solicitud proveniente de ICMP ping
  • ntp (puerto123) salida de solicitudes
  • smtp (puerto TCP25) salida de solicitudes

Seis, controlar la sobrecarga de buffers

Edita y configura los límites de tamaño de todos los buffers del cliente según lo siguiente:

client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
  • client_body_buffer_size 1k (por defecto8k o16k) Esta instrucción puede especificar el tamaño del buffer de la solicitud de conexión. Si la solicitud de conexión excede el valor especificado por el buffer, los conjuntos enteros o parte de estos conjuntos de entidades de solicitud intentarán escribirse en un archivo temporal.
  • client_header_buffer_size 1k-La instrucción especifica el tamaño del buffer de la cabecera de solicitud del cliente. En la mayoría de los casos, una cabecera de solicitud no es mayor que1k, sin embargo, si hay cookies grandes del cliente wap, es posible que sean mayores que 1k, Nginx le asignará un buffer más grande, este valor se puede configurar en large_client_header_buffers.
  • client_max_body_size 1k-La instrucción especifica el tamaño máximo permitido para el cuerpo de solicitud del cliente, que aparece en la cabecera de la solicitud en Content-Longitud del campo. Si la solicitud es mayor que el valor especificado, el cliente recibirá un "Request Entity Too Large" (413) error. Recuerda, el navegador no sabe cómo mostrar este error.
  • large_client_header_buffers-Especifica la cantidad y el tamaño de los buffers utilizados por algunos cabeceras de solicitud grandes del cliente. El campo de solicitud no puede ser mayor que el tamaño de un buffer, si el cliente envía una cabecera grande, nginx devolverá un error "Request URI too large" (414)
  • Del mismo modo, el campo más largo de la cabecera de la solicitud no puede ser mayor que un buffer, de lo contrario, el servidor devolverá "Bad request" (400). El buffer solo se separa cuando es necesario. El tamaño predeterminado de un buffer es el tamaño del archivo de paginación del sistema operativo, que suele ser4k o8k, si una solicitud de conexión finaliza cambiando el estado a keep- alive, el buffer ocupado será liberado.

También necesitas controlar el tiempo de espera para mejorar el rendimiento del servidor y desconectar la conexión con el cliente. Edita según lo siguiente:

client_body_timeout  10;
client_header_timeout 10;
keepalive_timeout   5 5;
send_timeout     10;
  • client_body_timeout 10;-La instrucción especifica el tiempo de espera para leer el cuerpo de la solicitud. Aquí, el tiempo de espera se refiere a que un cuerpo de solicitud no ha entrado en la etapa de lectura, si la conexión excede este tiempo y el cliente no responde, Nginx devolverá un "Request time out" (408) error.
  • client_header_timeout 10;-La instrucción especifica el tiempo de espera para leer el título de la cabecera de solicitud del cliente. Aquí, el tiempo de espera se refiere a que una cabecera de solicitud no ha entrado en la etapa de lectura, si la conexión excede este tiempo y el cliente no responde, Nginx devolverá un "Request time out" (408) error.
  • keepalive_timeout 5 5; – El primer valor del parámetro especifica el tiempo de espera del largo conexión entre el cliente y el servidor, si pasa este tiempo, el servidor cerrará la conexión. El segundo valor (opcional) especifica el encabezado de respuesta Keep-Alive: timeout=time, el valor de time puede hacer que algunos navegadores sepan cuándo cerrar la conexión, para que el servidor no tenga que cerrarla repetidamente, si no se especifica este parámetro, nginx no enviará Keep-Alive información. (Pero esto no significa cómo mantener una conexión “Keep-Los valores de los parámetros de (Alive)pueden ser diferentes.
  • send_timeout 10; La instrucción especifica el tiempo de espera después de enviar la respuesta al cliente, Timeout es el tiempo después del cual no se ha completado el estado completo established, solo se han completado dos manos, si pasa este tiempo y el cliente no responde, nginx cerrará la conexión.

Siete, controlar las conexiones concurrentes

Puedes usar el módulo NginxHttpLimitZone para limitar las sesiones específicas o el caso especial de una dirección IP específica en términos de conexiones concurrentes. Edita nginx.conf:

### La directiva describe la zona en la que se almacenan los estados de sesión, es decir, se almacenan en slimits. ###
### 1m pueden manejar 32000 sesiones con 32 bytes/sesión, configurada a 5m x 32000 sesión ###
limit_zone slimits $binary_remote_addr 5m;
### Controlar el número máximo de conexiones simultáneas para una sesión, es decir, ###
### Restricción de la cantidad de conexiones desde una única dirección IP ###
limit_conn slimits 5;

Lo anterior indica que no se permite que cada cliente remoto abra más conexiones simultáneas que5un.

Ocho, solo permitir el acceso a nuestros dominios

Si el robot solo escanea aleatoriamente todos los dominios del servidor, rechaza esta solicitud. Debes permitir las solicitudes de dominios virtuales configurados o de proxy inverso. No debes usar la dirección IP para rechazar.

if ($host !~ ^(test.in|www.test.in|images.test.in)$ ) {
  return 444;
}

九、限制可用的请求方法

GET和POST是互联网上最常用的方法。Web服务器的方法被定义在RFC 2616。如果Web服务器不要求启用所有可用的方法,它们应该被禁用。下面的指令将过滤只允许GET,HEAD和POST方法:

## 只允许这些请求方法 ##
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
  return 444;
}
## 不接受DELETE, SEARCH和其他方法 ##

更多关于HTTP方法的介绍

  • GET方法是用来请求,如文件http://www.moqifei.com/index.php.
  • HEAD方法是一样的,除非该服务器的GET请求无法返回消息体。
  • POST方法可能涉及到很多东西,如存储或更新数据,或订购产品,或通过提交表单发送电子邮件。这通常是使用服务器端处理,如PHP,Perl和Python等脚本。如果你要上传的文件和在服务器处理数据,你必须使用这个方法。

十、如何拒绝一些User-代理?

你可以很容易地阻止User-代理,如扫描器,机器人以及滥用你服务器的垃圾邮件发送者。

## 阻止下载代理 ##
if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
  return 403;
}

阻止Soso和有道的机器人:

## 阻止一些机器人 ##
if ($http_user_agent ~* Sosospider|YodaoBot) {
  return 403;
}

十一、防止图片盗链

图片或HTML盗链的意思是有人直接使用你网站的图片地址来显示在他的网站上。最终的结果,你需要支付额外的宽带费用。这通常发生在论坛和博客。我强烈建议您封锁,并阻止盗链行为。

# 阻止深度链接或热链接
location /imagenes/ {
  valid_referers none blocked www.example.com example.com;
  if ($invalid_referer) {}}
    return  403;
  }
}

例如:重定向并显示指定图片

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

Doce, Restricciones de Directorios

Puedes configurar los permisos de acceso para los directorios específicos. Todos los directorios del sitio web deben configurarse uno por uno, permitiendo solo el acceso a los directorios necesarios.

Limitar el acceso mediante la dirección IP

Puedes limitar el acceso a los directorios mediante la dirección IP/admin/:

location /documentos/ {
  ## Bloquear una estación de trabajo
  deny  192.168.1.1;
  ## Permitir a cualquier persona 192.168.1.0/24
  permitir  192.168.1.0/24;
  ## Eliminar el resto del mundo
  deny all;
}

Para proteger los directorios con contraseña, primero cree el archivo de contraseñas y agregue al usuario "user"

mkdir /usr/local/nginx/conf/.htpasswd/
htpasswd -c /usr/local/nginx/conf/.htpasswd/passwd user

Edite el archivo nginx.conf y agregue los directorios que necesitan protección

### Protección de Contraseña /personal-imagenes/ y /delta/ directorios ###
location ~ /(personal-imagenes/.*|delta/.*) {
  auth_basic "Restringido";
  auth_basic_user_file  /usr/local/nginx/conf/.htpasswd/passwd;
}

Una vez que se ha generado el archivo de contraseñas, también puedes usar los siguientes comandos para agregar usuarios con acceso permitido

htpasswd -s /usr/local/nginx/conf/.htpasswd/passwd userName

Trece, Configuración SSL de Nginx

HTTP es un protocolo de texto puro, es abierto y pasivo en la monitorización. Deberías usar SSL para encriptar el contenido de tus usuarios.
Para crear un certificado SSL, ejecute los siguientes comandos:

cd /usr/local/nginx/conf
openssl genrsa -des3 -out server.key 1024
openssl req -nuevo -clave server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -solicitud -días 365 -in server.csr -signkey server.key -out server.crt

Edite el archivo nginx.conf y actualícelo según lo siguiente:

server {
  server_name example.com;
  escuchar 443;
  ssl activado;
  ssl_certificate /usr/local/nginx/conf/server.crt;
  ssl_certificate_key /usr/local/nginx/conf/server.key;
  access_log /usr/local/nginx/logs/ssl.access.log;
  error_log /usr/local/nginx/logs/ssl.error.log;
}

Catorce, recomendaciones de seguridad Nginx y PHP
PHP es uno de los lenguajes de script de servidor más populares. Edite como se muestra a continuación/etc/php.ini archivo:

# No permitir funciones peligrosas
disable_functions = phpinfo, system, mail, exec
## Intentar limitar recursos ##
# Tiempo máximo de ejecución de cada script, en segundos
max_execution_time = 30
# Tiempo máximo permitido para que cada script gaste en analizar datos de solicitud
max_input_time = 60
# Cantidad máxima de memoria que puede consumir un script (8MB)
memory_limit = 8M
# Tamaño máximo de datos POST que PHP aceptará.
post_max_size = 8M
# Permitir subidas de archivos HTTP.
file_uploads = Apagado
# Tamaño máximo permitido para archivos subidos.
upload_max_filesize = 2M
# No exponer mensajes de error de PHP a usuarios externos
display_errors = Apagado
# Activar modo seguro
safe_mode = Activo
# Solo permitir acceso a ejecutables en directorio aislado
safe_mode_exec_dir = php-requerido-ejecutables-ruta
# Limitar el acceso externo a las variables de entorno de PHP
safe_mode_allowed_env_vars = PHP_
# Restringir la filtración de información de PHP
expose_php = Off
# Registrar todos los errores
log_errors = On
# No registrar variables globales para datos de entrada
register_globals = Off
# Minimizar el tamaño permitido de los posts de PHP
post_max_size = 1K
# Asegurar que PHP redirija adecuadamente
cgi.force_redirect = 0
# No permitir la carga de archivos salvo que sea necesario
# Habilitar el modo seguro de SQL
sql.safe_mode = On
# Evitar la apertura de archivos remotos
allow_url_fopen = Off

Quince, si es posible, ejecuta Nginx en una prisión chroot

Coloca a nginx en una prisión chroot para reducir la posibilidad de acceso ilegal a otros directorios. Puedes usar el chroot tradicional que se instala con nginx. Si es posible, utiliza el concepto de contenedores de virtualización como FreeBSD jails, Xen, OpenVZ.

Dieciséis, limitar el número de conexiones de cada IP en el nivel de firewall

El servidor de red debe monitorear las conexiones y los límites de conexiones por segundo. PF y Iptables pueden bloquear el acceso de los usuarios finales antes de que ingresen a tu servidor nginx.
Linux Iptables: limitar el número de conexiones Nginx por vez

El siguiente ejemplo bloqueará el acceso desde una IP6más de15puertos de conexión80 del número de conexiones.

/sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –set
/sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –update –seconds 60 –hitcount 15 -j DROP
service iptables save

Configura el número máximo de conexiones permitidas según tu situación específica.

Diecisiete, configurar la protección del sistema operativo del servidor web

Como se ha introducido anteriormente, la activación de SELinux. La configuración correcta/Permisos del directorio raíz de la documentación de nginx. Nginx se ejecuta como el usuario nginx. Pero el directorio raíz (/nginx o/usr /local/nginx/html) no debe establecerse como perteneciente al usuario nginx o como editable por el usuario nginx. Para encontrar archivos con permisos de error, puede usar el siguiente comando:

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

Asegúrese de cambiar la propiedad a root u otro usuario, un ejemplo típico de configuración de permisos /usr/local/nginx/html/

ls -l /usr/local/nginx/html/

Ejemplo de salida:

-rw-r–r– 1 root root 925 Ene 3 00:50 error4xx.html
-rw-r–r– 1 root root 52 Ene 3 10:00 error5xx.html
-rw-r–r– 1 root root 134 Ene 3 00:52 index.html

Debes eliminar los archivos de respaldo creados por vi u otro editor de texto:

find /nginx -nombre '.63;* -no -nombre .ht* -o -nombre '*~' -o -nombre '*.bak* -o -nombre '*.old*
find /usr/local/nginx/html/ -nombre '.63;* -no -nombre .ht* -o -nombre '*~' -o -nombre '*.bak* -o -nombre '*.old*

A través del comando find de-opción delete para eliminar estos archivos.

Diecinueve, Restricción de conexión de salida de Nginx

Los hackers utilizarán herramientas como wget para descargar archivos locales de su servidor. Use Iptables para bloquear conexiones salientes del usuario nginx. El módulo ipt_owner intenta coincidir con el creador de paquetes de datos locales generados. En el siguiente ejemplo, solo se permite al usuario user usarlos en el exterior80 conexiones.

/sbin/iptables -A OUTPUT -o eth0 -m owner –uid-owner vivek -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT

A través de la configuración anterior, su servidor nginx ya es muy seguro y puede publicar páginas web. Sin embargo,还应根据您的网站程序查找更多的安全设置资料。例如,wordpress或第三方程序。

Aviso: Este contenido se publica en línea, el derecho de autor pertenece al propietario original, el contenido se carga de manera autónoma por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial manual y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w3Declaración: El contenido de este artículo se obtiene de la red, el derecho de autor pertenece al propietario original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial manual y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w

Te gustará también