16.1.07

Můj boj se spamem

Včera přišla stížnost od uživatele naší sítě, že mu nejde odeslat mail. Podíval jsem se, kde je problém - naše doména kobylnice.net byla na ban listu SMTP serverů. Začal jsem zjišťovat, o co jde. Relaying se zdál být v pořádku, zvenčí prostě nikdo poštu jen tak rozesílat nemohl. Díky radám na IRCnet#programatori jsem začal mít důvodné podezření, že jsme byli zabanováni kvůli spamu. Kdo ho však rozesílá? Do logů našeho poštovního serveru jsem se díval, nic zajímavého jsem však neobjevil. Pak mi to došlo - někdo na síti je napaden trojským koněm, který rozesílá poštu z vlastního SMTP serveru. Musel jsem zjistit, kdo.
Příkazem
tcpdump -i eth0 dst port 25 and not src host smtp.kobylnice.net and not src host m1c4a1.kobylnice.net
čili vše, co se chce spojit se SMTP servery a zároveň to není náš poštovní server ani já (osobně totiž vlastní SMTP server používám). Neošetřuje to možnost, že se něco zvenčí pokusí připojit na náš SMTP server, ale tolik pošty k nám zase nechodí, takže to jde profiltrovat "očně".
Tento příkaz jsem spustil s nohup na pozadí s logováním do souboru a nechal přes noc a část dne běžet. Potom se podívám a strnu - log byl přes 40MB velký, že se to nedalo ani pročítat. Vytvořil jsem si tedy v bashi jednoduchý skript, který jednodušše vypíše datum, odkdy dokdy sběr dat probíhal a hlavně počet odeslaných mailů na počítač (odeslané maily jsem rozpoznával podle SYN paketů, čili nových spojení, nemusí to být tedy přesné). Hříšníci se objevili dva - jeden měl na svědomí něco kolem 180 odeslaných mailů, druhý skoro 50000. Celkem síla. Pokud někdo potřebujete, skript je zde, jen ho bude třeba upravit pro vlastní použití. Jo a pokud tam vidíte nějaké podivné neekonomické konstrukce, pak je to tím, že v bashi dělám jednou za eon a holt v tom nemám takovou praxi:

vypis_casu () {
od=$(head -n 3 $TRAFFIC |tail -n 1 |awk {'print $1'})
do=$(tail -n 1 $TRAFFIC |awk {'print $1'})
echo "Maily odeslane od $od do $do"
}

# HLAVNI CAST SKRIPTU
TRAFFIC="mailservery_na_siti.log" # nazev souboru, kam byly zachytavany data
vypis_casu
tmp=$(cat $TRAFFIC |awk {'print $3 " " $6'} |grep S) # vygrepuje jen SYN pakety
users=$(echo "$tmp" |awk {'print $1'}|sed -e "s/\.kobylnice\.net\..*$//g") #vypise jmena nazvu pocitacu
usrs=$(echo "$users" |sort -u) # jedinecne vyskyty uzivatelu
for i in $(echo "$usrs"); do
pocet=$(echo "$users" |grep "$i" |wc -l)
echo "$i: $pocet mailu"
done

Poté, když jsem přišel na to, kdo šíří spam, bylo třeba ho zablokovat, respektive jeho konekci ven na port 25. To jsem udělal přidáním pravidla do firewallu:
iptables -I FORWARD -p TCP --dport 25 -s x.x.x.x -j DROP #místo x.x.x.x si dosaďte IP adresu
Tím se tok spamu ven zastavil... ještě chvilku jsem viděl zmítání nebohého viru odesíláním SYN paketů, na které nedocházela zpět odpověď a už se odmlčel. Samozřejmě bude muset uživatel vir odstranit, protože ten traffic zbytečně flooduje síť.
Boj s virem jsem vyhrál, ale na jak dlouho? Může se objevit další a další nakažený počítač. Přemýšlím, že zablokuji konekce na port 25 celkově a tomu, kdo bude chtít, to povolím; vždyť kolik normálních uživatelů ví, co je to SMTP a kolik jich potřebuje vlastní SMTP server? Ale to až se mi bude chtít, jsem línej. :)

Žádné komentáře: