|
|
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 :-)
|
|
|
|
|
|