problem:
wirusy z uporem godnym wyższej sprawy probują rozesłać się za pomocą emaili z wykonywalnymi zalącznikami (lub zipami), powoduje to znaczny przyrost logów pocztowych oraz bezsensowne wykorzystanie mocy
rozwiązanie (częściowe):
skrypt uruchamiany przez crona co 10 minut zdejmuje zalożone przed godziną filtry pakietów, przeszukuje log pocztowy z poprzednich 10 minut poszukując wpisu o zablokowanym emailu zawierającym wykonywalne zalaczniki (lub zipy), jesli taki znajdzie, dopisujee regułę dla zalożenia filtra pakietu na źrodłowy adres ip z którego pochodził zablokowany email (do pliku opisanego zmienną $CBS) oraz dopisuje regułę która za godzinę zdejmie filtr (do pliku opisanego zmienną $RBS); skrypt na koniec zakłada wygenerowane filtry
komentarz:
rozwiązanie jest mocno totalitarne, znacznie ogranicza próby wysłania wykonywalnych załącznikow oraz obniża ilość "szumu" w logach pocztowych; blokuje rownież ip niewinnych userów ktorym sie przydarzyło wysłać emaila z wykonywalnym załącznikiem (lub zipem); blokada trwa co prawda tylko godzinę a odpowiednio skonfigurowany postfix informuje o tym co się stało i dlaczego
--- początek /root/bin/block-mail-spammers ----
#! /bin/bash
sleep 1
TIMENOWS=`date +%s`
((GREPTIMED = $TIMENOWS % 600 ))
((GREPTIMES = $TIMENOWS - $GREPTIMED))
((GREPTIMESD = $GREPTIMES - 1))
GREPSRTINGR=`date --date="1970-01-01 00:00:00 UTC +$GREPTIMESD sec" +%b" "%e" "%H":"%M`
GREPSTRING=`echo "$GREPSRTINGR" | cut -c 0-11`
RULESTRING=`echo "$GREPSRTINGR" | cut -c 11`
case "$RULESTRING" in
0)
FFN="0"
;;
1)
FFN="1"
;;
2)
FFN="2"
;;
3)
FFN="3"
;;
4)
FFN="4"
;;
5)
FFN="5"
;;
*)
echo "something goes wrong FFN=$FFN, exiting" >> /var/log/block-mail-spammers.log && exit 0
;;
esac
RBS="/root/bin/remove-block-spammer-$FFN"
CBS="/root/bin/create-block-spammer-$FFN"
touch "$RBS" && chmod u+x "$RBS"
touch "$CBS" && chmod u+x "$CBS"
"$RBS"
rm "$RBS" && touch "$RBS" && chmod u+x "$RBS"
grep "$GREPSTRING" /var/log/mail | grep "reject: header"| grep "\?\?name="| sed -e 's/.*\(name=\".*\"\)[ ]\(from[ ].*\)\[\(.*\)\]\;[ ].*/\3 \1/g' | sort | uniq --check-chars=15 | awk '{print "#"$1" "$2"\niptables -I INPUT -s "$1"/32 -p tcp --dport 25 -j DROP"}'| tee $CBS | sed -e 's/ -I / -D /g' > $RBS
$CBS
rm $CBS
---- koniec /root/bin/block-mail-spammers ----
do crona dodajemy wpis ktory loguje nam aktualny stan blokady i uruchamia skrypt:
00,10,20,30,40,50 * * * * (date && iptables -L INPUT -vnx) >> /var/log/block-mail-spammers.log && /root/bin/block-mail-spammers
powyższe logowanie nie jest zbyt szczęśliwe jeśli w łańcuchu INPUT pojawiają sie reguły z innych źródeł, ale lepsze takie niż żadne
23.11.2004