DoS et DDoS
Déni de service (DoS) et DDoS : Comprendre et se protéger
Notions théoriques
Un déni de service (DoS) est une attaque informatique qui vise à rendre un service indisponible en le surchargeant de requêtes.
L'attaque par déni de service a pour objectif est d'empêcher les utilisateurs légitimes d'accéder à un site Web, une application ou un serveur.
Comment fonctionne une attaque DoS ?
Une attaque DoS consiste à envoyer une grande quantité de requêtes vers une cible (serveur, site web, API) pour saturer ses ressources (processeur, mémoire, bande passante).
Résultat : le service devient lent ou totalement inaccessible.
Différence entre DoS et DDoS
-
DoS (Denial of Service) : Une seule machine attaque une cible.
-
DDoS (Distributed Denial of Service) : Plusieurs machines attaquent une cible simultanément.
Les machines, qui attaquent une cible simultanément, sont souvent des ordinateurs infectés (botnets) contrôlés à distance par un attaquant.
Types d'attaques DoS/DDoS
- Saturation de la bande passante : Envoi massif de données pour épuiser la connexion réseau.
- Saturation des ressources serveur : Envoi de requêtes complexes pour surcharger le CPU et la mémoire.
- Exploitation de vulnérabilités : Utilisation de failles pour provoquer un crash du service.
Conséquences d'une attaque DoS/DDoS
- Indisponibilité du service : Impossible d’accéder au site ou à l’application.
- Pertes financières : Une entreprise peut perdre des clients et de l’argent.
- Atteinte à la réputation : Un site souvent indisponible perd la confiance de ses utilisateurs.
Comment se protéger ?
- Limiter le nombre de requêtes par utilisateur avec un pare-feu ou un proxy.
- Utiliser un réseau de distribution de contenu (CDN) pour absorber le trafic.
- Détecter les comportements suspects avec un système de détection d’intrusion (IDS).
- Bloquer les adresses IP suspectes avec un pare-feu.
- Utiliser des services anti-DDoS comme Cloudflare, Akamai ou AWS Shield.
Exemple pratique
Cas concret : Une attaque DDoS sur un site web
Un site e-commerce est victime d’une attaque DDoS orchestrée par un groupe de hackers.
Déroulement de l’attaque :
- Les hackers infectent des milliers d’ordinateurs avec un malware, créant ainsi un botnet.
- À un moment précis, ils ordonnent à ces machines d’envoyer des millions de requêtes vers le site e-commerce.
- Le serveur du site, incapable de gérer autant de connexions, devient extrêmement lent puis cesse de répondre.
- Pendant plusieurs heures, les clients ne peuvent plus accéder au site, entraînant une perte de ventes importante.
Mesures de protection mises en place :
- L’entreprise utilise un CDN pour filtrer le trafic et absorber la surcharge.
- Un pare-feu est configuré pour bloquer les adresses IP suspectes.
- Un système de détection d’intrusion analyse le trafic et bloque automatiquement les requêtes anormales.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Serveur sous Debian - Attaquant sous Windows
Nous allons utiliser deux machines :
-
Serveur Web (Debian)
- Héberge un serveur web sur Debian.
- Subira l’attaque DoS.
-
Attaquant (Windows)
- Enverra un grand nombre de requêtes pour surcharger le serveur.
Mise en place du serveur
1️⃣ Se connecter à la machine Debian et mettre à jour les paquets :
sudo apt update && sudo apt upgrade -y
2️⃣ **Installe Python (si ce n’est pas déjà fait) :
sudo apt install python3 -y
3️⃣ **Lance un serveur web sur le port 8080 :
python3 -m http.server 8080
4️⃣ **Vérifie que le serveur fonctionne :
- Ouvre un navigateur sur Windows et accède à :
http://<IP_DU_SERVEUR>:8080
- Remplace
<IP_DU_SERVEUR>
par l’adresse IP de la machine Debian (ip a
pour la trouver). - Si tout fonctionne, tu devrais voir une liste des fichiers du répertoire courant.
Simulation d’une attaque DoS
Récupérer l’IP du serveur Debian
Sur la machine Debian, exécute :
ip a
Note l’adresse IP de l’interface réseau (ex. 192.168.1.100
).
Lancer l’attaque depuis Windows
1️⃣ **Ouvre un terminal PowerShell sur Windows (Win + R → powershell
)
2️⃣ **Exécute la commande suivante pour envoyer des requêtes en boucle :
while ($true) { Invoke-WebRequest -Uri "http://192.168.1.100:8080" }
(Remplace 192.168.1.100
par l’IP de ton serveur Debian.)
3️⃣ **Observe l’impact sur le serveur Debian :
- Le terminal où tourne le serveur affichera une série de requêtes.
- Le serveur peut ralentir ou cesser de répondre.
4️⃣ **Arrête l’attaque avec Ctrl + C
dans le terminal PowerShell.
Protection contre les attaques DoS
Nous allons maintenant mettre en place des protections sur le serveur Debian.
Limiter les connexions avec iptables
1️⃣ **Affiche les règles actuelles du pare-feu :
sudo iptables -L
2️⃣ **Ajoute une règle pour limiter les connexions par IP (ex. : 10 connexions max) :
sudo iptables -A INPUT -p tcp --dport 8080 -m connlimit --connlimit-above 10 -j REJECT
3️⃣ **Ajoute une règle pour limiter le taux de requêtes (ex. : 5 requêtes par seconde) :
sudo iptables -A INPUT -p tcp --dport 8080 -m limit --limit 5/second -j ACCEPT
4️⃣ **Vérifie que les règles sont bien appliquées :
sudo iptables -L -v
5️⃣ **Teste à nouveau l’attaque et observe si le serveur résiste mieux.
Bloquer les IP suspectes avec fail2ban
fail2ban
permet de bloquer automatiquement les IP qui envoient trop de requêtes.
1️⃣ **Installe fail2ban
:
sudo apt install fail2ban -y
2️⃣ **Crée un fichier de configuration pour surveiller les connexions sur le port 8080 :
sudo nano /etc/fail2ban/jail.local
Ajoute le contenu suivant :
[http-server]
enabled = true
port = 8080
filter = http-server
logpath = /var/log/syslog
maxretry = 10
findtime = 60
bantime = 300
3️⃣ **Redémarre fail2ban
pour appliquer les changements :
sudo systemctl restart fail2ban
4️⃣ **Teste à nouveau l’attaque et observe si l’IP de Windows est bloquée après plusieurs requ êtes.
Utiliser un proxy inverse (NGINX) pour filtrer les requêtes
Un proxy inverse comme NGINX peut être utilisé pour limiter le nombre de requêtes provenant d’une même IP.
1️⃣ **Installe NGINX :
sudo apt install nginx -y
2️⃣ **Ajoute une règle pour limiter les requêtes dans la configuration de NGINX :
sudo nano /etc/nginx/nginx.conf
Ajoute ces lignes dans la section http
:
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server {
listen 8080;
location / {
limit_req zone=one burst=10 nodelay;
}
}
3️⃣ **Redémarre NGINX pour appliquer les modifications :
sudo systemctl restart nginx
4️⃣ **Teste à nouveau l’attaque et observe si les requêtes sont limitées.
Vérification des protections
1️⃣ **Relance le serveur :
python3 -m http.server 8080
2️⃣ **Tente une attaque depuis Windows avec PowerShell.
- Si
iptables
est activé, les requêtes devraient être limitées. - Si
fail2ban
est activé, l’IP de Windows devrait être bloquée. - Si
NGINX
est activé, les requêtes devraient être filtrées.
3️⃣ **Vérifie les logs pour voir si les protections fonctionnent :
sudo iptables -L -v # Vérifier les règles du pare-feu
sudo fail2ban-client status http-server # Vérifier les IP bloquées
sudo tail -f /var/log/nginx/access.log # Voir les requêtes filtrées par NGINX
Conclusion et bonnes pratiques
Ce que nous avons appris :
✔️ Comment fonctionne une attaque par déni de service (DoS).
✔️ Comment simuler une attaque depuis Windows.
✔️ Comment observer l’impact sur un serveur sous Debian.
✔️ Comment mettre en place des protections efficaces :
- Pare-feu (
iptables
) : Limite le nombre de connexions et le taux de requêtes. fail2ban
: Bloque automatiquement les IP suspectes.- Proxy inverse (
NGINX
) : Filtre et limite les requêtes.
Bonnes pratiques pour protéger un serveur web contre DoS/DDoS :
✔️ Utiliser un pare-feu pour limiter le trafic suspect.
✔️ Activer fail2ban
pour bloquer les IP malveillantes.
✔️ Mettre en place un proxy inverse (NGINX, Cloudflare) pour filtrer les requêtes.
✔️ Surveiller les logs pour détecter les attaques en temps réel.
✔️ Utiliser un service anti-DDoS (Cloudflare, AWS Shield, etc.) pour les sites critiques.