sobota, 21 sierpnia 2010

Czyszczenie kolejki wiadomości w exim'ie

Dość często zdarza się, iż w kolejce mamy setki, a nawet tysiące wiadomości do wysłania. Zdarzyć się tak może z wielu powodów np.:
- jakiś spamer uruchomił skrypt spamerski na naszym serwerze i wysyła na potęgę reklamy viagry lub reklamuje strony z pornografią, lub nawiedzony przedsiębiorca wysyła do wszystkich znanych (i nieznanych) adresatów reklamę swoich produktów / usług,
- ktoś spamuje serwer, bo lubi, bo zarabia na tym pieniądze lub nie lubi kogoś kto ma na naszym serwerze konto pocztowe (jakiś czas temu chciałem zaspamować promotora - straszny burak z niego był),
- ktoś ustawił sobie przekierowanie wiadomości przychodzących na niedziałający adres i do tego włączył autoresponder (wiadomości jest wysyłana na zewnętrzny serwer, zewnętrzny serwer odpowiada nie ma takiego użytkownika wtedy my wysyłamy potwierdzenie że wiadomość otrzymaliśmy i tak w kółko).


Poniżej przedstawiam polecenie, które usunie wszystkie zamrożone wiadomości z kolejki:
exim -bp | grep frozen | awk '{print $3}' | xargs exim -Mrm

Pierwsza część polecenia wyświetla listę wiadomości w kolejce, druga wyłapuje z tej listy wiadomości ze statusem zamrożona, trzecia (awk) wyświetla tylko trzecią kolumnę, w której znajduje się ID wiadomości, czwarta za pomocą xargs usuwa wszystkie wiadomości o podanym ID.

Czasami czyszczenie zamrożonych wiadomości nie wystarczy, wtedy wyszukuję wiadomości, które wiszą w kolejce przez określony czas np.:
exim -bp | grep [234567890][d]| less
exim -bp | grep [234567890][h]| less
exim -bp | grep [234567890][m]| less

Pierwsze polecenie wyłapuje dni, drugi godziny, a trzecie minuty. Do tego wszystkiego dołożyłem less bo czasami dobrze sprawdzić czy ważnych wiadomości nie usuwamy. Jeżeli po sprawdzeniu okaże się, że kolejce wiszą same śmieci można less zastąpić awk '{print $3}' | xargs exim -Mrm.
Powyższa metoda nie jest niestety doskonała, ponieważ czasami w id wiadomości znajduje się cyfra i litera d,h,m - wówczas możemy usunąć wiadomość z kolejki, która nie koniecznie miała być usunięta. Dlatego zawsze, ale to zawsze trzeba być czujnym jak ważka :).

Dobra, wszystko ładnie i pięknie ale możecie powiedzieć skąd mam wiedzieć czy to jest spam, czy normalna wiadomości.
Najpierw znajdujemy wiadomość, która wisi, exim -bp | grep frozen.
Gdy już mamy jej id możemy przejrzeć jej:
body (czyli całą treść wiadomości) exim -Mvb id_wiadomości
headers (czyli nagłówki) exim -Mvh id_wiadomości
logi (skąd dokąd i kiedy) exim -Mvl id_wiadomości

Gdy się okaże że wiadomość zawiera spam możemy od razu ją usunąć np. exim -Mrm id_wiadomości

Jak już wspomniałem o spamerach, to mogą oni wysyłać spam na dwa główne sposoby za pomocą apacha i sendmaila, za pomocą exima (czyli połączenie za pomocą klienta poczty).
Gdy spamują za pomocą WWW, wystarczy sprawdzić access_logs Apacha np.: grep post -i access_logs.
Gdy spamują za pomocą skrzynki pocztowej możemy przejrzeć logi exima na żywo: tail -f /var/log/exim_mainlog, następnie przegrepować po loginie: exigrep adres@email_spamera.pl /var/log/exim_mainlog.
Exigrep jest o tyle wygodny, że pokazuje cały log dotyczący wybranej wiadomości, samo polecenie grep pokaże nam tylko fragment logów.
Można też grepować logi po sendmailu.
Czasami spamerzy są sprytni, tzn. umieszczają skrypt spamerski, robią wysyłkę, usuwają skrypt spamerski, czyszczą access_logs (jeżeli mają do nich dostęp). W takich sytuacjach dobrze jest przeszukać logi serwera FTP i sprawdzić czy przypadkiem jakieś pliki o podejrzanych nazwach nie były wgrywane na serwer.

Oczywiście gdy już złapiemy spamera i zablokujemy możliwość wysyłania spamu, należy pamiętać o wyczyszczeniu wiadomości znajdujących się w kolejce.

1 komentarz:

  1. Witam, probowalem wyczyscic logi wg sposobu podanego powyzej, niestety dostaje komunikat bledu ;/
    [serwer ~]# exim -bp | grep frozen | awk '{print $3}' | xargs exim -Mrm
    exim: malformed message id <> after -Mrm option

    moze jakis pomysl skad sie to bierze? usuwanie recznie wszystkich wiadomosci "frozen" zajeloby mi strasznie duzo czasu ;/

    OdpowiedzUsuń