Retour au blog

Comment vérifier rapidement si votre site web est protégé contre les attaques DoS ?

2022-02-195 min de lecture

L'objectif de ce guide rapide est d'expliquer comment effectuer un test de charge sur votre site et observer son comportement sous une charge extrême. L'outil Open Source que nous utilisons pour ce test est l'outil de benchmarking HTTP wrk.

Qu'est-ce qu'une attaque par déni de service (DoS) :

Un déni de service (DoS) est un type d'attaque où l'attaquant empêche les utilisateurs autorisés d'accéder à un service. La méthode la plus courante de DoS consiste à inonder le service avec tellement de trafic ou de requêtes de données que le service ne peut pas répondre aux utilisateurs légitimes tant que le flux malveillant n'a pas été arrêté. Nous utiliserons l'outil de benchmarking HTTP, wrk, pour émuler ce type d'attaque.

En informatique, qu'est-ce qu'un benchmark :

Selon wikipedia, un benchmark est :

En informatique, un benchmark est l'acte d'exécuter un programme informatique, un ensemble de programmes ou d'autres opérations, afin d'évaluer les performances relatives d'un objet, normalement en exécutant un certain nombre de tests et d'essais standard sur celui-ci. Le terme benchmark est également couramment utilisé pour les programmes de benchmarking eux-mêmes, conçus de manière élaborée.

Deux caractéristiques clés d'un benchmark sont :

  1. Il doit être reproductible.
  2. Il doit être quantifiable.

Qu'est-ce que wrk :

Pour exécuter le test de charge sur notre site web, nous utilisons wrk, selon leur documentation officielle :

wrk est un outil moderne de benchmarking HTTP capable de générer une charge significative lorsqu'il est exécuté sur un seul CPU multi-cœur. Il combine une conception multithread avec des systèmes de notification d'événements évolutifs tels que epoll et kqueue.

wrk est open source, mais avant de l'utiliser, jetez un œil à l'avis de cryptographie sur https://github.com/wg/wrk#cryptography-notice

Comment installer wrk

Ok, nous allons enfin commencer les tests. Assurez-vous d'être à l'aise pour exécuter des commandes dans le terminal, car il n'y a pas d'interface graphique pour exécuter wrk pour le moment.

  • Comment installer wrk sur Mac

    • Installez homebrew, exécutez la commande suivante dans un terminal :
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    • Pour installer wrk, exécutez la commande suivante dans un terminal :
brew install wrk

  • Comment installer wrk sur la distribution Linux Ubuntu

sudo apt-get update
sudo apt-get install wrk

  • Comment installer wrk sur Windows

Les utilisateurs de Windows devront d'abord installer Ubuntu via ce lien et exécuter ensuite les deux commandes ci-dessus.

Comment tester la charge de votre site

L'utilisation de base de wrk ressemble à ceci :

wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html

Les options de ligne de commande valides sont :

-c, --connections: nombre total de connexions HTTP à maintenir ouvertes avec
                   chaque thread gérant N = connexions/threads

-d, --duration:    durée du test, par exemple 2s, 2m, 2h

-t, --threads:     nombre total de threads à utiliser

-s, --script:      script LuaJIT, voir SCRIPTING

-H, --header:      en-tête HTTP à ajouter à la requête, par exemple "User-Agent: wrk"

    --latency:     afficher des statistiques de latence détaillées

    --timeout:     enregistrer un timeout si une réponse n'est pas reçue dans
                   ce laps de temps.

Je vais exécuter un benchmark pendant 90 secondes, en utilisant 10 threads, et en maintenant 100000 connexions HTTP ouvertes.

wrk -t10 -c100000 -d90s https://davidloor.com --timeout 3s --latency -H 'Client: wrk terminal'

Explication rapide de ce que je fais avec les options passées :

-t10 : Utiliser dix threads séparés
-c100000 : Ouvrir 100000 connexions
-d90s : Exécuter le test pendant quatre-vingt-dix secondes
https://davidloor.com Le site web cible
--timeout 3s : Définir un timeout de trois secondes
--latency : afficher des statistiques de latence détaillées
-H 'Client: wrk terminal' : Passer un en-tête Client

Ainsi, on peut dire que le test de charge tente d'émuler 100000 utilisateurs ouvrant la page d'accueil du site web plusieurs fois pendant 90 secondes.

Important : Pendant l'exécution du test de charge, ouvrez le site web et essayez également de vous connecter (si le site web en a la possibilité), si le site se charge rapidement comme d'habitude, vous pouvez supposer qu'il est protégé contre les attaques DoS simples et que le serveur est capable de gérer une charge importante. Si le site met du temps à se charger, ou affiche une erreur, vous avez un problème avec le site web et vous devriez contacter votre hébergeur à ce sujet. Dans certains cas, le site ne pourra pas se rétablir de lui-même et pourrait nécessiter le redémarrage de certains services.

Analyser la sortie

Après avoir exécuté la commande, j'obtiens ceci :

Running 2m test @ https://davidloor.com
  10 threads and 100000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   528.12ms  527.33ms   2.99s    87.92%
    Req/Sec    20.30     16.93   116.00     74.75%
  Latency Distribution
     50%  356.27ms
     75%  638.27ms
     90%    1.20s 
     99%    2.62s 
  11662 requests in 1.50m, 735.63MB read
  Socket errors: connect 97681, read 117, write 0, timeout 1581
Requests/sec:    129.43
Transfer/sec:      8.16MB

Cela donne un résumé rapide sur la durée du test et le site web (https://davidloor.com) qui a été testé. Il montre également les paramètres de distribution normaux pour la latence et les Req/Sec. Il indique qu'en 1,5 minute, wrk a effectué 11662 requêtes et transféré 735,63 Mo de données.

Les valeurs moyennes de latence et de Req/Sec sont-elles bonnes ? Cela dépend de chaque situation individuelle. Nous devrions toujours essayer de maintenir la latence basse et les Req/Sec élevées, et vous devez garder à l'esprit que plus le nombre de connexions est élevé, plus ces 2 valeurs seront basses.

Conclusions

  1. Vous pouvez tester rapidement la charge de votre site avec wrk. https://github.com/wg/wrk
  2. La commande pour exécuter un test de charge, après avoir installé wrk, est : `wrk -t10 -c100000 -d90s https://davidloor.com –timeout 3s –latency -H ‘Client: wrk terminal’`
  3. Exécutez la commande wrk, et en même temps, essayez de charger le site dans votre navigateur et voyez si vous rencontrez des ralentissements.
  4. Il existe des ressources gratuites pour améliorer les performances de votre site web sans ajouter plus de ressources aux serveurs, comme l'utilisation d'un CDN gratuit, tel que cloudflare.
  5. Si vous avez un CDN, assurez-vous de l'utiliser pleinement.

Avis de non-responsabilité : Les informations disponibles dans cet article de blog sont uniquement à des fins éducatives. Je ne suis pas responsable de la manière dont vous utilisez les informations ici.