| Accueil | FAQ | Statistiques | Divers | Contact |
Sécurité : Linux : bloquer les attaques flood/DDoS HTTP avec ModSecurity
mod_security est un module souvent utilisé uniquement pour filtrer/rejeter des chaînes de caractères. Nous allons voir qu'il est capable de faire bien plus que cela, notamment de pouvoir bloquer des floods HTTP d'une manière plus efficace que des modules comme mod_evasive.
Afin de pouvoir rejeter ou blacklister les IP ayant un trop grand nombre de connexions, voici en détails 5 actions et 1 variable nécessaires pour cet usage.
Contrairement à deny qui, lui, retourne une page d'erreur HTTP (généralement un code 403), l'avantage de drop est d'économiser les ressources système et la bande passante en ne donnant pas suite à la requête.
N'oubliez pas bien entendu d'adapter cette règle aux besoins de votre serveur, notamment les pages appelées (REQUEST_LINE) ainsi que le nombre de requêtes tolérées.
cet article ne traite que des attaques HTTP, c'est à dire des requêtes multiples sur une ou plusieurs pages d'un serveur. Pour les attaques SYN flood, consultez Floodmon.
initcol:ip=%{REMOTE_ADDR}
setvar:ip.ddos=+1
deprecatevar:ip.ddos=100/10

Nous l'utiliserons pour les requêtes d'IP 'suspicieuses', c'est à dire ayant trop de connexions mais pas assez pour confirmer qu'il s'agit bien d'un flood, Dos ou DDos. Cela permettra d'éviter de blacklister un utilisateur un peu trop pressé/nerveux qui ouvrirait de nombreuses pages de votre site dans 10 onglets de son navigateur. Dans notre exemple, toute IP faisant plus de 25 requêtes par tranche de 10 secondes fera l'objet d'un drop et, comme nous l'avons vu avec deprecatevar, son compteur sera décrémenté de 100 unités passé ce délais, ce qui permettra à cet utilisateur de se calmer un peu :
SecRule IP:DDOS "@gt 25" "nolog,drop"
Important :
- drop ne fonctionne pas avec les versions de mod_security pour Windows !
- il est préférable d'utiliser nolog sinon chaque drop sera enregistré dans les logs de mod_security, ce qui pourrait provoquer un flood important des logs.
On log les requêtes bloquées sans risque de flooder les fichiers log puisque les IP seront immédiatement blacklistées par iptables.
SecRule IP:DDOS "@gt 50" "log,exec:/var/www/modsec2ipt.pl"
Important : ne tentez jamais d'autoriser Apache à accéder au firewall directement (sudoers, modification des privilèges etc) : en cas de vulnérabilité d'un script de votre site, un attaquant pourrait agir directement sur iptables comme bon lui semble et simplement depuis son navigateur.
SecRule REQUEST_LINE "^GET (?:/|.+\.html|.+\.php|.+\.cgi|.+\.pl) HTTP"
Règle générique :
SecAction initcol:ip=%{REMOTE_ADDR},nolog
SecRule REQUEST_LINE "^GET (?:/|.+\.html|.+\.php|.+\.cgi|.+\.pl) HTTP" \
"nolog,setvar:ip.ddos=+1,deprecatevar:ip.ddos=100/10"
SecRule IP:DDOS "@gt 50" "log,exec:/var/www/modsec2ipt.pl"
SecRule IP:DDOS "@gt 25" "nolog,drop"
![]()