ClamAV Logo ARTYKUŁ Z SERII
Ochrona antywirusowa z wykorzystaniem ClamAV

   Jak zmusić Sendmaila do pracy z ClamAV
 
Nowości
W wersjach <= 0.65 ClamAV wykryty został błąd, którego wykorzystanie dokonuje DoS demona clamd
W pośpiechu została więc wydana wersja 0.66, która posiadała kilka niedociągnięć. Obecnie zalecaną wersją stabilną jest 0.67


Spis treści
1. Wprowadzenie
2. Jak to działa?
3. Zapotrzebowanie na oprogramowanie
4. Konfiguracja serwera Sendmail
5. Kompilacja ClamAV
6. Uruchamianie
7. Obserwacje i analiza logów


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.   Wprowadzenie

Jak już w tytule mogliście przeczytać, opiszę sposób w jaki można połączyć Sendmaila z tworzonym na licencji GPL, programem antywirusowym ClamAV. Projekt zapoczątkowany został przez Tomasza Kojma a obecnie rozwijany jest przez międzynarodowy zespół programistów.
W chwili powstawania tego HOWTO, ostatnią stabilną wersją ClamAV był 0.65 tak więc wszelkie pliki konfiguracyjne i rozwiązania będą omawiane w oparciu o tę wersję. Zachęcam was również do prób ze snapshotami. Można tam znaleźć naprawdę wiele nowych i przydatnych funkcji.


2.   Jak to działa?

Na początek krótko opiszę zasadę działania takiego rozwiązania.
Gdy ktoś wysyła pocztę do użytkownika, którego konto znajduje się na naszym serwerze, wówczas serwer pocztowy,
(MTA - Mail Transfer Agent) w tym przypadku Sendmail, odbiera ją a następnie jeśli przesyłka spełnia odpowiednie wymagania, zapisuje ją jako nową pocztę dla konkretnego użytkownika. Zanim jednak taka przesyłka trafi jako nowy e-mail, zostaje poddana serii testów i musi przejść przez odpowiednie filtry (zupełnie jak student w sesji :>).

Sendmail posiada wspaniały mechanizm do zarządzania zawartością e-maili jakim jest milter (Sendmail's Content Management API). Ogólnie mówiąc, milter to pewien rodzaj wewnętrznego API Sendmaila, które pozwala na pełne zarządzanie zawartością przesyłek; tak nagłówkami jak i samą treścią maila. Na tej stronie dowiecie się więcej na temat tego mechanizmu.

Biblioteka libmilter wykorzystywana jest przez filtry antyspamowe, programy do zarządzania treścią maili oraz przez programy antywirusowe. 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 dzięki temu, że napisany został w C, jest bardzo szybki i wydajny.

clamav-milter może łączyć się z demonem ClamAV - clamd na dwa sposoby. Albo poprzez local socket albo poprzez TCP socket na port 3310. Sposób w jaki ma działać clamd oraz wszelkie związane z tym parametry określamy w pliku konfiguracyjnym clamav.conf. Oto one:
LocalSocket /var/run/clamav/clamd.sock		# Określenie pliku dla lokalnego socketu
#TCPSocket 3310						# Określenie portu
#TCPAddr 127.0.0.1					# Określenie adresu IP
#MaxConnectionQueueLength 30			# Maksymalna długość kolejki (domyślnie 15)
Pamiętać należy, że tylko jeden z tych sposobów może być włączony w danej konfiguracji.
Opcja TCPAddr służy do określenie adresu IP na którym będzie nasłuchiwał clamd. Domyślnie clamd akceptuje połączenia przychodzące na wszystkie adresy IP. Jeśli odhaszujemy tę opcję, wówczas ograniczamy clamd do akceptowania połączeń tylko do wybranego adresu. Jest to opcja podnosząca bezpieczeństwo działania w konfiguracji z sieciowym socketem TCP. Podczas uruchamiania, clamav-milter sprawdza w pliku clamav.conf wpisy dotyczące połączenia i na tej podstawie wybiera sposób komunikacji z clamd.
Ze względów bezpieczeństwa, autorzy zalecają korzystanie z lokalnego socketu.

Po połączeniu z clamd, clamav-milter sprawdza zawartość przesyłki pod kątem występowania w niej wirusów. Rozwiązanie to jest szybkie i bardzo skuteczne. Ma jeden minus, trzeba się trochę nakompilować ale gwarantuję, że warto :-)

W dalszej części dokumentu omówię zalety nowej wersji clamav-miltera dostępnej w wersjach latest ClamAV.


3.   Zapotrzebowanie na oprogramowanie

