Contacts

Protection Nginx des attaques DDO. Protection DDOC avec NGinx Création d'une liste autorisée d'adresses IP

Combattre avec les attaques DDO - Le travail est non seulement difficile, mais aussi fascinant. Il n'est pas surprenant que chaque sysadmin essaie d'abord d'organiser la défense sur elle-même - d'autant plus que cela reste possible.

Nous avons décidé de vous aider avec cela difficile et de publier des conseils courts, triviaux et universels sur la protection de votre site d'attaques. Les recettes réduites ne vous aideront pas à faire face à aucune attaque, mais de la plupart des dangers qu'ils seront sauvés.

Ingrédients appropriés

La dure vérité est que de nombreux sites peuvent mettre les personnes qui souhaitent utiliser l'attaque de Ralonloris, tuant étroitement Apache ou régler la soi-disant Syn Flood utilisant une ferme de serveurs virtuels collectée par minute dans le nuage Amazon EC2. Tous nos futurs conseils de protection DDO sont basés sur les conditions importantes suivantes.

1. Refuser Windows Server

La pratique suggère que le site qui fonctionne sur Windows (2003 ou 2008 est), dans le cas de DDOS est condamné. La raison de la défaillance réside dans Windows Network Stack: lorsque les connexions deviennent beaucoup, le serveur commence certainement à répondre mal. Nous ne savons pas pourquoi Windows Server travaille dans de telles situations si réputées, mais ils l'ont rencontrés plus d'une fois et non deux. Pour cette raison, cet article ira sur les moyens de protection contre les attaques DDO dans le cas où le serveur tourne sur Linux. Si vous êtes un propriétaire heureux avec un noyau contemporain (à partir de 2,6), les utilitaires IPTABLES et IPSET seront utilisés comme outils à outils principaux (pour ajouter rapidement des adresses IP), avec laquelle vous pouvez interdire rapidement des robots. Une autre clé du succès est une pile de réseau bien cuit, que nous allons également parler plus loin.

2. Partie avec Apache

La deuxième condition importante est le refus d'Apache. Si vous n'êtes même pas une heure, cela vaut la peine Apache, puis au moins mettre un proxy de mise en cache devant elle - Nginx ou Lightpd. Apache "Il est extrêmement difficile de donner des fichiers et, encore pire, c'est sur le niveau fondamental (c'est-à-dire de manière irrévérence vulnérable pour une attaque de ralentis dangereuse, ce qui vous permet de liquider le serveur presque à partir d'un téléphone portable. Pour combattre divers Types de Slowloris, Apache Utilisateurs proposés par le patch First Anti-Slowloris.Diff, puis mod_noloris, puis mod_antiloris, mod_limitipconn, mod_reqtimeout ... mais si vous voulez bien dormir la nuit, il est plus facile de prendre un serveur HTTP, invulnérable Pour ralentir au niveau de l'architecture de code. Par conséquent, toutes nos autres recettes sont basées sur l'hypothèse, que Nginx est utilisé à l'avant.

Se battre de DDO.

Et si DDO est venu? La technique traditionnelle de l'autodéfense est de lire le fichier journal du serveur HTTP, d'écrire un modèle pour Grep (fabrication de robots de bots) et interdire tout le monde qui tombe sous elle. Cette technique fonctionnera ... Si vous avez de la chance. Batnets sont deux types, les deux sont dangereux, mais de différentes manières. On vient entièrement sur le site instantanément, l'autre est progressivement. Le premier tue tout et immédiatement, mais les journaux apparaissent complètement dans les journaux, et si vous les interdisez et émerveiller toutes les adresses IP, vous êtes un gagnant. Le deuxième botnet pose le site doucement et soigneusement, mais il devra l'interdire, peut-être pendant la journée. Il est important de comprendre tout administrateur: s'il est prévu de combattre Grep, vous devez être prêt à consacrer à la lutte contre l'attaque quelques jours. Vous trouverez ci-dessous les conseils sur les endroits où vous pouvez mettre des pailles à l'avance afin que ce ne soit pas si douloureux de tomber.

3. Utilisez le module Testcooke

