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