- ClamAV v0.65 - http://prdownloads.sourceforge.net/clamav/
- Sendmail 8.12.10 - ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.12.10.tar.gz
ClamAV posiada wbudowaną obsługę formatów RAR (2.0), Zip, Gzip, Bzip2.

 Skrypty startowe
- Skrypty startowe, które uruchamiają Sendmaila, clamd i clamav-miltera:
   rc.sendmail
   rc.clamd
   rc.clamav-milter

Skrypty te zostały zrobione z myślą o dystrybucjach, które jako systemu startowego używają tego, który wywodzi się z systemów BSD. Ja używam dwóch dystrybucji, Slackware i shtOS i w tych dystrybucjach skrypty będą działać prawidłowo. Jeśli używacie systemu startowego System V, to musicie sami stworzyć sobie odpowiednie skrypty startowe.
Głównym skryptem startowym jest rc.sendmail. Po uruchomieniu go z opcją start zostaną również uruchomione skrypty rc.clamd i rc.clamav-milter.


4.   Konfiguracja serwera Sendmail

Ja używam obecnie wersji 8.12.10 ale powinno też działać z wcześniejszymi.

UWAGA, na stronie www.sendmail.org w dziale opisującym kompilację i konfigurację libmilter, są nieaktualne informacje. Najświeższe informacje na temat konfiguracji miltera można znaleźć w katalogu sendmail_source/libmilter/README

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

Może się zdarzyć, że nie będziecie mieli pliku site.config.m4 i katalogu Site
W takim przypadku należy je stworzyć ręcznie

a do naszego pliku .mc (u mnie nazywa się on sendmail.mc) sendmail_source/cf/cf/sendmail.mc następujące dwie linijki:
INPUT_MAIL_FILTER(`clmilter',`S=local:/var/run/clamav/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: 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 i gotowy do działania (na razie jeszcze bez bibliotek libmilter).

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 odnośnie Sendmaila. Teraz przejdziemy do kompilacji ClamAV.


5.   Kompilacja ClamAV

Przed rozpoczęciem kompilacji należy dodać nowego użytkownika - clamav
root@linux: groupadd clamav
root@linux: useradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav
Aby ClamAV skompilował się wraz z clamav-milter, należy uruchomić configure z opcją --enable-milter + jakieś nasze dodatkowe opcje, np:
user@linux: cd clamav_source
user@linux: make clean
user@linux: ./configure --prefix=/usr --sysconfdir=/etc/clamav --datadir=/etc/clamav \
  --with-dbdir=/etc/clamav --enable-milter
user@linux: make
user@linux: make check
user@linux: su
root@linux: 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

UWAGA: clamav-milter do działania wymaga odhaszowania następujących wpisów w clamav.conf;
LocalSocket /var/run/clamav/clamd.sock
ScanMail
SaveStreamToDisk
clamav-milter uruchamiamy poprzez wpisanie polecenia:
root@linux: /usr/sbin/clamav-milter -c /etc/clamav/clamav.conf --max-children=15 -blo /var/run/clamav/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 :>

Poniżej przedstawie krótki opis zastosowanych tu parametrów wywołania clamav-milter.
-c (--config-file=FILE) Odczytaj konfigurację z pliku FILE
-b (--bounce) Wyślij wiadomość o błędzie do nadawcy maila
-l (--local) Skanuj maile pochodzące z wewnętrznej sieci LAN
-o (--outgoing) Skanuj wiadomości wychodzące z tej maszyny
Polecam również zapoznanie się z komendą clamav-milter --help :-)

Na koniec należy skopiować najnowsze bazy sygnatur wirusów do katalogu /etc/clamav
Możesz je ściągnąć ze strony http://database.clamav.net/ lub z któregoś z mirrorów.

Polecam stosowanie baz sygnatur w formacie CVD. Poprzednie bazy były w formacie tekstowym, ale w przyszłości nie będą już obsługiwane przez ClamAV.

Pliki baz danych to main.cvd i daily.cvd. Do main.cvd trafiają już sprawdzone sygnaturki, w których sporadycznie pojawiają się jakieś błędy lub niedociągnięcia. W pliku daily.cvd znajdują się ostatnio dodane sygnaturki najnowszych wirusów.
W dniu tworzenia tego dokumentu, ClamAV rozpoznawał prawie 20800 różnych wirusów, robaków i koni trojańskich.

Liczba rozpoznawanych wirusów rośnie bardzo szybko i tylko patrzeć jak doścignie komercyjną konkurencję :-)