Peut-être la recette la plus importante, efficace et opérationnelle de cet article. Si le DDO est livré sur votre site, le module Testcookie-nginx développé par le @kyprizel Coexler peut devenir le moyen le plus efficace. Une idée est simple. Le plus souvent, les bots qui implémentent des inondations HTTP sont plutôt stupides et ne disposent pas de biscuits HTTP et de mécanismes de redirection. Parfois plus avancé - telle peut utiliser des cookies et des redirections de processus, mais presque jamais Dos-Bot porte un moteur JavaScript à part entière (bien qu'il soit de plus en plus souvent et plus souvent). Testcookie-Nginx fonctionne comme filtre rapide entre les robots et le backend lors de l'attaque L7 DDO, vous permettant de couper les requêtes des déchets. Qu'est-ce qui est inclus dans ces chèques? Si le client est capable d'exécuter HTTP Redirect, si JavaScript prend en charge s'il s'agit du navigateur pour lequel il distingue (puisque JavaScript est différent de partout et si le client dit qu'il, disons Firefox, alors nous pouvons le vérifier). Le chèque est mis en œuvre avec des cookies en utilisant différentes méthodes:

  • "SET-Cookie" + Redirection avec 301 HTTP Emplacement;
  • "Set-Cookie" + Redirection avec HTML Meta Rafraîchir;
  • un modèle arbitraire, et vous pouvez utiliser JavaScript.

Pour éviter l'analyse automatique, les cookies de test peuvent être cryptés à l'aide d'AES-128 et sont ensuite déchiffrés sur le côté du client JavaScript. Dans la nouvelle version du module, il a été possible d'installer des cuisses via Flash, ce qui vous permet également de couper efficacement des robots (quel flash n'est généralement pas pris en charge), mais il bloque également l'accès à de nombreux utilisateurs légitimes (en fait tous les appareils mobiles. ). Il est à noter que commence à utiliser Testcookie-Nginx extrêmement simple. Le développeur, en particulier, conduit plusieurs exemples compréhensibles d'utilisation (pour différents cas d'attaque) avec des échantillons de configuration pour NGinx.

En plus des avantages, TestCookie a des inconvénients:

  • coupe tous les robots, y compris Googlebot. Si vous envisagez de quitter Testcooke de manière continue, assurez-vous de ne pas disparaître des résultats de la recherche;
  • crée des problèmes avec les utilisateurs avec des liens de navigateurs, W3M et eux comme;
  • ne sauvegarde pas de bots équipés d'un moteur de navigateur à part entière avec JavaScript.

En bref, Testcookie_Module n'est pas universel. Mais d'un certain nombre de choses, telles que, par exemple, des outils primitifs pour Java et C #, cela aide. Donc, vous coupez une partie de la menace.

4. Code 444.

Le but des DdoS'ers devient souvent la partie la plus intensive de ressources du site. Un exemple typique est une recherche qui effectue des requêtes complexes de la base de données. Naturellement, les attaquants peuvent en tirer parti, après avoir facturé plusieurs dizaines de milliers de demandes au moteur de recherche à la fois. Ce que nous pouvons faire? Temporairement désactiver la recherche. Laissez les clients ne pourra pas rechercher les informations nécessaires par des moyens intégrés, mais tout le site principal restera en état de fonctionnement jusqu'à ce que vous trouviez la racine de tous les problèmes. NGinx prend en charge le code non standard 444, qui vous permet de fermer simplement la connexion et de ne rien donner en réponse:

Emplacement / Recherche (Retour 444;)

Ainsi, il est possible, par exemple, d'implémenter rapidement un filtrage sur l'URL. Si vous êtes convaincu que les demandes de localisation / recherche ne sont que des bots (par exemple, votre confiance est basée sur le fait qu'il n'y a pas de partition / recherche sur votre site), vous pouvez installer le package de l'ipiCet et l'interdiction des robots avec une coque simple. scénario:

IPSET -N Ban IPhash Quan -F Access.log | En ligne de lecture; Faire écho "$ ligne" | \\ coupe -d "" "-f3 | coupé -d" "-f2 | grep -q 444 && ipse-bin" $ (l %% *) "; fait

Si le format de fichier journal est non standard (non combo) ou s'il est nécessaire d'interdire d'autres signes que l'état de la réponse, il peut être nécessaire de remplacer la coupe régulière.

5. Banya par Geod

Le code de réponse non standard 444 peut également être utile pour l'interdiction opérationnelle des clients sur la géo-acquisition. Vous pouvez difficilement limiter chaque pays qui sont gênants. Disons, à peine dans la boutique en ligne des caméras de Rostov-on-Don, il existe de nombreux utilisateurs en Égypte. Ce n'est pas un très bon moyen (dites simplement - dégoûtant), car les données GEOIP sont inexactes et que Rostovs volent parfois en Égypte pour se reposer. Mais si vous n'avez rien à perdre, suivez les instructions:

  1. Connectez-vous au module GeoIP Nginx (wiki.nginx.org/httpgeoipmodule).
  2. Afficher les informations de la géotherme dans le journal d'accès.
  3. En outre, modifier le script shell ci-dessus, Progrepet Accesslog NGinx et ajouter des signes géographiques Sfatelated de clients dans une interdiction.

Si, par exemple, des bots pour la plupart venaient de la Chine, cela peut aider.

6. Réseau de neurones (POC)

Enfin, vous pouvez répéter l'expérience du jeu @SavetetherBtz, qui a pris le réseau neuronal pybrain, en portait la connexion et a analysé les demandes (Habrahabr.ru/post/136237). Méthode fonctionne, bien que non universelle :). Mais si vous connaissez vraiment l'intérieur de votre site - et vous, en tant qu'administrateur système, devriez-vous, vous avez alors une chance que, dans les situations les plus tragiques, une boîte à outils basée sur des réseaux de neurones, l'apprentissage et la collectionnée à l'avance vous aidera à vous aider . Dans ce cas, il est extrêmement utile d'avoir accès.Log avant le début des DDO "A, car il décrit près de 100% des clients légitimes, et donc un excellent jeu de données pour former un réseau neuronal. De plus, les yeux dans le barreau. ne sont pas toujours visibles.

Diagnostic du problème

Le site ne fonctionne pas - pourquoi? Son ddoSaim ou s'agit-il d'un bug de jag non remarqué par un programmeur? Ça ne fait rien. Ne cherchez pas une réponse à cette question. Si vous pensez que votre site peut attaquer, contactez les entreprises qui offrent une protection contre les attaques - un certain nombre de services anti-DDO pour le premier jour après la connexion gratuite - et ne gaspillent pas plus de temps à la recherche de symptômes. Concentrez-vous sur le problème. Si le site fonctionne lentement ou ne s'ouvre pas du tout, cela signifie qu'il n'a pas quelque chose dans l'ordre de la performance et - peu importe si l'attaque DDoS va ou non, - vous, en tant que professionnel, est obligé de comprendre ce qui a causé il. Nous avons assisté à plusieurs reprises sur la manière dont l'entreprise, éprouvant des difficultés avec le travail de votre site en raison de l'attaque DDO, au lieu de trouver des points faibles dans le moteur du site, essaya d'envoyer des déclarations au ministère des Affaires intérieures à trouver et à punir les attaquants. Ne pas autoriser de telles erreurs. La recherche de cybercriminels est un processus difficile et à long terme compliqué par la structure et les principes d'Internet, et le problème du travail du site doit être résolu rapidement. Faire des spécialistes techniques pour trouver la cause de l'automne de la performance du site. L'application sera en mesure d'écrire des avocats.

7. Utilisez le profileur et le débogueur

Pour la plate-forme de création de site Web la plus courante - PHP + MySQL - Un goulot d'étranglement peut être signé à l'aide des outils suivants:

  • xdebug Profiler montrera quels appels l'application dépense le plus de temps;
  • le débogueur intégré APD et la sortie de débogage dans le journal des erreurs aideront à déterminer quel code effectue ces défis;
  • dans la plupart des cas, le chien est enterré dans la complexité et le poids des demandes de la base de données. Ici vous aidera à expliquer la base de données SQL intégrée dans le moteur.

Si le site est menti par hasard et que vous ne perdrez rien, éteignez le réseau, regardez les journaux, essayez de les perdre. Sinon, passez à travers les pages, regardez la base.

Un exemple est fourni pour PHP, mais l'idée est valable pour n'importe quelle plate-forme. Les logiciels de développement de développeurs sur tout langage de programmation devraient pouvoir appliquer rapidement le débogueur et le profileur. Pratique à l'avance!

8. Analyser les erreurs

Analyser le volume de la circulation, le temps de réponse du serveur, le nombre d'erreurs. Pour cela, voir Journaux. Dans NGinx, le temps de réponse du serveur est fixé dans le journal avec deux variables: Demande_Time et UPStream_Response_Time. Le premier est le temps plein d'exécution de la requête, y compris les retards de réseau entre l'utilisateur et le serveur; La seconde rapporte à quel point le backend (Apache, PHP_FPM, UWSGI ...) a servi de demande. Upstream_Response_Time Valeur est extrêmement importante pour les sites avec un grand nombre de contenu dynamique et une communication active avec la base de données, ils ne peuvent pas être négligés. Vous pouvez utiliser une telle config en tant que format de journal:

Log_format xakep_log "$ Remote_addr - $ Remote_user [$ TIME_LOCAL]" "" "$ demande" $ US STATUS $ BODY_BERS_SENT "$ http_ferer \\ $ upstream_response_gent";

Ceci est un format combiné avec les champs de chronométrage ajoutés.

9. Suivre le nombre de demandes par seconde

Regardez également le nombre de demandes par seconde. Dans le cas de Nginx, vous pouvez estimer grossièrement cette valeur de la commande suivante shell (la variable Access_log contient le chemin d'accès au journal de requête NGinx dans le format combiné):

Echo $ (($ (fgrep -c »$ (env lc_all \u003d c date [Email protégé]$ (($ (Date \\ +% s) -60)) +% D /% B /% Y:% h:% m) "" $ Access_log ") / 60))

Par rapport à la normale pour cette période, le nombre de demandes par seconde peut tomber comme automne et croissance. Ils grandissent dans le cas où un grand botnet est venu, et tombe, si le botnet victorieux a enveloppé le site, ce qui la rend complètement inaccessible aux utilisateurs légitimes et qu'il ne demande en même temps pas de statique et les utilisateurs légitimes sont demandés. La chute des requêtes est observée juste à cause de la statique. Mais, d'une manière ou d'une autre, nous parlons de graves changements d'indicateurs. Lorsque cela se produit soudainement - pendant que vous essayez de résoudre le problème seul et si vous ne le voyez pas immédiatement dans le journal, il est préférable de vérifier rapidement le moteur et de contacter les spécialistes en parallèle.

10. N'oubliez pas de TCPDump

Beaucoup de gens oublient que TCPDump est un outil de diagnostic génial. Je vais donner quelques exemples. En décembre 2011, un bogue dans le noyau Linux a été découvert lorsqu'il a ouvert une connexion TCP lorsque les indicateurs SYN et TCP segment TCP étaient affichés. Le premier Bageptort a envoyé l'administrateur système de Russie, dont la ressource a été attaquée par cette méthode, les attaquants ont appris les vulnérabilités plus tôt que le monde entier. Il est évident pour lui qu'un tel diagnostic ait aidé. Un autre exemple: Nginx en a une très belle propriété - il n'écrit que dans le journal qu'après une demande complète est parfaitement comprise. Il y a des situations lorsque le site ment, rien ne fonctionne et il n'y a rien dans les journaux. Tous parce que toutes les demandes qui téléchargent actuellement le serveur ne sont pas encore remplies. TCPDump aidera ici.

Il est si bon que j'ai conseillé aux gens n'utilisent pas de protocoles binaires avant de ne pas conquérir que tout est en ordre, - parce que les protocoles de texte de la dette tcpdump "OM sont faciles et binaires - non. Cependant, le renifleur est bon comme un moyen de Diagnostic - comme moyen de maintenir la production »et il est terrible. Cela peut facilement perdre plusieurs paquets à la fois et vous gâter l'histoire de l'utilisateur. Il est pratique de regarder sa conclusion et elle sera utile pour les diagnostics manuels et une interdiction, mais essayez de ne rien fonder de manière critique. Un autre moyen préféré de «fixer les demandes» - NGREP - en général, par défaut, il essaie de demander dans la zone de deux gigaoctets de mémoire inadaptée et ne commence alors à réduire ses exigences.

11. Attaque ou non?

Comment distinguer une attaque DDO, par exemple, de l'effet d'une campagne publicitaire? Cette question peut sembler drôle, mais ce sujet n'est pas moins compliqué. Il y a des cas assez curieux. Dans certains bons gars, quand ils ont vissé la mise en cache bien vissée, le site tourne pendant quelques jours. Il s'est avéré que, dans quelques mois, ce site est inaperçu par les données de certains Allemands et avant d'optimiser la mise en cache de la page du site, ces Allemands ont été chargés avec toutes les images pendant assez longtemps. Lorsque la page a commencé à être émise immédiatement de Kesha, le bot, qui n'avait pas de temps réveillé, a également commencé à les récupérer instantanément. C'était difficile. L'affaire est particulièrement difficile pour la raison pour laquelle si vous avez changé le réglage (activé sur la mise en cache) et le site après cela a cessé de fonctionner, alors qui, à votre avis, est à blâmer? Exactement. Si vous regardez une forte augmentation du nombre de demandes, alors regardez, par exemple, dans Google Analytics, qui est venue à quelles pages.

Tuning du serveur Web

Quels autres sont des points clés? Bien sûr, vous pouvez mettre le "défaut" nginx et espérer que tout ira bien. Cependant, cela ne se produit toujours pas bien. Par conséquent, l'administrateur de n'importe quel serveur doit consacrer beaucoup de temps à un réglage fin et à la syntonisation NGinx.

12. Limiter les ressources (tailles de tampons) dans NGinx

Qu'est-ce que vous devez vous souvenir d'abord? Chaque ressource a une limite. Tout d'abord, cela concerne la RAM. Par conséquent, les tailles d'en-têtes et de tous les tampons utilisés doivent être limitées à des valeurs adéquates sur le client et le serveur entièrement. Ils doivent être prescrits dans la configuration Nginx.

  • client_header_buffer_size__ Spécifie la taille de la mémoire tampon pour lire l'en-tête de la demande du client. Si la ligne de requête ou le champ d'en-tête de requête n'est pas entièrement placée dans ce tampon, les plus gros tampons spécifiés par la directive GRAND_CLIENT_HEADER_BUFFERS sont alloués.
  • grand_client_header_buffers Définit le nombre maximal et la taille de la mémoire tampon pour lire un grand nombre de demandes de client.
  • client_body_buffer_size Spécifie la taille du tampon pour lire le corps de la demande du client. Si le corps de la requête est supérieur au tampon souhaité, alors l'ensemble du corps de la requête ou une seule pièce est écrit dans un fichier temporaire.
  • client_max_body_size Spécifie la taille du corps maximale autorisée de la demande du client, spécifiée dans le champ "longueur de contenu" de l'en-tête de la requête. Si la taille est plus spécifiée, le client renvoie 413 error (Demander une entité trop grande).

13. Personnalisez les délais d'attente dans NGinx

La ressource est l'heure. Par conséquent, la prochaine étape importante devrait être d'installer toutes les délais d'attente, ce qui est encore très important de vous enregistrer de manière gaide dans les paramètres Nginx.

  • réinitialiser_timpedout_connection sur; Aide à combattre les prises suspendues à la phase d'attente de fin.
  • client_header_timeout. Spécifie un délai d'attente lors de la lecture de l'en-tête de la demande du client.
  • client_body_timeout. Spécifie un délai d'attente lors de la lecture du corps de la demande du client.
  • keepalive_timeout. Définit le délai d'attente au cours de laquelle la connexion conservée au client ne sera pas fermée du côté serveur. Beaucoup ont peur de demander une grande importance ici, mais nous ne sommes pas sûrs que cette peur soit justifiée. En option, vous pouvez définir la valeur de délai d'attente dans l'en-tête HTTP Keep-Alive, mais Internet Explorer est célèbre pour ignorer cette valeur.
  • send_timeout. Spécifie un délai d'attente lorsque vous passez une réponse au client. Si, après cette heure, le client n'acceptera rien, la connexion sera fermée.

Immédiatement la question: quels paramètres de tampons et de délits sont corrects? Il n'y a pas de recette universelle ici, dans toutes les situations qu'ils sont leurs propres. Mais il y a une approche éprouvée. Vous devez définir les valeurs minimales à laquelle le site reste en état de fonctionnement (en temps de paix), c'est-à-dire que les pages sont données et les demandes sont traitées. Ceci est déterminé uniquement par des tests - à partir des ordinateurs de bureau et des appareils mobiles. Algorithme de recherche de valeurs de chaque paramètre (taille de tampon ou délai d'attente):

  1. Je présente une valeur de paramètre mathématiquement minimale.
  2. Exécutez le test du site.
  3. Si toute la fonctionnalité du site fonctionne sans problèmes - le paramètre est défini. Sinon, nous augmentons la valeur du paramètre et nous allons à la clause 2.
  4. Si la valeur du paramètre dépasse même la valeur par défaut est une raison de discussion dans l'équipe du développeur.

Dans certains cas, l'audit de ces paramètres devrait entraîner un refactoring / la refonte des utilisateurs. Par exemple, si le site ne fonctionne pas sans les demandes de vote de longues longues de trois minutes de l'Ajax, vous n'avez pas besoin de soulever du temps, mais de long interrogation pour remplacer quelque chose d'autre - Botnets dans 20 000 voitures suspendues sur des demandes de trois minutes, faciles à Tuez le serveur bon marché moyen.

14. Limiter les composés dans NGinx (limit_conn et limit_req)

Nginx a également la capacité de limiter les connexions, les demandes et ainsi de suite. Si vous n'êtes pas sûr de savoir comment une certaine partie de votre site se comporte, idéalement, vous devez le tester, comprendre le nombre de demandes qu'il supportera et l'enregistrera dans la configuration Nginx. C'est une chose lorsque le site réside et que vous pouvez venir et élever. Et une autre chose est - quand il ira dans une telle mesure que le serveur est allé échanger. Dans ce cas, il est souvent plus facile de redémarrer qu'attendre son retour triomphant.

Supposons que le site ait des sections avec des noms / téléchargements et / de recherche. Dans le même temps, nous:

  • nous ne voulons pas de bots (ni de personnes avec des gestionnaires de téléchargement récursifsives qui ont été accumulés pour nous apporter une table des connexions TCP avec leurs téléchargements;
  • nous ne voulons pas de bottes (ou de grues volantes de moteurs de recherche) épuisé les ressources informatiques de la SGBD par plusieurs requêtes de recherche.

À ces fins, la configuration du type suivant sera utilisée:

Http (limit_conn_zone $ binary_remote_addr zone \u003d download_c: 10m; limit_req_zone $ binaire_remote_addr Zone \u003d Search_r: 10m \\ Trear \u003d 1R / S; serveur (LIMIT_CONN Download_C 1; # Autre emplacement de configuration) Emplacement / Recherche / (Limit_Req Zone \u003d Search_r Burst \u003d 5; autre configuration de l'emplacement)))

Il a généralement une signification directe pour établir des limitations limit_conn et limit_req pour les emplacements dans lesquels il existe des scripts coûteux (dans l'exemple de la recherche est spécifié, ce qui n'est pas rentable). Les restrictions doivent être choisies, guidées par les résultats des tests de charge et de régression, ainsi que du bon sens.

Faites attention au paramètre 10M dans l'exemple. Cela signifie que le calcul de cette limite mettra en lumière un dictionnaire avec un tampon de 10 mégaoctets et un mégaoctet de plus. Dans cette configuration, cela vous permettra de suivre 320 000 sessions TCP. Pour optimiser la mémoire occupée sous forme de clé dans le dictionnaire, la variable $ Binary_Remote_addr, qui contient l'adresse IP de l'utilisateur sous forme binaire et prend moins de mémoire que la variable de chaîne habituelle $ REMOTE_ADDR. Il convient de noter que le deuxième paramètre de la directive limite_req_zone peut être non seulement IP, mais également toute autre variable NGinx disponible dans ce contexte est par exemple, dans le cas où vous ne souhaitez pas fournir de mode proxy plus épargné, vous pouvez Utilisez $ binaire_remote_addr $ http_user_agent ou $ binaire_remote_addr $ http_cookie_myc00kiez - mais il est nécessaire d'utiliser de telles conceptions avec prudence, car, contrairement au 32 bits $ binaire_remote_addr, ces variables peuvent être significativement plus longues et que "10M" déclarée peut être maintenue.

Tendances dans les DDO.

  1. Pousse en permanence la puissance du réseau et des attaques de niveau de transport. Le potentiel de l'attaque moyenne d'attaque syn-inonditive a déjà atteint 10 millions de packages par seconde.
  2. La demande spéciale a récemment jouir d'attaques sur DNS. Les demandes DNS valides de l'inondation UDP avec les adresses IP Source SPOOFLELLED sont l'une des plus courantes dans les implémentations et compliquées en termes de contre-attaques. De nombreuses grandes entreprises russes (y compris l'hébergement) ont été victimes de problèmes récents à la suite d'attaques sur leurs serveurs DNS. Plus ces attaques seront plus éloignées, et leur pouvoir grandira.
  3. À en juger par les fonctionnalités externes, la plupart des botnets ne sont pas gérés de manière centralisée, mais par le biais du réseau peer-to-peer. Cela donne aux attaquants la possibilité de synchroniser les actions du Botnet dans le temps - si les équipes de direction se sont répandues sur un botnet de 5 000 voitures pour des dizaines de minutes, la facture va maintenant des secondes et votre site peut expérimenter de manière inattendue une photographie instantanée. augmentation du nombre de demandes.
  4. La part des bots, équipée d'un moteur de navigateur à part entière avec JavaScript, est toujours petite, mais pousse continuellement. Une telle attaque est plus difficile à éliminer les artisans intégrés, de sorte que les auto-sorties doivent suivre cette tendance avec la peur.

préparation du système d'exploitation.

En plus du réglage fin de NGinx, vous devez prendre en charge les paramètres de la pile réseau du système. Au moins - Allumez immédiatement net.ipv4.tcp_syncookies à Systl, pour vous protéger de l'attaque syn-alimentaire d'une petite taille.

15. Tyi Yard

Faites attention aux paramètres les plus avancés de la partie réseau (noyau) à nouveau par temps et mémoire. Il y a plus important et moins important. Tout d'abord, vous devez faire attention à:

  • net.ipv4.tcp_fin_timeout. Le temps que la prise passera dans la phase FIN-WAUST-2 TCP (en attente du segment FIN / ACK).
  • net.ipv4.tcp _ (, r, w) mem Sockets TCP recevant la taille de la mémoire tampon. Trois valeurs: minimum, valeur par défaut et maximum.
  • net.core. (R, w) mem_max La même chose pour les tampons TCP.

Avec un canal de 100 Mbps, les valeurs par défaut sont d'une manière ou d'une autre. Mais si vous avez au moins gigabit dans la Candide, il est préférable d'utiliser quelque chose comme:

Systl -w net.core.rmem_max \u003d 8388608 Systl -w net.core.wmem_max \u003d 8388608 Systl -w net.ipv4.tcp_rmem \u003d "4096 87380 8388608" Systl -w net.ipv4.tcp_wmem \u003d "4096 65536 8388608" Systl - w net.ipv4.tcp_fin_timeout \u003d 10

16. Révision / PROC / SYS / NET / **

Idéal pour apprendre tous les paramètres / proc / sys / net / **. Il est nécessaire de voir à quel point ils diffèrent de la part de la valeur par défaut et de comprendre leur exposition de manière adéquate. Développeur Linux (ou administrateur système), qui démonte le service Internet soumis à celui-ci et veut l'optimiser, devrait lire la documentation de tous les paramètres de la pile d'énergie nucléaire avec intérêt. Cela trouvera peut-être des variables spécifiques à son site, qui contribuera non seulement à protéger le site des intrus, mais également à accélérer son travail.

N'ayez pas peur!

Les DDO-Attaques réussies jour après jour, le commerce électronique éteignent les médias, les médias shakes, les plus grands systèmes de paiement sont envoyés à Knockout. Des millions d'internautes perdent l'accès aux informations critiques. La menace est urgente, vous devez donc la satisfaire à l'accomplissement. Effectuez vos devoirs, n'ayez pas peur et gardez votre tête froide. Vous n'êtes pas le premier et pas le dernier qui rencontrera une attaque DDO sur son site Web et, dans votre pouvoir, guidée par leur connaissance et leur bon sens, de réduire au minimum les conséquences de l'attaque au minimum.

Il y a quelque temps, j'ai écrit un article détaillé sur l'installation et la configuration du serveur Web sur la base des dernières versions. Là, j'ai mentionné qu'il s'agit du premier article du cycle de la zone de serveur Web. Aujourd'hui, je vais vous dire aussi simple et piquant signifie vous protéger de simples dDO. attaques.

Immédiatement, je ferai une réservation sur le mot DDO, ce qui n'est pas tout à fait approprié ici, mais je ne sais pas combien de plus populaire explique ce dont nous parlons. À partir de l'attaque DDO complète, vous ne pourrez pas vous protéger dans le cadre de la configuration du serveur Web. Vous serez juste bouché avec l'ensemble du canal et le serveur cessera de répondre. Si la puissance du serveur n'est pas suffisante pour traiter et filtrer les demandes entrantes, il tombera de votre choix. Pour une protection à part entière contre les DDO, vous avez besoin de fonds à part entière qui sont des coûts financiers tangibles. Pour plus d'informations avec la théorie en fonction de la lecture d'un article distinct.

Il faut comprendre que la protection contre les DDO devrait être suffisante pour la signification de la ressource. Si vous avez un blog personnel, qui n'apporte pas de profits importants, payez la protection contre les DDO sans signification. Il suffit de se coucher pendant un certain temps ou de faire une protection vous-même. En général, il est toujours nécessaire de mesurer le coût des temps d'arrêt avec le coût de la protection et sur la base de cela pour décider de la faisabilité de l'une ou une autre méthode.

Je vais donner des conseils à protéger contre de simples attaques de bots ou de petits nuisibles et paquets, qui sans actions correctes de votre part ne peuvent mettre votre site Web ou votre serveur sans aucun problème. Voici un exemple simple. Il n'y a pas très faible, à bord duquel 2 mètres, 8 agents de gigs et un disque SSD.

Le serveur est configuré par mon article précédent, la référence auquel le voyant au début. Sur le serveur, le site WordPress avec certains contenus sera déployé. Et nous avons un nuisible, qui sur votre serveur exécute le test simple d'Apache aux performances du serveur Web:

# AB -C 50-N 30000 "https://hl.zeroxzed.ru/"

Seulement 50 ruisseaux parallèles. Ce que nous voyons sur votre serveur Web:

Pas une image très agréable. Le serveur est chargé de 100%. Et bien que cela traite normalement les demandes et en général, cela fonctionne correctement. Il ne ralentit même pas, mais c'est toujours mauvais. Et s'il y a 3 serveurs et 100 ruisseaux sur chacun? Il n'y a pas de problèmes, même pour un test enlève de différentes tuyaux sur une machine virtuelle et de gérer de telles choses sur eux en imitant l'attaque DDO.

En général, si vous n'aviez aucune protection sur votre serveur du tout, tout le monde sera en mesure de livrer des inconvénients sans aucun problème particulier. Fourni d'une telle "attaque" n'est pas difficile. Ensuite, je vais vous dire comment le faire.

Protection DDOS utilisant des iptables

Pour protéger contre l'attaque la plus simple, nous utiliserons un pare-feu - iptables., Noyau de module ipset. Stocker une large liste de scripts IP et auto-écrits. Pour le pare-feu, voir mon article -. Ici je ne m'arrêterai pas dessus.

QUESTION DE CONFIGURATION DE PIÈGE IPSE I pris en détail dans mon article par. Je vous conseille de voir le matériel, car il est directement lié à cet article et complète-la.

Nous procéderons donc à la création de notre simple protection contre les attaques DOS avec un grand nombre de connexions d'une adresse IP. Pour commencer, vérifiez la commande qui nous montrera le nombre de connexions de chaque adresse IP:

# Netstat -ntu | Awk "(impression de 5 $)" | Grep -ve "(adresse | serveurs | 127.0.0.1)" | Cut -D: -F1 | Trier | UNIQ -C | Trier -n | Sed "s / ^ [\\ t] * //"

Ici, il est une violatrice de notre tranquillité, essayant d'organiser le patron sur notre serveur. Dessinez maintenant un script qui bloquera tout ce qui définit plus de 50 connexions simultanées avec le site.

#! / Bin / sh netstat -ntu | Awk "(impression de 5 $)" | Grep -ve "(adresse | serveurs | 127.0.0.1)" | Cut -D: -F1 | Trier | UNIQ -C | Trier -n | SED "S / ^ [\\ T] * //" | Awk "(si ($ 1\u003e 50) Imprimer 2 $)"\u003e /root/dddos/much_conn.txt Sleep 3 Liste \u003d $ (chat /root/dddos/much_conn.txt) pour IPnet en $ Liste do ipset -a beaucoup_conn $ ipnet fait

En principe, il n'y a rien à commenter ici. Nous prenons une liste de connexions qui viennent d'être avérée, comparez la première colonne de la colonne, si elle est supérieure à 50, puis le résultat de la deuxième colonne, où l'adresse IP est enregistrée, passe au fichier.

Ensuite, lisez ce fichier et ajoutez toutes les adresses IP à la liste d'ipset appelée beaucoup_conn. Auparavant besoin de le créer. J'en ai parlé en détail dans l'article sur lequel le lien mené ci-dessus, mais je répète une fois encore ici:

# Ipset -n beaucoup_conn iphash

Voir le contenu de la liste peut être commande:

# ipse -l beaucoup_conn

Maintenant, vous devez ajouter une règle à IPTables par laquelle toutes les connexions de la liste d'ipsets spécifiée seront bloquées.

# IPTABLE -A INPUT-INPUT -M SET -MATCH-SET BULL_CONN SRC -J DROP

Juste au cas où je vous avertit de vérifier votre accès à la console de serveur avant de configurer les règles IPTABLES. Tout se passe, vous pouvez simplement vous tromper, copier et coller non ce dont vous avez besoin.

Tous, nous avons bloqué tous ceux qui créent des connexions de spam de masse au serveur. La limite de 50 connexions peut être corrigée à la place, il peut être nécessaire d'être réduit si quelqu'un ouvrira moins de connexions d'une adresse IP.

Le seul moment où je veux dire. Je n'ai vu moi-même pas combien de connexions ouvrent des robots de recherche lorsqu'ils arrivent sur le site. Je soupçonne que ce n'est clairement pas 50 et pas même 30, mais je n'ai probablement pas vérifié. En général, soyez prudent lorsque vous utilisez cet outil.

Ce script peut être poussé dans la couronne et courir chaque minute. Mais personnellement, je ne ferais pas ça. Je recommande à la surveillance des ressources du serveur et à exécuter des outils similaires uniquement si le serveur fonctionne à la limite de ses capacités et que vous avez entré manuellement et vous êtes assuré que quelqu'un sera spammé avec des connexions. Après cela, a conduit pendant quelque temps ce script de la couronne. Lorsque DDO arrête, déconnectez-vous.

Il serait agréable de nettoyer automatiquement la liste des bannies, en supprimant de là ceux qui ne vous sont pas connectés pendant une journée, mais cela complique considérablement la tâche. Vous avez besoin d'au moins un journal sur la liste de blocage, enregistrez la dernière période d'appel. Traitement tout cela, calculer. En général, la tâche n'est pas très difficile, mais pas triviale. Je ne voulais pas faire ça.

Il y a, bien que pas très élégant, mais une solution simple à ce problème. Créez une liste d'IpiCse avec un enregistrement de temps de vie spécifié avec temps libre.. Par exemple, comme ceci:

Ipset -n beaucoup_conn iphash timeout 3600

Dans ce cas, l'enregistrement IP stocké IP dans la liste IPset sera stocké pendant 3600 secondes ou 60 minutes.

Il faut comprendre que dans cet exemple avec 1 adresse IP pour utiliser un ipset, vous ne pouvez pas interdire immédiatement les moyens des iptables. Le pimage n'est nécessaire que lorsque cette liste est au moins des centaines de lignes. S'il y a plusieurs dizaines d'adresses, suffisamment d'une iPtables.

Analyse du serveur de journal du serveur Web pour protéger contre DDO

Considérez un autre type simple, mais toujours plus complexe d'attaque DDO d'attaque lorsque les requêtes de type proviennent d'une adresse IP différente. C'est-à-dire que Simple Botnet, peut-être même assemblé avec les mains de plusieurs serveurs VDS bon marché. Les connexions simultanées ne seront pas beaucoup, mais si vous avez un site lourd et qu'un attaquant trouvera son emplacement faible (par exemple, une recherche), il peut suffire de placer le site.

Nous serons bannis via IPTABLES et la liste des adresses de l'interdiction sera extraite des journaux du serveur Web. Pour ce faire, vous devez être activé les demandes de journalisation sur le serveur Web. Par exemple, à Nginx, cela est responsable de ce paramètre d'un hôte virtuel:

Access_log /web/sites/hl.zeroxzed.ru/log/access.log Main;

Nous n'analyserons pas tout le fichier journal à chaque fois. Cette opération elle-même chauffera le serveur Web. Prenez les 1000 dernières lignes du journal des journaux et envisagez le nombre de connexions d'une adresse IP avec le contenu de type, tel que la demande principale de la page HTTP 1.0, "Get / http / 1.0". Si vous remarquez une autre caractéristique permanente du botnet que vous vous attaquez, utilisez-le. C'est peut-être le même agent d'utilisateur ou autre chose. Supposons que l'attaquant tombe dans un endroit vulnérable, ce sera l'adresse de cette page.

# Queue -1000 /web/sites/hl.zeroxzed.ru/log/ssla-access.log | Egrep "get / http / 1.0" | Awk "(impression de 1 $)" | Trier -n | UNIQ -C.

Le résultat de cette commande sera approximativement une liste.

Dans ce cas, j'ai utilisé une petite condition différente et j'ai simplement apporté une liste de tous ceux qui ont frappé à la page principale. Mais ici, vous pouvez voir le violateur que vous pouvez interdire.

Nous tirons similaires au script précédent pour verrouiller automatique ceux qui envoient trop de demandes à notre site et crée des problèmes de performance. Je répète une fois de plus en plus de problèmes de productivité, je ne recommande pas de faire des mouvements supplémentaires.

#! / Bin / sh queue -1000 /web/sites/hl.zeroxzed.ru/log/ssla-access.log | Egrep "get / http / 1.0" | Awk "(impression de 1 $)" | Trier -n | UNIQ -C | Trier -n | Queue -N100 | Awk "(si ($ 1\u003e 50) Imprimer 2 $)"\u003e /root/dddos/much_gets.txt Sleep 3 Liste \u003d $ (chat /root/dddos/much_gets.txt) pour IPNet In $ Liste do ipset -a beaucoup_gets $ ipnet fait

Ici, nous faisons la même chose qu'auparavant. Ceux qui ont fait plus de 50 demandes identiques sur notre masque pour les 1 000 dernières lignes du fichier journal sont envoyées à l'interdiction.

J'attire l'attention sur la chaîne à laquelle vous ferez filtrer les demandes. Dans ce cas, je n'ai montré qu'un exemple. Ne prenez pas et appliquez sous la forme, comme je montrais. Je démontre des capacités techniques et une approche. Vous devez configurer et calibrer le système à ma place. Il est important de comprendre cela et de ne pas appliquer la décision sans toutefois. Il n'y aura que de mal.

N'oubliez pas de créer une liste séparée dans Ipset et d'ajouter une règle distincte aux iPables. Vous pouvez utiliser la liste déjà existante et ajouter la règle de l'exemple précédent, mais je recommande de résoudre tout. Tellement plus pratique pour une analyse ultérieure.

Au cours de l'attaque DDO, ajoutez cette règle à Cron et effectuez toutes les minutes. Une fois l'attaque terminée, le script peut être éteint. En principe, vous pouvez laisser constamment, mais ici vous devez penser avec soin et estimer comment il devrait regarder. Le principe principal n'est pas nocif.

Banches de Banya avec référent incorrect

194.67.215.242 - - "Poste /index.php http / 1.1" 200 913 " g0dfw4p1.ru."" Mozilla / 5.0 (Windows NT 6.0; RV: 34.0) Gecko / 20100101 Firefox / 34.0 "-"

Le champ de référateur correct doit contenir http ou https ou être vide. Tout cela autrement, vous pouvez bloquer ou retourner en toute sécurité l'état d'erreur. Ajoutez environ cette conception à la configuration d'hôte virtuelle, dans la section serveur ().

Si ($ http_referer! ~ * ^ ($ | Http: // | https: //)) (retour 403;)

Après cela, vérifiez la configuration NGinx et le relisez.

# Nginxt -t # nginx -s recharger

Si vous sortez une sorte de bot avec un référent spécifique, vous pouvez l'interdire. Pour ce faire, vous pouvez ajouter une condition ou changer. Par exemple, comme ceci:

Si ($ http_referer \u003d "https://bots.ru/dostanim_tebya.html") (retour 403;)

De plus, vous pouvez tous ces robots à l'aide d'un script simple pour interdire les iptables, comme dans les exemples ci-dessus. En passant, ils peuvent être interdits immédiatement, visualisant des demandes HTTP avant même qu'ils ne tombent à Nginx, par exemple, en utilisant Ngrep, mais c'est une tâche plus difficile. Tous ne savent pas comment le faire, il y a des nuances là-bas, et tout se familiarise avec Nginx. Ce ne sera pas beaucoup de difficulté à mettre en œuvre cette méthode.

Protection DDOX avec modules NGinx - LIMIT_CONN et LIMIT_REQ

Je partagerai un autre moyen simple de réduire la charge sur le serveur et de protéger partiellement contre les DDO à l'aide des modules NGinx - limit_conn. et limit_req. Il n'est pas difficile de les configurer, en partie le résultat du premier module se croisant avec les deux premières méthodes de protection DDOS décrits au début. Il est plus simple de personnaliser, donc si vous ne faites pas face à ces méthodes, vous pouvez essayer celui-ci.

La signification de ces modules est que l'on peut limiter la quantité simultanée de connexions autorisées avec le site et un autre nombre de connexions par unité de temps.

Je limiterai dans mon exemple le nombre de connexions simultanées sur le site d'un numéro IP 50 et le nombre de demandes simultanées à la teneur dynamique d'au moins 2 par seconde. Ceci sera résolu une éclaboussure ( Éclater.) Quères jusqu'à 5. Je vais expliquer comment comprendre cet éclaboussure, car je ne comprenais pas immédiatement ce que cela signifie exactement.

Si nous avons dépassé le nombre de demandes définies par seconde, leur exécution est retardée et elles sont intégrées à la file d'attente par la vitesse spécifiée. La taille de cette file d'attente est égale à la valeur de l'éclatement. Toutes les demandes qui ne sont pas assez d'espace dans la file d'attente seront complétées par une erreur. C'est-à-dire que si les demandes sont 4 par seconde, alors 2 seront effectuées immédiatement et 2 autres seront dans la file d'attente. Et s'il est 10, alors 2 sera effectué immédiatement, 5 sera dans une file d'attente d'exécution de 2 pièces par seconde, et le reste sera complété par une erreur.

Sur la base de ces conditions, la restriction de connexion doit être installée dans le contexte. serveuret accès au contenu dynamique dans la mesure appropriée emplacement. Dans le même temps, la description des zones que les directives utiliseront devraient être situées dans http..

Voici un exemple de la configuration NGinx pour la mise en œuvre des restrictions établies afin de protéger contre les attaques DDO.

Http (... limit_conn_zone $ binaire_remote_addr zone \u003d PERIP: 10m; LIMIT_REQ_ZONE $ BINARY_REMOTE_ADDR ZONE \u003d DYNAMIQUE: 10M Tarif \u003d 2R / s; ... Server (... LIMIT_CONN PERIP 50; ... Emplacement ~ \\ .PHP $ ( ... limite_req Zone \u003d Burst dynamique \u003d 5 nodeley; ...)))

Après cela redémarrez NGinx et vérifiez comment les limites fonctionnent. La limite sur le nombre de demandes dynamiques effectuées peut être vue en appuyant simplement sur F5 très rapidement dans le navigateur. Si vous êtes assez deft, vous verrez bientôt une photo

et l'entrée dans le journal avec des erreurs:

2017/11/30 15:25:26 9773 # 9773: * 51482 Demandes limitatives, excédent: 5.664 par zone "dynamique", client: 195.91.248.43, serveur: hl.zeroxzed.ru, demande: "Obtenez / http / 2.0 ", Hôte:" hl.zeroxzed.ru ", référent:" https://hl.zeroxzed.ru/2013/03/15/faitaturé-Image-vertical/ "

La limite sur le nombre de connexions peut vérifier le même utilitaire uN BJ'ai parlé de l'introduction.

017/11/30 15:38:56 9773 # 9773: * 53938 Limite de connexions par zone "PERIP", client: 94.142.141.246, serveur: hl.zeroxzed.ru, Demande: "get / wp-contenu / téléchargements / 2013 /03/the-dark-knight-rises.jpg http / 1.0, hôte: "hl.zeroxzed.ru"

N'oubliez pas que le test doit être lancé non sur une page spécifique, vous serez pris pour limiter les performances du contenu dynamique, mais pour autre chose. Par exemple, comme dans mon exemple, sur la photo.

Lors de la délivrance des restrictions, n'oubliez pas de contrôler si les robots de recherche ne tombent pas dans ces restrictions. Par défaut, ils essaient de ne pas créer de fardeau accru sur le site. Si vous le souhaitez, le robot Yandex peut être spécifié via robots.txt, quelle vitesse de numérisation de votre site. Et le robot google peut faire la même chose via webmaster.

Conclusion

J'ai examiné les moyens les plus simples de protéger le serveur Web de NO SIMPLE SIMPLET DDO Attaques qui ressemblent davantage à un dorlot. Une attaque sérieuse qui remplira simplement l'ensemble du canal de canal entrant, ne remarquera même pas notre protection. Néanmoins, je devais m'assurer que l'efficacité de ces méthodes dans le reflet de certaines attaques.

Il existe toujours un grand nombre de serveurs Web qui ne sont même pas protégés même de l'utilitaire. uN B :) Je sais de quoi je parle, alors que de tels serveurs rencontrent au travail. Et il y a aussi beaucoup de nombreuses sorties de bots et de programmes simples que l'on peut trouver sur Internet et un manteau, des sites audacieux qui ne sont pas prêts pour les charges du tout.

Il y a un autre moyen, le même simple que celui que j'ai décrit et efficace des bots qui ne comprennent pas les redirections et les cookies. Je ne l'ai pas décrit, car rien à vérifier, et c'était juste fatigué d'écrire un article, il s'est avéré très grand. Je l'ai écrit et édité depuis longtemps, collectionner des scripts et des paramètres sur différents serveurs et en vous rappelant que je l'ai fait. Puis il vérifia tout cela séparément.

L'essence de la protection est qu'avec l'aide de NGinx, nous émettons des cookies spécifiques à l'utilisateur, puis redirigez la page demandée. Si le bot ne comprend pas les cookies ou les redirections, alors il tombe. Les utilisateurs normaux ne remarquent rien. Peut-être que plus tard, je vous parlerai de cette méthode et d'ajouter un article. En attendant. Je serai heureux de commenter les mérites des articles.

Cours Linux en ligne

Si vous souhaitez apprendre à construire et à maintenir des systèmes hautement accessibles et fiables, je vous recommande de vous familiariser avec cours en ligne "Administrateur Linux" dans OTUS. Le parcours n'est pas pour les débutants, car l'admission Vous avez besoin de connaissances de base sur les réseaux et d'installer Linux à virtuel. La formation dure 5 mois, après quoi les diplômés réussis du cours seront en mesure de passer des entretiens de partenaires. Qu'est-ce qui vous donnera ce cours:
  • Connaissance de l'architecture Linux.
  • Maîtriser les méthodes modernes et les outils d'analyse des données et de traitement de données.
  • La possibilité de sélectionner la configuration pour les tâches nécessaires, gérer les processus et assurer la sécurité du système.
  • Possession des principaux instruments de travail de l'administrateur système.
  • Comprendre les caractéristiques du déploiement, des paramètres et de la maintenance des réseaux construits sur la base de Linux.
  • La possibilité de résoudre rapidement des problèmes émergents et de garantir une opération de système stable et ininterrompue.
Vérifiez-vous sur le test d'introduction et consultez le programme logiciel.

Les projets Web sont très souvent rencontrés avec des attaques DDO. Aujourd'hui, nous considérons l'un des moyens de base de protéger de HTTP-Flood.

Introduction:

Récemment, une attaque est arrivée à l'un des projets de mon ami, a probablement attaqué un pirate informatique inexpérimenté, car l'attaque a été effectuée d'une adresse IP.

Lors de l'analyse des journaux, il a été constaté que l'attaquant tente de télécharger plusieurs fois la page principale et le serveur essaie de traiter ces demandes et ne peut pas.

Pour protéger contre les attaques de ce type, nous utiliserons le serveur proxy nginx et le module ngx_http_limit_conn_module standard.

Ngx_http_limit_conn_module Module vous permet de limiter le nombre de connexions sur une touche donnée, en particulier, le nombre de connexions d'une adresse IP.

Toutes les connexions ne sont pas prises en compte, mais uniquement celles dans lesquelles il existe des demandes traitées par le serveur et que l'en-tête de la demande est déjà lu.

En d'autres termes, nous pouvons mettre une limite sur le nombre de demandes et de connexions d'une adresse IP. Cela suffit à protéger contre les attaques faibles et moyennes-inondations HTTP-inondables.

Pour définir la restriction, nous utiliserons la directive limit_conn

Configuration de NGinx pour protéger contre DDO:

lIMIT_CONN:

lIMIT_CONN Spécifie le nombre maximal admissible de connexions d'une adresse IP. Si ce numéro est dépassé, en réponse à la demande, le serveur retournera une erreur. 503 (Service temporairement indisponible).

Après avoir reçu une erreur 503, l'attaquant cessera de créer une charge utile sur le serveur de base de données, telle que MySQL, le décharge ainsi.

Mais avant d'utiliser limit_conn pour protéger contre les attaques DDO avec NGinx, nous devons déterminer et installer la directive limit_conn_zone

lIMIT_CONN_ZONE:

Syntaxe: lIMIT_CONN_ZONE Touche de zone \u003d. nom: Taille;
Définit les paramètres de la zone de mémoire partagée qui stocke l'état pour différentes valeurs de clé. L'état en particulier contient le nombre actuel de connexions. En tant que clé, vous pouvez utiliser du texte, des variables et des combinaisons de ceux-ci. Les demandes avec une valeur de clé vide ne sont pas prises en compte.
Exemple d'utilisation:

Exemple d'utilisation

lIMIT_CONN_ZONE $ BINARY_REMOTE_ADDR ZONE \u003d Addr: 10m;

Cette directive est nécessaire pour stocker un statut pour chaque adresse IP. C'est important! Cette directive devrait aller à nginx.conf immédiatement après http (.

Exemple de configuration Nginx.conf pour limit_conn_zone:

Exemple de configuration

http (limit_conn_zone $ binaire_remote_addr zone \u003d addr: 10m; ...

http (

limit_conn _ Zone $ binaire_remote_addr Zone \u003d Addr: 10m;

. . .

Après avoir installé la directive limit_conn_zone, nous allons passer à l'installation limit_conn.

Syntaxe: limit_conn.numéro de zone;

Veuillez noter que la zone doit être prise à partir de la zone installée dans limit_conn_zone, dans notre cas AddR.

Le 3ème paramètre "numéro" désigne le nombre de connexions ouvertes en même temps d'une adresse IP.

Afin de limiter 3 connexions simultanées pour la zone addr, vous devez écrire ce qui suit:

limit_conn.addr 3;

Un exemple de configuration pour la protection contre les attaques DDoS à l'aide de NGinx et Limit_Conn:

http (limit_conn_zone $ binaire_remote_addr zone \u003d Addr: 10m; ... serveur (écoute 80; ... Localisation / (Limit_Conn Addr 3; ...)))

http (

limit_conn _ Zone $ binaire_remote_addr Zone \u003d Addr: 10m;

En fait, pourquoi interdire l'accès au site de base géographique? Oui, seulement 80% des adresses IP participant à l'attaque DDoS, en règle générale, appartiennent à des pays dont les résidents n'entreront jamais dans ce site, il est naturellement purement individuellement pour chaque ressource et si vous savez que la partie de vos visiteurs vient d'Ethiopie ou du Chili. , bloquez-les, vous voulez à peine. Pour la majorité de mes clients, l'emplacement géographique des visiteurs est généralement limité à l'Europe et à l'ancien URSS, le reste peut être ignoré en toute sécurité.

Méthode décrite pour bloquer les pays de licenciement à l'aide d'un serveur Web nginx et geoip. Le module, seul, et encore plus, le problème ne résoudra pas le problème, ce n'est qu'un, à partir de plusieurs types de mesures (réglage du noyau, du pare-feu, des services à temps plein, des logiciels supplémentaires), afin de minimiser la Dommage appliqué par ce type de serveur d'attaque et de sites, il est situé.

Des projets qui ont souvent besoin de ce type de protection, j'essaie d'élever initialement sans la participation du serveur Web Apache, c'est-à-dire sur un paquet nginx - Fastcgi..

Donc, mettre et configurer tout ce ménage sur le serveur exécutant le système d'exploitation FreeBSD 8.2 And64..

Ce serait module geoip. Gagné, une bibliothèque supplémentaire sera requise, nous avons défini:

FreeBSD82 / USR / Ports # Make -C Net / GeOIP Installez propre

FreeBSD82 / usr / ports # make -c www / nginx Installez propre

dans les options de montage, vous devez activer. geoip. module nginx, mettre un char de char Activer le module http_geoip.

Ensuite, nous allons à la page http://www.maxmind.com/app/geolitecountry et téléchargement dernier format binaire de Géolite PaysIl s'agit d'une option libre de la base des pays et de leurs blocs d'adresses IP correspondants. Déballez les archives et lancez le fichier GeIP.dat. Dans le dossier USR / local / etc / NGinx / Conf / Geo. Il reste à éditer les configuration nginx.

Ouvert nginx.conf., Ajouter à la section http. Directive de bloc suivante:

Geoip_country /usr/Local/etc/nginx/conf/geo/geoip.dat; # Connectez la base GEIP Carte $ Geoip_Country_Code $ Bad_country ( # Module de carte crée des variables dont les valeurs dépendent d'autres variables, une chose très utile Par défaut 1; # Valeur par défaut inclure Geo / Good_countries; # Inclure le fichier, retour vers lui plus tard plus tard }

Ce bloc carte, signifie que tous les pays sont dans la base de données, sont interdits par défaut et dans le fichier good_countries.Les pays autorisés seront répertoriés. Si vous, par exemple, la situation lorsque les pays autorisés sont plus que ceux interdits, vous pouvez facilement inverser cette logique et créer un fichier bad_countries. Avec la liste des pays interdits, permettant à tous les autres.

Maintenant les paramètres d'hôte. Je préfère garder des hôtes dans un dossier séparé, par exemple hôtes., Chacun dans votre dossier.

Serveur (écouter IP: 80; Server_Name testhost.com; si ($ bad_country) ( # Si cette variable est installée, c'est-à-dire si le pays ne figure pas dans le fichier Good_countries Retour 444; # émetteur d'un client une réponse vierge (il n'est pas nécessaire de donner une erreur 403 ou une autre) } ................. ................. }

Maintenant retour au fichier good_countries.. Tout est extrêmement simple ici, les pays autorisés à accéder au site sont répertoriés dans le format suivant:

TM 0; UA 0; Uz 0; Ru 0; ....... ....... etc.

C'est-à-dire que cela suffirait pour n'importe quel pays, il suffit d'ajouter son code à deux lettres et 0, après quoi vous redémarrer la configuration NGinx:

FreeBSD82 / # NGinx -S Recharger

Les codes des pays, deux fois, sont via Google.

Chèque, courir geoip. Le module ou non, il est possible, en supprimant de la liste des pays autorisés et d'essayer d'entrer dans le site.

En fait, tel est le schéma général de l'utilisation du module GeOIP NGINX pour protéger contre les attaques DDO.

Naturellement, vous pouvez proposer de nombreuses autres options pour utiliser ce module pour résoudre diverses tâches associées à l'emplacement géographique du visiteur du site.

Vous pouvez vous asseyez-vous comme ça, vous ne touchez personne, puis vous appelez et dit que les services fonctionnent lentement, les sites ouverts pendant 2 à 3 minutes ont réussi à produire 504 erreurs.
Montez contrarié dans des cactus et il y a:

Vous trouverez ci-dessous les commandes qui vous aideront à comprendre ce qui s'est passé et est-ce exactement DDO.

Premièrement, je recommande de lire l'article en détail décrit quels journaux sont intéressants pour nous comment lire la sortie de la commande supérieure et comment utiliser l'équipe PS. Tous seront utiles pour nous permettre de comprendre les hôtes que nous avons subi une attaque et quels goulots d'étranglement sur le serveur.

Quelles équipes et que pouvons-nous déterminer?

Pour commencer, vous pouvez voir le nombre de processus d'exécution d'Apache. Si plus de 20-30 sont supérieurs à 20-30, quelque chose n'est pas si.

Nous examinons le nombre de processus Apache à Debian:

PS AUX | Grep apache | Wc -l.

Nous examinons le nombre de processus Apache dans Centos:

PS AUX | Grep httpd | Wc -l.

Cette commande peut voir le nombre de connexions au serveur:

Cat / proc / net / ip_connrack | Wc -l.

De plus, l'indicateur que le serveur est fourni sur le serveur peut servir de nombre de connexions sur 80 ou 443 ports. Voici les équipes capables de montrer ce numéro:

Netstat -na | Grep: 80 | Wc -l netstat -na -na | Grep: 443 | Wc -l.

Il y a toujours une telle variété de DDOD en tant que syn. Vous trouverez ci-dessous une commande qui vous permet de déterminer le nombre de demandes SYN pour les mêmes ports 80 et 443:

Netstat -na | Grep: 80 | Grep syn | TRY -U | Plus netstat -na | Grep: 443 | Grep syn | TRY -U | Suite

Et cette commande indique le nombre de demandes SYN:

Netstat -n -t | Grep syn_recv | Wc -l.

La commande suivante nous permettra de comprendre quel domaine est la plupart de toutes les demandes:

Domaine Port TCPDump -NPI Eth0

Voyons maintenant combien de demandes vient de chaque adresse IP. Cette commande affiche tous les ports:

Netstat -ntu | Awk "(impression de 5 $)" | Cut -D: -F1 | Trier | UNIQ -C | Trier -nr | Suite

commandes similaires:

Netstat -anp | grep "tcp \\ | udp" | | Awk "(impression de 5 $)" | Cut -D: -F1 | Trier | UNIQ -C | Trier -n netstat -antu | Awk "5 $ ~ /: / (Split (5 $, A,": "); IPS [a] ++) fin (pour (IPS in IPS) Imprimer IPS, IP |" Trier -k1 -nr ")"

Cette commande indique le nombre de demandes seulement sur 80 ports:

Netstat -ntu | Grep ": 80 \\" | Awk "(impression de 5 $)" | Cut -D: -F1 | Trier | UNIQ -C | Trier -nr | Suite

Cette commande affiche toutes les demandes de 80 ports, sans les compter, c'est-à-dire Option de sortie "simplifiée" mais "la plus complète":

Netstat -na | Grep: 80 | Trier | UNIQ -C | Trier -nr | Suite

Calcul de la propriété intellectuelle la plus active peut également regarder quels ports vont de ses demandes. Ici, par exemple, IP 127.0.0.0.1 sont substitués:

Netstat -na | Grep 127.0.0.1

À propos, si vous n'êtes pas configuré par Server-Statut sur Apache, l'état de ce serveur peut être consulté dans la CLI:

Statut Apachectl.

Fichiers journaux

Les journaux de Global Apache, Debian, sont généralement là:

  • /var/log/apache2/Error.log.
  • /var/log/apache2/access.log.
  • /var/log/httpd/error.log.
  • /var/log/httpd/access.log.

Les journaux Nginx globaux sont là:

/var/log/nginx/error.log.
/var/log/nginx/access.log.

En outre, n'oubliez pas d'afficher les journaux d'hôtes virtuels si les hôtes sont configurés. Nous serons intéressés par le plus grand journal qui "grandit" devant.

Il est nécessaire de rechercher dans ces journaux une anomalie, à savoir le même type de demandes sans agents utilisateur (ou avec les mêmes), un grand nombre de demandes de la même adresse IP, des demandes sans spécifier un hôte virtuel, etc.

Pour identifier une adresse IP spécifique avec le nombre de demandes sur le site, vous pouvez cette commande:

Cat Access.log | Awk "(impression de 1 $)" | Trier | UNIQ -C.

Vous pouvez également obtenir des statistiques sur des demandes avec le groupement IP à l'aide de l'utilitaire Logtop.

Pour commencer, installez cet utilitaire:

Apt-get Installer git libncurses5-dev uthash-dev gragieu de gcc au cas où vous n'auriez pas de paquets pour une opération correcte git git clone https://github.com/julienpalard/logtop.git

Et maintenant nous obtiendrons des statistiques:

Queue -f Access.log | Awk ("Imprimer 1 $; fflush ();") | Logtop.

La commande suivante nous aidera à identifier les agents utilisateur populaires:

Cat Access.log | Awk -f \\ "" (impression de 6 $) "| Trier | UNIQ -C | Trier -n

Comment bloquer?

Quoi qu'il en soit, vous devez rester debout iptables. Très probablement, il peut ne pas être configuré, surtout si vous ne savez pas ce que c'est. Plus tôt, j'ai déjà écrit un article sur la façon de l'utiliser: "", je ne donnerai donc que les commandes nécessaires pour résoudre le problème ici et maintenant.

C'est comme ça que c'est possible bloquer les demandes de TCP pour 80 ports à partir d'une adresse IP spécifique:

IPTABLE -A INPUT -P -P TCP -DPORT 80 -S 12.34.56.78 -J Drop

C'est comme ça que nous bloquer les requêtes pour tous les ports d'une adresse IP spécifique:

IPTABLE -A INPUT -S -S 12.34.56.78 -J Drop

Liste de voir déjà bloquée Nous pouvons donner ces équipes:

Iptables -l -n.

Iptables -l -n -l -line-numéros

Si nous avons besoin supprimer du blocage d'une adresse IP spécifique, vous pouvez utiliser cette commande

IPTABLE -D entrée -S 1.2.3.4 -J Drop

ou c'est possible supprimer la règle par son numéroAprès avoir examiné sa commande IPTABLE -N -N-NUMLES-NUMÉROS:

IPTABLE -D INPUT 6

Supprimer toutes les règles, Vous pouvez utiliser l'équipe:

Iptables -f.

Une certaine prévention, afin de protéger contre les DDO ...

Certaines règles seront en mesure de nous protéger des robots sans pensée créant une charge sur le serveur.

Nous installons la commande suivante nombre maximum de connexions d'une adresse IP sur 80 ports:

IPTABLE -A INPUT -P TCP -DPORT 80 -M Connlimit --Connlimit-Ci-dessus 128 -J Drop iptables -A Entrée -P TCP -DPORT 80 -J accepter

Même Vous pouvez faire I. pour DNS.:

IPTABLE -A INPUT -P -P UDP --DPORT 53 -M Connlimit --Connlimit-Ci-dessus 16 -J Drop iptables -A Entrée -P UDP --DPORT 53 -J Accepter

La règle suivante dans iptables empêchera une pointe de notre nom. En règle générale, lors du DDO, nous obtenons un package avec des drapeaux SYN et ACK installé sur une connexion non ouverte (cette combinaison de drapeaux n'a la réponse que sur le paquet SYN). Cela suggère que quelqu'un a envoyé un autre hôte Syn Host de notre nom et la réponse nous est venue.
Selon cette règle, notre hôte répondra avec un paquet RST, après réception de l'hôte attaquée, ferme la connexion.

IPtables -I entrée -M Conntrack - CCTState Nouveau, invalide -P TCP -TCP-Drapeaux SYN, ACK SYN, ACK -J REJECT-REJECT-REJECT-AVEC TCP-RESET

Iptables-Save\u003e /etc/iptables.rules

Que pouvez vous faire d'autre?

Il n'empêche pas un peu de "sortie" du noyau, fait un bon réglage d'Apache et Nginx (s'il vaut la peine), mettez des modules et des emballages supplémentaires pour protéger contre les attaques, telles que Fail2Ban, Mod_evasive, Modsecurity ..

Mais tous sont les sujets d'autres articles qui seront bientôt écrits ...



Avez-vous aimé l'article? Partagez-le