Медленная Http Post атака в Nginx - PullRequest
0 голосов
/ 26 апреля 2018

Чтобы проверить уязвимость на наших серверах приложений, мы запустили сканирование Qualys. Из отчета мы обнаружили, что наши серверы приложений уязвимы для медленной атаки HTTP Post. Чтобы смягчить эту атаку, мы настроили nginx перед серверами приложений на основе отчета Qualys (https://blog.qualys.com/securitylabs/2011/11/02/how-to-protect-against-slow-http-attacks).). Согласно Qualys, если серверы поддерживают соединение открытым более 120 секунд, они считают, что сервер уязвим к медленная атака по протоколу HTTP. Несмотря на то, что время ожидания по умолчанию для 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 Ответ

0 голосов
/ 27 апреля 2018

Если у вас нет очень популярного сайта, но для начала или для нового сайта есть несколько настроек, для которых установлено слишком высокое значение. Вы всегда можете настроить его позже, после того как сайт заработает.

1) worker_rlimit_nofile 102400

Не уверен, сколько памяти имеет ваш сервер, но я думаю, что это слишком большое число, я бы предложил установить что-то вроде:

worker_rlimit_nofile 8192;

2) worker_connections 100000

Обычно конфигурирует worker_processes и worker_connections в зависимости от количества процессоров / ядер, содержимого и нагрузки. Формула имеет вид max_clients / second = worker_processes * worker_connections. Значение worker_connections не должно быть равным 100000; Значение Nginx по умолчанию составляет только 1024, если у вас есть 4 ядра ЦП, число клиентов, которое может быть обработано, будет 1024 x 4 = 4096 клиентов / секунду.

Я бы также предложил добавить multi_accept on;, который информирует каждый рабочий_процесс о принятии всех новых подключений за раз, вместо того, чтобы принимать одно новое подключение за раз.

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 на данный момент.

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;   
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...