Insidiae Team - takie sobie logo

NawIgAcJ0nE
 
 MAIN
 FOTKI
 HOWTOs
   neostrada
   Sendmail + ClamAV
   routing i firewall
 LINKI
   MaFiA
   BOFH
   Netiquette
   TFUJ.Slack

   15-09-2003
Ochrona antywirusowa poczty przychodzącej - czyli jak zmusić Sendmaila do pracy z ClamAV

     Po dłuuugiej przerwie, naszła mnie znów ochota na przygotowanie jakiegoś małego HOWTO.
Tym razem zajmę się odwiecznym problemem wirusów, które pustoszą komputery naszych biednych
userów i ich wspaniałe windowsy :)


1.   Jak to działa?
Może na początek krótko opiszę zasadę działania takiego rozwiązania. Jak już w tytule mogliście przeczytać, opiszę sposób w jaki można połączyć Sendmaila z OpenSourceowym programem antywirusowym jakim jest ClamAV autorstwa Tomasza Kojma.
Gdy ktoś wysyła pocztę do użytkownika, którego konto znajduje się na naszym serwerze, wówczas serwer pocztowy, (MTA - Mail Transport Agent) w tym przypadku Sendmail odbiera ją. Sendmail posiada wspaniały mechanizm jakim jest libmilter (lub w skrócie milter). Ogólnie mówiąc, milter to pewien rodzaj wewnętrznego API Sendmaila, które pozwala np na włączanie i dogadywanie się różnych filtrów. Jednym z takich filtrów jest clamav-milter, którego autorem jest Nigel Horne. Filtr ten (a raczej skaner e-mailowy) wchodzący w skład projektu ClamAV, został napisany w C i wykorzystuje wewnętrzny skaner ClamAV (również napisany przez Nigel'a).
clamav-milter "rozmawia" następnie poprzez socket z clamd (demonem antywirusa) i w ten sposób sprawdza zawartość przesyłki. Rozwiązanie to jest szybkie i bardzo skuteczne. Ma jeden minus, trzeba się trochę nakompilować :-)

W dalszej części omówię dokładniej clamav-milter a w szczególności jego wersję zmienioną przeze mnie. Dodałem tam kilka funkcji m.in. komunikaty po Polsku, jak również wysyłanie e-maila do odbiorcy zarażonej wiadomości z informacją, że ktoś o adresie jakimś@tam.pl chciał do niego wysłać pocztę z wirusem w środku. Ale to później.


2.   Zapotrzebowanie na soft
Do poprawnej pracy będziemy potrzebowali kilku programów (tu wersje których ja używam):
- RAR for Linux - http://www.rarlab.com/rar/rarlinux-3.2.0.tar.gz
- Open ARJ - http://testcase.newmail.ru/files/arj-3.10g.tar.gz
- ClamAV - http://clamav.sourceforge.net/snapshot/clamav-devel-20030914.tar.gz
- Bazy danych sygnatur - http://clamav.sourceforge.net/database/
- Sendmail 8.12.9 - ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.12.9.tar.gz
RAR i OpenARJ będą nam potrzebne do tego aby clamd mógł sprawdzać zawartość przesyłek z plikami skompresowanymi. ClamAV potrafi również rozpakować archiwa zip, gzip, bzip2. Do tego celu musimy mieć bibliotekę zlib. Jeśli jest już w systemie to OK, jeśli nie to ClamAV dokompiluje odpowiednie biblioteki. Mądry nie? :-)

Uwaga Slackwareowcy i shtOSowcy :-)
Jeśli ktoś chce może pobrać gotową paczkę z ClamAV oraz specjalnie przygotowane pliki startowe rc.sendmail; rc.clamd; rc.clamav-milter
- clamav-clamav-i686-1.tgz - http://insidiae.eu.org/clamav.tgz
- rc.sendmail - http://insidiae.eu.org/rc.sendmail
- rc.clamd - http://insidiae.eu.org/rc.clamd
- rc.clamav-milter - http://insidiae.eu.org/rc.clamav-milter


3.   Konfiguracja serwera Sendmail
Ja używam obecnie wersji 8.12.9 ale powinno też działać z wcześniejszymi. Uwaga, na stronie www.sendmail.org w dziale opisującym konfigurację libmilter są błędy a raczej nieaktualne informacje. Najświeższe info na temat konfiguracji miltera można znaleźć w katalogu sendmail_source/libmilter/README