Do pobrania najnowszych baz sygnatur można użyć programu freshclam, który potrafi działać jako demon. To rozwiązanie jest o tyle wygodne, że program sam sprawdza, określoną przez nas ilość razy dziennie, czy dostępne są nowe sygnaturki. Jeśli tak to je pobiera a następnie dokonuje przeładowania clamd aby ten rozpoznawał najnowsze wirusy.

Uprawnienia
Jeszcze kilka słów na temat uprawnień. Demon clamd musi być uruchomiony jako root, ale do poprawnego działania wcale nie potrzebuje praw roota. Wystarczą mu ograniczone uprawnienia jakiegoś użytkownika (np. clamav). Poprzez opcję User w pliku clamav.conf, możemy określić na prawach jakiego użytkownika ma pracować clamd. Po uruchomieniu, clamd porzuci uprawnienia roota i przejdzie na niższy poziom z uprawnieniami określonego użytkownika.

Już niedługo dostępne będzie HOWTO, w którym postaram się opisać wszelkie zagadnienia związane z poprawną konfiguracją ClamAV oraz z używaniem innych narzędzi dostępnych w ramach projektu.


6.   Uruchamianie

Przed uruchomieniem skryptów musimy zadbać jeszcze o stworzenie odpowiednich katalogów i nadanie im odpowiednich uprawnień; i tak:
root@linux: chown -R clamav:clamav /etc/clamav
root@linux: mkdir /var/run/clamav; chown -R clamav:clamav /var/run/clamav
root@linux: mkdir /var/log/clamav; chown -R clamav:clamav /var/log/clamav
W nowszych wersjach clamav-milter dostępna jest opcja --quarantine-dir podczas wywołania której musimy podać jako parametr, katalog z plikami poddanymi kwarantannie. W tym celu musimy go najpierw utworzyć.
root@linux: mkdir /var/clamav/quarantine; chown -R clamav:clamav /var/clamav/quarantine

Zabijmy jeszcze działający stary proces sendmail
root@linux: killall -9 sendmail
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.


7.   Obserwacje i analiza logów

Nie muszę chyba pisać jak ważne jest okresowe przeglądanie logów serwera. W przypadku ClamAV również należy zwrócić uwagę na kilka szczegółów. Szczególnie jeśli chodzi o zachowanie clamav-miltera i demona clamd. Wszystkiego możemy się dowiedzieć z plików /var/log/clamav/clamd.log i /var/log/maillog

Ja po kilku dniach obserwacji trio Sendmail+ClamAV+clamav-milter, doszedłem do nastepujących wniosków:

- Zalecam zwrócenie szczególnej uwagi na clamav-miltera. Najprostszym sposobem jest;
root@linux: ps -A
i obserwacja czy nie występuje nadmierna liczba procesów clamav-milter.
Zauważyłem, że clamav-milter miał skłonność do nie zamykania swoich procesów. Jego nowe wersje (dostępne w wersji deweloperskiej ClamAV) radzą sobie zdecydowanie lepiej i nie ma już takich problemów. Nowy clamav-milter zapisuje podejrzane pliki do katalogu kwarantanny (ang. quarantine). Ma też lepszą obsługę zawieszonych procesów.

- Kolejną rzeczą, którą zmieniłem jest liczba maksymalnych procesów potomnych ( --max-children ), które może tworzyć clamav-milter. Im większe obciążenie serwera pocztą przychodzącą tym liczba tych procesów powinna być wyższa. Ja używam --max-children=15 i jest to w moim przypadku liczba wystarczająca. Jeśli liczba ta jest zbyt mała w logu /var/log/maillog można dostrzec wpisy typu:
clamav-milter[22068]: hit max-children limit (7 >= 3): waiting for some to exit
clamav-milter[26826]: hit max-children limit (8 >= 3): waiting for some to exit
clamav-milter[26515]: hit max-children limit (8 >= 3): waiting for some to exit
clamav-milter[4360]: hit max-children limit (9 >= 3): waiting for some to exit
Wartość --max-children każdy z Was musi ustalić samodzielnie w zależności od obciążenia MTA. Na początek proponuję - 10; a następnie przez kilka dni należy obserwować maillog.

Na koniec, życzę Wam owocnej kompilacji i wychwycenia jak największej ilości wirusów :-)
Wszelkie pytania i sugestie proszę wysyłać pocztą.


Autor: Przemysław Hołowczyc
e-mail: doozer (at) skc (dot) com (dot) pl

Mon Sep 15 22:34:21 CEST 2003 Pierwsza wersja HOWTO
Mon Feb 9 16:58:50 CET 2004 Wersja aktualna
# sendmail_clamav.html v1.2; Last modified: Mon, 23 Feb, 2004 20:04:34 by doozer #