Info16.fr

Le blog de B@rtounet

#Gnu/Linux

Montée en charge d'un serveur Apache et DOS,DDOS

27 juillet 2011 Rédigé par bartounet

Comme chacun sait il existe en général deux types d'attaque par deni de service. les DOS et les DDOS Comme le dit bien Wikipedia: Un déni de service est une situation où un serveur informatique est incapable de répondre aux requêtes de ses clients. Un serveur informatique (par exemple un serveur Web) doit traiter plusieurs requêtes dans un court laps de temps. Lorsque le serveur est incapable de traiter toutes les requêtes qu'il reçoit, il y a déni de service. (DOS) Une attaque par déni de service distribuée (en anglais, Distributed Denial of Service attack ou DDoS attack) est une attaque par déni de service dans laquelle le serveur cible est attaqué par plusieurs ordinateurs simultanément. Pour ma part je ne m'étais jamais trop interessé à la monté en charge de mon serveur apache, pensant que mon site peu visité ne pouvait pas faire l'objet d'attaque. Mais c'est en voulant tester un outil de montée en charge tels que siege, que je me suis rendu compte qu'il était très simple de mettre à genoux un serveur peu sécurisé... Pour commencer tester la tenue en charge de notre serveur Apache avec siège. 1. Installation Après avoir récupéré le code source sur le site officiel, entrez les commandes suivante :
tar zxvf siege-latest.tar.gz cd siege ./configure make make install
2. Utilisation La première étape consiste à créer le fichier de configuration. Pour cela, il suffit de lancer la commande siege.config, dans son terminal. Ensuite, on pourra tester son serveur web avec quelque chose comme çà :
siege -d1 -r300 -c100 http://ip_du_serveur_a_tester/
Ici les options signifie : -c : nombre d'utilisateurs -r : nombre de connexion par chaque utilisateur -d : délai en seconde de sleep Ainsi, en lançant siege avec de tels paramètres, je simule la connexion de 100 utilisateurs, exécutant chacun 300 requêtes, espacé de une seconde. Ce qui fait à peu près 30 000 requêtes. Et là c'est le drame...
root@sd-15226:~# siege -d1 -r300 -c100 http://forum.info16.fr ** SIEGE 2.69 ** Preparing 100 concurrent users for battle. The server is now under siege... HTTP/1.1 200 2.79 secs: 6295 bytes ==> / HTTP/1.1 200 2.88 secs: 6296 bytes ==> / HTTP/1.1 200 2.89 secs: 6296 bytes ==> / HTTP/1.1 200 2.89 secs: 6296 bytes ==> / HTTP/1.1 200 2.90 secs: 6296 bytes ==> / HTTP/1.1 200 2.92 secs: 6296 bytes ==> / HTTP/1.1 200 2.93 secs: 6296 bytes ==> / HTTP/1.1 200 2.94 secs: 6296 bytes ==> / HTTP/1.1 200 2.95 secs: 6296 bytes ==> / HTTP/1.1 200 2.96 secs: 6296 bytes ==> / HTTP/1.1 200 3.57 secs: 6296 bytes ==> / HTTP/1.1 200 5.78 secs: 6296 bytes ==> / HTTP/1.1 200 6.59 secs: 6296 bytes ==> / HTTP/1.1 200 9.24 secs: 6296 bytes ==> / HTTP/1.1 200 9.31 secs: 6296 bytes ==> / HTTP/1.1 200 9.42 secs: 6296 bytes ==> / HTTP/1.1 200 9.46 secs: 6296 bytes ==> / HTTP/1.1 200 9.61 secs: 6296 bytes ==> / HTTP/1.1 200 9.61 secs: 6296 bytes ==> / HTTP/1.1 200 9.67 secs: 6296 bytes ==> / HTTP/1.1 200 9.73 secs: 6296 bytes ==> / HTTP/1.1 200 9.73 secs: 6296 bytes ==> / HTTP/1.1 200 9.93 secs: 6296 bytes ==> / HTTP/1.1 200 9.99 secs: 6295 bytes ==> / HTTP/1.1 200 10.17 secs: 6296 bytes ==> / HTTP/1.1 200 10.37 secs: 6295 bytes ==> / HTTP/1.1 200 10.68 secs: 6296 bytes ==> / HTTP/1.1 200 11.94 secs: 6296 bytes ==> / HTTP/1.1 200 12.88 secs: 6296 bytes ==> / HTTP/1.1 200 14.44 secs: 6296 bytes ==> / HTTP/1.1 200 14.82 secs: 6295 bytes ==> / HTTP/1.1 200 14.86 secs: 6296 bytes ==> / HTTP/1.1 200 15.05 secs: 6297 bytes ==> / HTTP/1.1 200 15.49 secs: 6297 bytes ==> / HTTP/1.1 200 15.88 secs: 6297 bytes ==> / HTTP/1.1 200 16.09 secs: 6297 bytes ==> / HTTP/1.1 200 18.04 secs: 6297 bytes ==> / HTTP/1.1 200 18.67 secs: 6297 bytes ==> / HTTP/1.1 200 19.87 secs: 6297 bytes ==> / HTTP/1.1 200 20.20 secs: 6297 bytes ==> / HTTP/1.1 200 20.92 secs: 6297 bytes ==> / HTTP/1.1 200 21.39 secs: 6297 bytes ==> / HTTP/1.1 200 21.42 secs: 6297 bytes ==> / HTTP/1.1 200 21.42 secs: 6297 bytes ==> / HTTP/1.1 200 22.94 secs: 6297 bytes ==> / HTTP/1.1 200 23.00 secs: 6297 bytes ==> / HTTP/1.1 200 23.35 secs: 6297 bytes ==> / HTTP/1.1 200 22.79 secs: 6297 bytes ==> / HTTP/1.1 200 23.74 secs: 6297 bytes ==> / HTTP/1.1 200 23.82 secs: 6297 bytes ==> / HTTP/1.1 200 23.88 secs: 6296 bytes ==> / HTTP/1.1 200 24.14 secs: 6297 bytes ==> / HTTP/1.1 200 24.72 secs: 6297 bytes ==> / HTTP/1.1 200 24.87 secs: 6296 bytes ==> / HTTP/1.1 200 24.92 secs: 6297 bytes ==> / HTTP/1.1 200 25.38 secs: 6297 bytes ==> / HTTP/1.1 200 25.43 secs: 6297 bytes ==> / HTTP/1.1 200 25.44 secs: 6297 bytes ==> / HTTP/1.1 200 25.45 secs: 6297 bytes ==> / HTTP/1.1 200 25.55 secs: 6297 bytes ==> / HTTP/1.1 200 25.79 secs: 6297 bytes ==> / HTTP/1.1 200 25.80 secs: 6297 bytes ==> / HTTP/1.1 200 25.91 secs: 6297 bytes ==> / HTTP/1.1 200 26.13 secs: 6297 bytes ==> / HTTP/1.1 200 26.30 secs: 6296 bytes ==> / HTTP/1.1 200 26.57 secs: 6296 bytes ==> / HTTP/1.1 200 27.67 secs: 6297 bytes ==> / HTTP/1.1 200 27.68 secs: 6297 bytes ==> / HTTP/1.1 200 28.52 secs: 6296 bytes ==> / HTTP/1.1 200 28.50 secs: 6297 bytes ==> / HTTP/1.1 200 28.55 secs: 6297 bytes ==> / HTTP/1.1 200 28.89 secs: 6297 bytes ==> / warning: socket: 1831987536 select timed out: Connection timed out warning: socket: 1748060496 select timed out: Connection timed out warning: socket: 1664133456 select timed out: Connection timed out warning: socket: 1605384528 select timed out: Connection timed out warning: socket: 1471101264 select timed out: Connection timed out warning: socket: 1303247184 select timed out: Connection timed out warning: socket: 1538242896 select timed out: Connection timed out warning: socket: 1236105552 select timed out: Connection timed out warning: socket: 1437530448 select timed out: Connection timed out warning: socket: 1403959632 select timed out: Connection timed out warning: socket: 1454315856 select timed out: Connection timed out warning: socket: 1840380240 select timed out: Connection timed out warning: socket: 1706096976 select timed out: Connection timed out warning: socket: 1185749328 select timed out: Connection timed out
En quelques secondes, mon serveur était down... impossible d'acceder au site, impossible aussi de se connecter en ssh... seul la réponse au ping était encore fonctionnelle. et là ca commence à faire peur.. en fait n'importe quel serveur peut etre saturé, par le moindre petit malin... Cette situation n'est pas tolérable, on ne peut pas laisser un serveur ainsi... après avoir longuement cherché et réfléchi sur un moyen de contrer ce probleme... je suis tombé sur un module d'apache des plus interessant: le mod_evasive :permet de détecter les floods et les tentatives de déni de service (DOS). Ce module renvoie des erreurs HTTP 403 lorsque le seuil de sollicitation du serveur apache par IP a été dépassé. c'est la solution. Le bandit à force de connexion répétée aura un joli placard erreur 403 et sera blacklisté un moment. 1- Télécharger le mod_evasive sur le site officiel http://www.zdziarski.com/projects/mod_evasive/ 2- Installation Nous allons utiliser l'outil apxs d'apache (apxs is a tool for building and installing extension modules for the Apache HyperText Transfer Protocol (HTTP) server) En effet c'est un outil qui permet d'installer proprement un module dans apache De base je n'avais pas la commande apxs
apt-get install apache2-threaded-dev
tar xvfz mod_evasive_1.10.1.tar.gz cd mod_evasive /usr/bin/apxs2 -i -a -c mod_evasive20.c #Module pour apache2
il faut à présent paramétrer le fichier apache2.conf. ( apxs est censé le faire, mais je pense qu'il cherche un httpd.conf qui n'est pas présent sur une distribution Ubuntu) voiçi les ligne à rajouter dans le fichier de conf d'apache.
LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so DOSHashTableSize 3097 DOSPageCount 2 DOSSiteCount 50 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 10 DOSWhitelist 127.0.0.* DOSEmailNotify admin@votredomaine.fr DOSSystemCommand "/bin/echo %s >> /var/log/apache2/evasive/evasive.log && /bin/date >> /var/log/apache2/evasive/evasive.log" DOSLogDir "/var/log/evasive"
Explications : DOSSiteCount : Le nombre maximal de requêtes qu'une adresse IP source peut réaliser sur le même enfant pendant une unité de temps sans être ajoutée à la liste noire. DOSSiteInterval : L'unité de temps (en secondes) évoquée dans la directive DOSSiteCount. La valeur par défaut est d'une seconde. DOSPageCount : Le nombre maximal de requêtes qu'une adresse IP source peut réaliser sur la même ressource (même URL) pendant une unité de temps sans être ajoutée à la liste noire. DOSPageInterval : L'unité de temps évoquée dans la directive DOSPageCount. DOSBlockingPeriod : Désigne la durée pendant laquelle tous les accès des adresses IP en liste noire seront refusés et recevront une erreur 403. Par défaut, cette durée est de 10 secondes. DOSEmailNotify : Précise une adresse email à laquelle envoyer un courriel lorsqu'une adresse IP est ajoutée en liste noire. (Attention de bien positionner MAILER dans les sources du module pour utiliser cette directive). DOSSystemCommand : Une commande à appeler pour, par exemple, ajouter l'adresse en liste noire sur un routeur. DOSWhiteList : Spécifie une adresse IP à ne jamais positionner en liste noire. Il est courant de positionner cette option à 127.0.0.* pour éviter de bloquer nos éventuels propres accès récursifs ou autres robots de référencement. En production, cette option ne devrait jamais être utilisée pour désigner un réseau d'utilisateurs humains légitimes : les mécanismes internes du module garantissent que le trafic légitime ne sera pas bloqué. Cette directive peut être positionnée plusieurs fois avec divers arguments, ceux-ci seront cumulés dans la configuration. (cf system-linux.eu) redemarrer apache
/etc/init.d.apache2 restart
Vous pouvez verifier tout de meme dans votre server-info que le module est bien chargé. Dernier petit test sur un de mes forums...
root@sd-15226:~# siege -d1 -r300 -c100 http://forum.info16.fr ** SIEGE 2.69 ** Preparing 100 concurrent users for battle. The server is now under siege... HTTP/1.1 200 0.16 secs: 5178 bytes ==> / HTTP/1.1 200 0.19 secs: 5178 bytes ==> / HTTP/1.1 200 0.19 secs: 5178 bytes ==> / HTTP/1.1 200 0.20 secs: 5178 bytes ==> / HTTP/1.1 200 0.21 secs: 5178 bytes ==> / HTTP/1.1 200 0.20 secs: 5178 bytes ==> / HTTP/1.1 200 0.20 secs: 5178 bytes ==> / HTTP/1.1 200 0.20 secs: 5178 bytes ==> / HTTP/1.1 200 0.29 secs: 5178 bytes ==> / HTTP/1.1 200 0.31 secs: 5178 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 200 0.36 secs: 5178 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 200 0.38 secs: 5178 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.23 secs: 351 bytes ==> /
on remarque bien qu départ la réponse 200 de apache qui stipule que tout va bien, mais quand le nombres de connexions dépasse le taux définit par le module evasive on obtient une erreur 403. l'ip est balclistée durant un temps défini.

Information sur bartounet auteur de l'article

Les commentaires sont fermés.