2016-02-02 3 views
3

Я пишу приложение Django, в котором используется обратный прокси-сервер nginx + gunicorn в качестве веб-сервера на производстве.Предотвращение атаки DDOS, для приложения Django с обратным прокси-сервером nginx + gunicorn

Я хочу включить возможность остановки DDOS-атак с определенного IP-адреса (или пула IP-адресов). Это должно быть на уровне nginx, а не на любом более глубоком в коде. Нужен ли мне брандмауэр веб-приложений? Если да, то как мне его интегрировать.

Nginx файл моего проекта находится на сайтах-доступных имеет:

server { 
    listen 80; 
    charset utf-8; 
    underscores_in_headers on; 
    location = /favicon.ico { access_log off; log_not_found off; } 

    location /static/ { 

     root /home/sarahm/djangoproject/djangoapp; 
    } 

    location /static/admin { 

     root /home/sarahm/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/contrib/admin/static/; 
    } 

    location/{ 
     proxy_pass_request_headers on; 
     proxy_buffering on; 
     proxy_buffers 8 24k; 
     proxy_buffer_size 2k; 
     include proxy_params; 
     proxy_pass   http://unix:/home/sarahm/djangoproject/djangoapp/djangoapp.sock; 
    } 


    error_page 500 502 503 504 /500.html; 
    location = /500.html { 
     root /home/sarahm/djangoproject/djangoapp/templates/; 
    } 
} 

Позвольте мне знать, если я должен включать в себя больше информации, и то, что эта информация должна быть.

ответ

5

Если вы хотите, чтобы предотвратить определенный IP-адрес или даже подсеть из экранного приложения, добавьте следующий код в ваш server блок:

#Specify adresses that are not allowed to access your server 
    deny 192.168.1.1/24; 
    deny 192.168.2.1/24; 
    allow all; 

Кроме того, если вы не использованияКонтактную REST, то вы можете захотеть ограничить возможные HTTP глаголы, добавляя следующие строки в server блока:

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

чтобы уменьшить возможность DoS атаки, вы можете захотеть ограничить число возможных запросов от одного хоста (см http://nginx.org/en/docs/stream/ngx_stream_limit_conn_module.html), путем добавления т он следующее NGINX nginx.conf:

limit_conn_zone $binary_remote_addr zone=limitzone:1M; 

и до Вашего server блока:

limit_conn limitzone 20; 

Некоторые другие полезные настройки для nginx.conf, которые помогают смягчить DoS, если установлено правильно:

server_tokens off; 
autoindex off; 
sendfile on; 
tcp_nopush on; 
tcp_nodelay on; 
client_body_timeout 10; 
client_header_timeout 10; 
send_timeout 10; 
keepalive_timeout 20 15; 

open_file_cache max=5000 inactive=20s; 
open_file_cache_valid 30s; 
open_file_cache_min_uses 2; 
open_file_cache_errors on; 

Поскольку он слишком широк, чтобы объяснить все это, предложите более подробно ознакомиться с документами http://nginx.org/en/docs/. Хотя выбор правильных значений достигается путем проб и ошибок при конкретной настройке.

Джанго служит страницы ошибок себя как шаблонов, так что вы должны удалить:

error_page 500 502 503 504 /500.html; 
location = /500.html { 
    root /home/sarahm/djangoproject/djangoapp/templates/; 

Добавление access_log off; log_not_found off; к static, если вы на самом деле не заботиться о лесозаготовок также вариант:

location /static/ { 
    access_log off; 
    log_not_found off; 
    root /home/sarahm/djangoproject/djangoapp; 
} 

это уменьшит частоту запросов файловой системы, тем самым повысив производительность.

NGINX - отличный веб-сервер, и это широкая тема, поэтому лучше всего прочитать документы (по крайней мере, раздел HOW-TO) или найти статью, описывающую настройку ситуации, близкой к вашей.

+0

Спасибо, что начал меня, Никита. Я прочитаю документы, как вы посоветовали, и отметьте настройки, которые вы разместили. –

+0

Для полноты вам также есть что добавить к вашему ответу в отношении Naxsi (https://github.com/nbs-system/naxsi)? Или это не относится к DDOS-атаке? –

+0

Прошу прощения, у меня нет опыта с Накси, чтобы рассказать об этом.В общем, я бы сказал, что ваше приложение, если только оно не является действительно особенным, не будет интересовать «плохих» людей, чтобы совершить нападение, если оно не станет известным или не повлияет на простоту (конкуренцию) других людей. Основная причина для DDoS заключается в том, чтобы не допустить, чтобы владелец сайта делал бизнес, который оплачивается нечестной конкуренцией, или чтобы заставить владельца сайта платить выкуп, потому что при атаке DDoS владелец потеряет деньги (т. Е. Электронная торговля). – Nikita