Montée en charge d’un serveur Apache et DOS,DDOS
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.



Merci pour ce tuto très enrichissant
bonjour
merci pour ce tuto très intéressant. Je vais tester cela sur ma dedibox
tu es bien en ubuntu ? pourquoi passes tu le tar.gz plutot que par apt-get pour le module evasive ?
comme tu es sur WordPress, je te suggère d’activer les permaliens pour avoir des URL parlantes plutôt que http://blog.info16.fr/?p=139.
c’est plus convivial et permet un meilleur référencement naturel
donald
C’est vrai que j’aurais put utiliser le paquet ubuntu.
Comme j’ai souvent l’habitude de bosser sous Suse, j’ai plutot tendance à compiler, mais tu as tout à fait raison, si on peut autant installer le paquet.
Merci pour ton report, mais c’est vrai que sur ton serveur mutualisé, j’ose espérer que OVH fait le necessaire contre les DOS
Je viens de t’assiéger
mais je me suis découragé après 20 secondes.
siege -c 5 -t20S -d 5 http://www.info16.fr
…/…
Lifting the server siege… done.
Transactions: 56 hits
Availability: 100.00 %
Elapsed time: 19.80 secs
Data transferred: 0.34 MB
Response time: 11.02 secs
Transaction rate: 2.83 trans/sec
Throughput: 0.02 MB/sec
Concurrency: 31.18
Successful transactions: 56
Failed transactions: 0
Longest transaction: 18.62
Shortest transaction: 2.53
100% de réponses avec le code 200. Joli score
j’ai testé sur mon hébergement gandi (juste avec firefox et en agrandissant le DOSPageInterval), l’ip est bien en blacklist, j obtiens une erreur, par contre la commande ne marche pas
J’ai pourtant :
DOSSystemCommand « /bin/echo %s /var/log/mod_evasive/dos_evasive.log »
Le fichier est bien créé avec des droits 0777 au cas où bref je vois pas trop quoi faire
qqun a une idée ?
I really like your blog and i respect your work. I’ll be a frequent visitor.