English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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:
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;
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;
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方法的介绍
十、如何拒绝一些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