[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