sudo apt update && sudo apt upgrade && sudo apt-get install -y fail2ban
sudo nano /etc/fail2ban/filter.d/npm.conf
Et on insert ces deux regex qui va permettre de detecter et capturer dans les logs les bonnes lignes.
[INCLUDES]
[Definition]
failregex = ^<HOST>.+" (4\d\d|3\d\d) (\d\d\d|\d) .+$
^.+ 4\d\d \d\d\d - .+ \[Client <HOST>\] \[Length .+\] ".+" .+$
sudo nano /etc/fail2ban/action.d/docker-action.conf
Dans ce fichier on indique quelles actions seront executées quand la detection se déclenchera, ça va ajouter et supprimer des filtres iptables bloquant ou débloquant des IPs spécifiques via la chaîne f2b-npm-docker.
[Definition]
actionstart = iptables -N f2b-npm-docker
iptables -A f2b-npm-docker -j RETURN
iptables -I FORWARD -p tcp -m multiport --dports 0:65535 -j f2b-npm-docker
actionstop = iptables -D FORWARD -p tcp -m multiport --dports 0:65535 -j f2b-npm-docker
iptables -F f2b-npm-docker
iptables -X f2b-npm-docker
actioncheck = iptables -n -L FORWARD | grep -q 'f2b-npm-docker[ \t]'
actionban = iptables -I f2b-npm-docker -s <ip> -j DROP
actionunban = iptables -D f2b-npm-docker -s <ip> -j DROP
Ici on liste les conditions pour les bans. 3 tentatives en moins de 60 minutes fera ban l'IP en question.
Pensez à externaliser les logs de Nginx Proxy Manager s'il tourne en docker pour les indiquer dans le logpath
et à ajouter les IP à ignorer.
[npm]
enabled = true
chain=INPUT
maxretry = 3
bantime = 48h
findtime = 60m
logpath = /.../logs/default-host_*.log
/.../logs/proxy-host-*.log
/.../logs/fallback*.log
action = docker-action
ignoreip = 192.168.1.0/24
On peut visualiser le status du jail npm qu'on vient d'ajouter avec
sudo fail2ban-client status npm
Exemple de retour :
Status for the jail: npm
|- Filter
| |- Currently failed: 3
| |- Total failed: 27
| `- File list: /.../logs/default-host_error.log /.../logs/default-host_access.log ...
`- Actions
|- Currently banned: 6
|- Total banned: 6
`- Banned IP list: xxx.xxx.xxx.xxx
sudo fail2ban-client set npm banip xxx.xxx.xxx.xxx
Dans npm.local
:
sudo nano /etc/fail2ban/jail.d/npm.local
on va rajouter ce bloc :
[npm-crawlers]
enabled = true
port = http,https
filter = npm-crawlers
logpath = /.../logs/default-host_*.log
/.../logs/proxy-host-*.log
/.../logs/fallback*.log
bantime = 24h
findtime = 10m
maxretry = 2
On va ensuite créer un nouveau filter :
sudo nano /etc/fail2ban/filter.d/npm-crawlers.conf
[Definition]
failregex = \[Client <HOST>\].+"Mozilla/5.0 \(compatible; (AhrefsBot|MJ12bot|bingbot|CensysInspect|python-httpx|Python|SemrushBot|DotBot|B>
On bloquera ainsi les crawlers de type :
✅ SEO :
AhrefsBot, MJ12bot, SemrushBot, DotBot, PetalBot, SeekportCrawler, SerpstatBot
✅ Moteurs de recherche non souhaités :
YandexBot, Sogou web spider, LinkpadBot, BUbiNG, 360Spider, MegaIndex, SeznamBot, DomainStatsBot, AspiegelBot
✅ Scrapers et extracteurs de données :
Scrapy, Go-http-client, Apache-HttpClient, Java/, curl/, Wget/, libwww-perl
✅ Outils de scanning et de hacking :
masscan, sqlmap, nmap, WinHttp, ZmEu, CheckHost, CensysInspect, Fuzz, Scan, probing
sudo systemctl restart fail2ban
On peut tester la regex voir si ça fonctionne avec son fichier de logs ou vous avez pu voir quelques crawlers :
sudo fail2ban-regex /.../logs/proxy-host-2_access.log /etc/fail2ban/filter.d/npm-crawlers.conf