http - Nginx 中的慢速 Http Post 攻击

标签 http security nginx nginx-reverse-proxy qualys

为了检查我们应用服务器中的漏洞,我们运行了 Qualys 扫描。从报告中我们发现我们的应用程序服务器容易受到慢速 HTTP Post 攻击。为了减轻这种攻击,我们根据 Qualys 报告 (https://blog.qualys.com/securitylabs/2011/11/02/how-to-protect-against-slow-http-attacks) 在应用程序服务器前面配置了 nginx。根据 Qualys 的说法,如果服务器保持连接打开超过 120 秒,他们认为该服务器容易受到慢速 HTTP Post 攻击。尽管 nginx 默认超时为 60 秒,但它在我们的应用服务器中保持连接超过 2 分钟。我们还检查了 nginx 连接状态,它使连接处于写入状态超过 2 分钟。

请帮助我们配置 nginx 以防止慢速 HTTP Post 攻击。

当前 nginx 配置

user nginx;
worker_processes auto; 
worker_rlimit_nofile 102400; 

events {
    worker_connections 100000; 
}

access_log off;  
autoindex off;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=2r/s;   
limit_conn_zone $binary_remote_addr zone=limitzone:10m;  
limit_conn_status 403;   
limit_req_status 403;
sendfile on; 
tcp_nopush on; 
tcp_nodelay on; 
keepalive_timeout 20 15; 
client_body_timeout 5s;  
client_header_timeout 5s;  
send_timeout 2;  
reset_timedout_connection on;   
types_hash_max_size 2048;  
server_tokens off;
client_body_buffer_size 100K;  
client_header_buffer_size 1k;  
client_max_body_size 100k;  
large_client_header_buffers 2 1k;

include /etc/nginx/mime.types;
default_type application/octet-stream;

upstream backend {   
    server 127.0.0.1:8080 max_conns=150;   
}

server {  
    listen 443 ssl http2 default_server;
    \# listen [::]:443 ssl http2 default_server;
    server_name *******;
    underscores_in_headers on;

    if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE)$ ) {
        return 444;
    }

    *** ssl configuration ***
        .....

    location / {  
        limit_conn limitzone 20; 
        limit_req zone=req_limit_per_ip burst=5 nodelay; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   
        proxy_cookie_path / "/; HTTPOnly; Secure; SameSite=strict";   
        proxy_set_header X-Real-IP $remote_addr;  
        proxy_set_header X-Forwarded-Proto https; 
        proxy_pass http://backend;
    }
}

最佳答案

除非您有一个非常受欢迎的站点,但对于刚开始的站点或新站点,有一些设置值设置得太高。您可以随时在网站上线后对其进行调整。

1) worker_rlimit_nofile 102400

不确定您的服务器有多少内存,但我认为这是一个太大的数字,我建议设置为类似:

worker_rlimit_nofile 8192;

2) worker_connections 100000

一般是根据CPU/核数、内容和负载来配置worker_processes和worker_connections。公式为 max_clients/second = worker_processes * worker_connections。 worker_connections值不必为 100000;默认 Nginx 值仅在 1024 ,如果你有 4 个 CPU 内核,它可以处理的客户端数量将是 1024 x 4 = 4096 个客户端/秒。

我还建议添加 multi_accept on;它通知每个 worker_process 一次接受所有新连接,而不是一次接受一个新连接。

events {
    worker_connections 1024;
    multi_accept on;
}

3) 客户端正文和头部大小

防止慢速 http 攻击的建议之一是将 client_max_body_size 设置得相当小。 , client_body_buffer_size , client_header_buffer_size , large_client_header_buffers ,并在必要时增加。但我认为您可能会将这些指令设置得太低,以至于会影响服务器的性能,我建议只使用 Nginx http core module 推荐的默认值。现在。

client_header_buffer_size 1k;
client_body_buffer_size 16k;    # 8k for 32-bit or 16k for 64-bit platform
client_max_body_size 1m;
large_client_header_buffers 4 8k;

顺便说一句,作为最佳实践,所有基本设置都应包含在 http 中指令,以便它适用于所有 http 流量。我还建议您设置 access_log on因为在服务器部署的早期阶段更好地了解流量(和攻击)非常有用。

http {
    access_log off;  
    autoindex off;

    # other settings

    .....

    upstream backend {   
        server 127.0.0.1:8080 max_conns=150;   
    }
}

关于http - Nginx 中的慢速 Http Post 攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50042299/

相关文章:

http - 黑莓http连接读取网页内容。有些标点符号读错了

php - 为什么 display_errors 会改变 HTTP 状态码?

api - 将 FOSOAuthServerBundle 与 FOSUserBundle 集成

php - 将 if/else PHP 重定向添加到 Wordpress 中的页面模板

php - 在 nginx 上安装 PHP7.2 时出现 502 Bad Gateway

python - 为什么 python 字符串 split() 不拆分

api - 保护使用 Play Framework 开发的 REST API

windows - 锁定项目

django - NGinx 和 Django,提供大文件 (3gb+)

apache - 具有多个域的服务器上的 Nginx 负载均衡