Prévention des attaques DDOS, pour l’application Django avec nginx reverse proxy + gunicorn

J’écris une application Django qui utilise un proxy inverse nginx + gunicorn en tant que serveur Web en production.

Je veux inclure la capacité à arrêter les attaques DDOS à partir d’une certaine adresse IP (ou d’un pool d’IP). Cela doit être au niveau nginx, plutôt que plus profond dans le code. Ai-je besoin d’un pare-feu d’application Web? Si oui, comment puis-je l’intégrer?

Le fichier nginx de mon projet situé sur les sites disponibles a:

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/consortingb/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/; } } 

Faites-moi savoir si je devrais inclure plus d’informations et quelles devraient être ces informations.

Si vous souhaitez empêcher certaines IP ou même des sous-réseaux d’accéder à votre application, ajoutez le code suivant à votre bloc de 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; 

De même, si vous n’utilisez pas REST, vous pouvez limiter les éventuels verbes HTTP en ajoutant ce qui suit à votre bloc de server :

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

Pour réduire la possibilité d’attaques par déni de service, vous pouvez limiter le nombre de requêtes possibles provenant d’un hôte unique (voir http://nginx.org/en/docs/stream/ngx_stream_limit_conn_module.html ) en ajoutant ce qui suit à NGINX nginx.conf :

 limit_conn_zone $binary_remote_addr zone=limitzone:1M; 

et les éléments suivants sur votre bloc server :

 limit_conn limitzone 20; 

Un autre paramètre utile pour nginx.conf , qui aide à atténuer le déni de service si défini correctement:

 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; 

Comme il est trop large pour les expliquer tous ici, nous vous suggérons de consulter les documents http://nginx.org/en/docs/ pour plus de détails. Bien que le choix des valeurs correctes se fasse par essais et erreurs sur une configuration particulière.

Django sert lui-même de pages d’erreur en tant que modèles, vous devez donc supprimer:

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

Ajout de access_log off; log_not_found off; access_log off; log_not_found off; à static si vous ne vous souciez pas vraiment de la journalisation est également une option:

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

Cela diminuera la fréquence des requêtes du système de fichiers, augmentant ainsi les performances.

NGINX est un excellent serveur Web et sa définition est vaste. Il est donc préférable de lire les documents (au moins la section HOW-TO) ou de trouver un article décrivant la configuration d’une situation proche de la vôtre.