Se intampla ca un adolescent mai rebel sau mai tampicutz de fel , in loc sa se duca la munca sa-si castige existenta, cauta pe net tot felul de programe gen brute force si incepe sa lovesca in site-uri pe platforma gen wordpress , prestashop , joomla , etc.
Sunt multe pluginuri pentru asa ceva , dar pentru cei care detin serverul personal pot scrie un guardian care sa urmareasca in jurnale in tim real acest comportament , si sa baneze ip direct in iptables dupa 3 incercari de login in interval de 1 minut, sau dupa caz
In situatia mea jurnalele se duc in other_hosts , dupa caz se poate altera.
Detectia se face pe criteriul ca un ip nu are de ce sa acceseze cu GET sau POST fisierul /wp-login.php de 3 ori intr-un minut decat daca nu stie password sau incearca brute force.
se poate scrie si un fisier de exceptii pe care sa le ignore cum ar fi (192.168.5.20. 127.0.0.1) samd
la linia grep "GET /wp-login.php" se poate adauga orice login din alte platforme , bineinteles cu oarece modificari suplimentare , si atunci poate deveni o platforma universala anti brute force
Din pacate , scriptul citeste cam des jurnalul ceea ce implica o oarece caldura suplimentara , pe viitor voi utiliza inotify
pentru citirea other_hosts.
Ca acest script sa functioneze , trebuie creat la start un chain si un jump in iptables
Eu prefer sa nu fac iptables-save , ci sa reload tabela mea personala la fiecare reboot si anume
in /etc/rc.local scriem inainte de exit 0
sudo iptables -N wpress_login; sudo iptables -t filter -A INPUT -j wpress_login cd /path_to_script/ ; ./guard.sh & # start script backgrounded
#!/bin/bash if [ "$(ls firewalled)" == "" ] ;then echo "" >firewalled fi sudo ./rebuild_firewall.sh function flush_da_shit { bann=$(echo $ip | sed 's/.* //g') echo "banned "$bann sudo iptables -A wpress_login -s $bann -j DROP echo "Subject: "$(date '+%Y_%m_%d') WPress Server Guardian > warn.mail echo "" >>warn.mail echo "WordPress Guardian by linux-romania.com" >> warn.mail echo "WP guardian has banned "$bann" for a very long time" >> warn.mail /usr/sbin/sendmail -v address@domain.com < warn.mail } while true do grep "GET /wp-login.php" /var/log/apache2/other_vhosts_access.log | tail -n 50 > /dev/shm/last_apache grep "POST /wp-login.php" /var/log/apache2/other_vhosts_access.log | tail -n 50 >> /dev/shm/last_apache cut -d ' ' -f1-3 /dev/shm/last_apache | sed 's/:/xxx/3;s/xxx.*]//1;s/\[//g' |sort > /dev/shm/wp-admin.list for x in $(seq 1 $(cat /dev/shm/wp-admin.list | wc -l)) do ip=$(sed ''$x'!d' /dev/shm/wp-admin.list ) if [ "$(cat firewalled | grep "$(echo $ip | sed 's/.* //g')")" == "" ] && [ "$(grep "$ip" /dev/shm/wp-admin.list | wc -l)" -gt "3" ] ;then echo $ip >> firewalled ;flush_da_shit fi sleep 0.1 done sleep 0.1 done