[Techinfo] szerver spam listan

ka at mayten.sch.bme.hu ka at mayten.sch.bme.hu
2016. Sze. 22., Cs, 22:44:10 CEST


Udv,

On 09/22/2016 18:26, Molnár Péter wrote:
> Hello!
>>En be szoktam allitani egy kvotat, ami felett a levelkuldes
>> sajnos sikertelen, helyes adatokkal is.
> S ezt hogyan, mivel?
>

Nem kulonosebben komplikalt, amde cserebe fapados.  Az MTA nagyjabol 
lenyegtelen, a lenyeg, hogy SQL-bol veszi az azonositashoz az adatokat.

A normal, kvota nelkuli lekerdezes ehhez olyan, hogy:

{crypteq{$2}{\\{sha1\\}${lookup mysql{SELECT user_md5 from user WHERE 
user_name='${local_part:$1}' AND 
user_domain='${domain:$1}'}{$value}fail}}} \
         } {yes}{no}}"

(ebbol azonnal nyilvanvalo harom dolog: az egyik, hogy eximet hasznalok, 
a masik, hogy nemreg tertem at md5-rol sha1 hash-ekre, a harmadik, hogy 
lusta vagyok).

Ehhez csak egy mozdulat beletenni olyat, hogy AND valid=1, nyilvan a 
semat es modositani kell hozza, valahogy igy:

 > alter table user add column valid int default 1;

Ha ez megvan, akkor ideje kimazsolazni a logokbol, hogy mely 
felhasznalok kuldenek levelet, es ezt rogziteni:

$ for i in `grep esmtpsa /var/log/exim/mainlog | awk '{print$5}'`; do 
echo "insert into senders values (now(), '$i');" | mysql <parameterek>; done

amint ez megvan, innentol kezdve mar csak egy mozdulat sorrendezni, hogy 
kik voltak a nagy levelkuldok:

 > select distinct sender, count(sender) as s from senders where 
ts>=date_add(now(), interval -1 hour) group by sender having s>30 order 
by s desc;

Ugord at ezt a bekezdest, ha vilagos.  Ha nem, akkor a fenti query ket 
oszlopot es nulla vagy tobb sort ad vissza.  Az elsoben a felhasznalok 
nevet (distinct sender), amivel azonositjak magukat, a masodikban egy 
darabszamot (count sender as s), ahanyszor az elmult oraban (where ts >= 
az elmult egy ora) levelet kuldtek.  A listaban csak azok szerepelnek, 
akik legalabb 31 levelet kuldtek az elmult oraban (having s>30).  A 
lista a level darabszam szerint csokkeno sorrendben van (order by s 
desc).  Ez utobbi irrelevans a script szamara, ez az embernek erdekes 
aki mondjuk kezzel is akarja neha futtatni ezt az egy parancsot, hogy 
lassa mi a szitu.

A 31 egy gyakorlati uton megallapitott szam.  Amennyiben per-user akarod 
megallapitani, vagy subselect-et kell hasznalni, vagy scriptelni kell 
felhasznalonkent a fenti lekerdezest.  A script szempontjabol amugy a 
masodik oszlop is full felesleges es egyszerubb az elet, ha nincs is ott.

Innentol mar csak egy mozdulat egy scriptbe tenni az egeszet es 
kiegesziteni:

for i in `<az elozo query eredmenye>`; do echo "update user set valid=0 
where user_name='$i';" | mysql <parameterek>; done

Ennyi.  tada.wav.

Nehany eszrevetel:

- cron-ba ne felejtsd el beletenni, hogy a nullazott felhasznalokat 
idonkent visszaengedd (update valid=1)

- az, hogy milyen gyakran akarod futtatni a scriptet attol fugg, mekkora 
a levelforgalmad (a grep nagy file-okon cpu intenziv)

- ergo minel nagyobb a levelforgalmad, annal gyakrabban akarod futtatni, 
de ekkor tegyel bele egyeb szuroket is: peldaul csak az utolso tizezer 
soron futtatni: tail -n 10000 | grep ... mert ilyenkor kisebb 
mennyiseget kell a grep-nek atnyalaznia

- ha megfigyeled, nincs rogzitve az idopontja annak, valaki mikor lett 
kitiltva.  Ez lehet, hogy nalad problema, nalam nem olyan jelentos, hogy 
foglalkozzak vele.

Ha kerdes van, batran.

udv
adam


-- 


udv
Adam


További információk a(z) Techinfo levelezőlistáról