Portál AbcLinuxu, 26. dubna 2024 18:27

fail2ban a apache

7.3.2015 18:26 | Přečteno: 1096× | poslední úprava: 7.3.2015 21:00

Na mojom webe www.oma.sk sa občasne vyzurujú nejaký crawleri. Trošku mi uniká dôvod prečo si taliani sťahujú webstránku po Slovensku a po slovensky, ale čo už. Ako sa brániť?

Skúšal som merať koľko ktorá IP zaberie času (trošku problém ukladať dáta medzi sessions ale APC pomohlo). Ale neriešilo to problém.

Momentálne sa snažím použiť fail2ban a blokovať tých čo využívajú veľa procesorového času. Potreboval som tri kroky: ukladať dĺžku spracovania requestu, zrátať za posledných 5 minút a blokovať.

Ukladanie dĺžky

zmena konfiguráku apache aby ukladal dĺžku čo trvalo spracovanie (teda najmä PHP a postgres). Niektoré stránky sú rýchlo (bo sú v cache), ale niektoré sú dosť pomalé.
LogFormat "%h - - %t %s %D %V%U" testovaci
CustomLog /var/log/httpd/test-oma.sk.log testovaci 
Rátanie celkovej dĺžky

do cronu daný shell skript (pričom číslo 212605775 je moja magická konštanta ktorá ešte neblokuje slušných robotov, ale blokuje tých zlých).
#!/bin/sh
export LC_ALL=en_GB.utf8
dd="%d/%b/%Y:%H:%M"
d0=`date +$dd`
d1=`date -d '1 minute ago' +$dd`
d2=`date -d '2 minute ago' +$dd`
d3=`date -d '3 minute ago' +$dd`
d4=`date -d '4 minute ago' +$dd`

da="$d0\|$d1\|$d2\|$d3\|$d4";
#echo $d
IFS="
";
d=`date --rfc-3339='seconds'`
#echo "$d :: 194.187.168.25" > /var/log/httpd/dos-oma.log

for i in `cat /var/log/httpd/test-oma.sk.log |grep -v '.ico\|.png\|.jpg\|.js' | grep "$da" | awk 'BEGIN { FS=OFS=SUBSEP=" "}{arr[$1]+=$7 }END {for (i in arr) print arr[i],i}' |sort -g|tail`; do
        l=`echo $i | sed 's/ .*//'`
        if [ `echo "$l > 212605775" |bc` -eq 1 ]; then
                echo $i | sed "s/.* /$d :: /" >> /var/log/httpd/dos-oma.log
        fi
done
Fail2ban konfig

Naj problém bol dať dátum/čas do logu, aby to fail2ban zvládal (viď date --rfc-3339='seconds' hore), nie je to moc dokumentované. Potom to už šlo. Filter filter.d/apache-dos.filter :
[Definition]
failregex = ^.* <HOST>$
a jail (popri ostatných typu ssh a pod):
[oma-dos]
enabled = true
filter  = apache-dos
port     = http,https
logpath  = /var/log/httpd/dos-oma.log
maxretry = 1
findtime = 60
asi by to išlo aj elegantnejšie, teším sa na komentáre.        

Hodnocení: 67 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

Bystroushaak avatar 7.3.2015 22:30 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: fail2ban a apache
Odpovědět | Sbalit | Link | Blokovat | Admin
Na mojom webe www.oma.sk sa občasne vyzurujú nejaký crawleri. Trošku mi uniká dôvod prečo si taliani sťahujú webstránku po Slovensku a po slovensky, ale čo už. Ako sa brániť?
Spíš mi uniká důvod, proč se tomu bránit. Většina těhle crawlerů jsou vyhledávače a tímhle efektivně odřízneš ty italské.
blog.rfox.eu
7.3.2015 22:55 michal00 | skóre: 14 | blog: OpenStreetMap
Rozbalit Rozbalit vše Re: fail2ban a apache
lebo desiatky veľmi drahých requestov za sekundu?

rozumní roboti sú v ok, ale niektorí urobia 100x viac requestov ako googlebot/bingbot/... dokopy.
Bystroushaak avatar 7.3.2015 23:15 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: fail2ban a apache
Tak pokud jsou ty requesty tak drahé, tak ano, to potom chápu. Ale spíš bych se asi zamýšlel, jak je zlevnit.
8.3.2015 13:22 azurIt | skóre: 34 | blog: zatial_bez_mena
Rozbalit Rozbalit vše Re: fail2ban a apache
Odpovědět | Sbalit | Link | Blokovat | Admin
Len 'maly detail': %D nie je procesorovy cas.
8.3.2015 21:59 michal00 | skóre: 14 | blog: OpenStreetMap
Rozbalit Rozbalit vše Re: fail2ban a apache
malo by to byť The time taken to serve the request, in microseconds., teda koľko času stránka trvala (vrátane PHP a SQL). asi to dobre reprezentuje zaťaženie servera.
9.3.2015 15:53 azurIt | skóre: 34 | blog: zatial_bez_mena
Rozbalit Rozbalit vše Re: fail2ban a apache
NIE JE to procesorovy cas a vobec to nereprezentuje zatazenie serveru :) urob si PHP skript, kde bude len sleep(1000) a pochopis, o com hovorim (a taketo 'nicnerobenie' nemusi byt len umelo vyvolane).

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.