I tak:
Do pliku sendmail_source/devtools/Site/site.config.m4 dodajemy linijkę:
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')

a do naszego pliku .mc (w tym przypadku sendmail.mc) sendmail_source/cf/cf/sendmail.mc następujące dwie linijki:
INPUT_MAIL_FILTER(`clmilter',`S=local:/var/run/clmilter.sock,F=, T=S:4m;R:4m')dnl
define(`confINPUT_MAIL_FILTERS', `clmilter')

Oto mój przykładowy plik sendmail.mc
Znajdziecie w nim jeszcze dwie linijki dotyczące SMTP-AUTH czyli autoryzacji SMTP. Jeśli ktoś nie używa tego mechanizmu to proszę je usunąć. Oto one:
define(`confAUTH_MECHANISMS',`LOGIN PLAIN')dnl
TRUST_AUTH_MECH(`LOGIN PLAIN')dnl

Teraz dokonujemy standardowej kompilacji Sendmaila:
root@linux: killall -9 sendmail
root@linux: cd sendmail_source/sendmail
root@linux: sh Build -c
root@linux: cd sendmail_source/cf/cf
root@linux: sh Build sendmail.cf
root@linux: cd sendmail_source/sendmail
root@linux: sh Build install
root@linux: cd sendmail_source/cf/cf
root@linux: sh Build install-cf
root@linux: cd sendmail_source
root@linux: sh Build install

Po tych czynnościach Sendmail jest już zainstalowany.

Teraz zainstalujemy libmilter
root@linux: cd sendmail_source/libmilter
root@linux: sh Build install

libmilter powinien się zainstalować.
UWAGA: Po instalacji libmiltera konieczna jest konfiguracja bibliotek dynamicznych, czyli:
root@linux: ldconfig

Bez tego nie skompilowałby się nam clamav-milter :>

I to w zasadzie wszystko co się tyczy Sendmaila. Teraz przejdziemy do kompilacji ClamAV :-)


4.   Kompilacja ClamAV

Tak jak wcześniej wspomniałem, ja używam trochę zmienionej wersji programu clamav-milter, jeśli ktoś chce, może go ściągnąć i wstawić do katalogu clamav-milter w źródłach ClamAV a następnie skompilować wszystko.

Poniżej znajduje się przykład odpowiedzi jaką wysyła serwer do nadawcy zainfekowanego maila.
Taka konstrukcja odpowiedzi jest dostępna w zmodyfikowanym clamav-milter. W wersji orginalnej, program nie wysyła informacji do odbiorcy listu, jak również gada tylko po angielsku :>
W przyszłości chcę jeszcze dodać opcje, które oprócz informowania z jakiego adresu wysłano list do odbiorcy, będą jeszcze potrafiły powiedzieć jaki był temat tej przesyłki, z jakiego hosta ją wysłano, jakiego klienta uzywał nadawca, itp. Narazie jednak nie jest to możliwe, ponieważ musiałbym za dużo zmieniać w samym clamdscan, a dokładniej w konstrukcji niektórych typów, których używa clamav-milter. Może jak znajdę więcej czasu to się tym pobawię :P

----- MfI - Skaner Antywirusowy --------------------------------------------------
  Wiadomosc, ktora wyslales do:
        odbiorca@domena.com.pl

  zawierala wirusa i z tego powodu nie zostala dostarczona.
  Informacja o tym zostala rowniez wyslana do odbiorcy.
----------------------------------------------------------------------------------

----- MfI - Antyvirus Scanner ----------------------------------------------------
  A message you sent to:
        odbiorca@domena.com.pl

  contained a virus and has not been delivered.
  This information was sent to recipient.
----------------------------------------------------------------------------------

----- Sygnatura Wirusa / Virus Signature -----
stream: ClamAV-Test-Signature FOUND


a tutaj przykład informacji jaka trafia do odbiorcy gdy zostanie do niego wysłany taki e-mail:

----- MfI - Skaner Antywirusowy --------------------------------------------------
  Wiadomosc wyslana do Ciebie z adresu:
        nadawca@inna_domena.com.pl

  zawierala wirusa i z tego powodu nie zostala dostarczona.
  E-mail z ta informacja zostal rowniez wyslany do nadawcy.
----------------------------------------------------------------------------------

----- Sygnatura Wirusa / Virus Signature -----
stream: ClamAV-Test-Signature FOUND


Aby ClamAV skompilował się z clamav-milter, należy uruchomić configure z opcją --enable-milter + jakieś nasze dodatkowe opcje, np:

root@linux: cd clamav_source
root@linux: make clean
root@linux: ./configure --prefix=/usr --sysconfdir=/etc/clamav --datadir=/etc/clamav \
--with-dbdir=/etc/clamav --enable-milter
root@linux: make
root@linux: make check
c make install

Na koniec musimy jeszcze zrobić link symboliczny:
root@linux: ln -s /usr/sbin/sendmail /usr/lib/sendmail

Należy jeszcze dokonać edycji pliku /etc/clamav/clamav.conf, czyli pliku konfiguracyjnego ClamAV. Tutaj dostępny jest mój plik clamav.conf

Sprawdź czy masz odhaszowane następujące opcje w pliku clamav.conf, potrzebuje ich clamav-milter
- LocalSocket /var/run/clamd.sock
- ScanMail
- SaveStreamToDisk

clamav-milter uruchamiamy poprzez wpisanie polecenia:
root@linux: /usr/local/sbin/clamav-milter -blo /var/run/clmilter.sock

Jeśli używasz moich skryptów startowych (rc.clamav-milter) to nie musisz się o to martwić, skrypt dokona prawidłowego uruchomienia automagicznie :>

Na koniec należy skopiować najnowsze bazy sygnatur wirusów do katalogu /etc/clamav
W dokumentacji od ClamAV opisany jest sposób automatycznego pobierania najnowszych baz sygnatur. Osobiście tego nie robiłem ale na pewno działa :-)

Teraz wystarczy uruchomić skrypt /etc/rc.d/rc.sendmail start i wszystko powinno ruszyć. Jako pierwszy uruchomi się demon clamd po 1 sekundzie zwłoki clamav-milter a po kolejnych dwóch sekundach, Sendmail. Te sztuczne opóźnienia wprowadzone są po to aby programy zdążyły połączyć się z socketami. W przeciwnym wypadku, mogą wystąpić pewne problemy, zwłaszcza podczas łączenia się Sendmaila z socketem clamav-milter.


To wszystko co miałem do napisania, życzę owocnej kompilacji :-)
Wszelkie pytania i sugestie proszę kierować na adres doozer (at) irc (dot) pl


5.   Obserwacje

Errata 2003-09-18
Po kilku dniach obserwacji trio Sendmail+ClamAV+clamav-milter, doszedłem do nastepujących wniosków:

- Zalecam używanie wersji stabilnej, ostatnia na dzień dzisiejszy nosi numer 0.60
http://download.sourceforge.net/clamav/clamav-0.60.tar.gz
W wersji developerskiej (20030829) zauważyłem, że clamav-milter miał skłonność do nie zamykania swoich procesów, które po jakimś czasie stawały się nielubianymi Zombie. Nie była to jednak wina samego clamav-milter, ponieważ w wersji clamav 0.60, używałem tego samego, zmienionego przeze mnie clamav-miltera i nie zaobserwowałem już takich sytuacji.

- Kolejną rzeczą, którą zmieniłem jest liczba maksymalnych procesów potomnych ( --max-children ), które może tworzyć clamav-milter. W moim skrypcie jest ustawienie --max-children=2 , okazało się to zdecydowanie za mało na moim serverze. Podczas odbierania przez MTA większej ilości maili w tym samym czasie, niektóre z nich były odrzucane do nadawcy. Objawiało się to komunikatami w /var/log/maillog tj.

Sep 17 13:22:41 max clamav-milter[22068]: hit max-children limit (7 >= 3): waiting for some to exit
Sep 17 13:24:17 max clamav-milter[26826]: hit max-children limit (8 >= 3): waiting for some to exit
Sep 17 13:24:58 max clamav-milter[26515]: hit max-children limit (8 >= 3): waiting for some to exit
Sep 17 13:25:22 max clamav-milter[4360]: hit max-children limit (9 >= 3): waiting for some to exit


Po zmianie tej wartości na 15, komunikaty przestały się pojawiać i MTA nie miał już problemów z dostarczaniem poczty :-) Innych problemów z ClamAV nie zaobserwowałem :-)





::: Insidiae Team :::   alinek | Abel | doozer | pitr   2001-2002
it@insidiae.eu.org