sendmail_clamav.html   [plain text]


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  <meta name="keywords" content="ClamAV, Sendmail, clamav-milter, AntyVir, Linux, UNIX">
  <meta name="description" content="::: ClamAV / Sendmail / clamav-milter :::">
  <meta name="author" content="doozer">
  <title>::: ClamAV / Sendmail / clamav-milter :::</title>
  
  <style type="text/css">
P 
{
	font-size : 12px;
	font-style : normal;
	color : #000000;
	font-family : verdana, arial, helvetica, sans-serif;
	text-decoration : none;
	text-align : justify;
}
					  			  
A 
{
	font-size : 12px;
	font-style : normal;
	font-weight : bold;
	color : #4457c9;
	font-family : verdana, arial, helvetica, sans-serif;
	text-decoration : none;
}
									
A:Visited 
{
	font-size : 12px;
	font-style : normal;
	font-weight : bold;
	color : #4457c9;
	font-family : verdana, arial, helvetica, sans-serif;
	text-decoration : none;
}
	    
A:Active 
{
	font-size : 12px;
	font-style : normal;
	font-weight : bold;
	color : #4457c9;
	font-family : verdana, arial, helvetica, sans-serif;
	text-decoration : none;
}

A:Hover 
{
        color : #000000;
	font-size : 12px;
	font-style : normal;
	font-weight : bold;
	font-family : verdana, arial, helvetica, sans-serif;
	text-decoration : none;
}
							
BODY 
{
	font-size : 12px;
	font-style : normal;
	color : #000000;
	font-family : verdana, arial, helvetica, sans-serif;
	background-color : #ffffff;
	text-decoration : none;
	text-align : left;
	margin: 0;
}

PRE
{
	color: #000080;
	font-size: 12px;
	border: 1px solid #000000;
	padding: 3pt;
	background-color: #dddddd;
	font-family : verdana, arial, helvetica, sans-serif;
}
     
TABLE  
{
	border-collapse: collapse;
	border-color: #000000;
	border: 0;
	background-color: #ffffff;
}
												   
TD  
{
	font-size : 12px;
	font-style : normal;
	font-weight : normal;
        color : #000000;
	font-family : verdana, arial, helvetica, sans-serif;
	text-decoration : none;
	border-color: #000000;
}

TD.rtw  
{
	font-size : 12px;
	font-style : normal;
	font-weight : normal;
        color : #ffffff;
	font-family : verdana, arial, helvetica, sans-serif;
	text-decoration : none;
	border-color: #000000;
}

TD.rall
{
	border-left-width: 1pt;
	border-left-style: solid;
	border-top-width: 1pt;
	border-top-style: solid;
	border-right-width: 1pt;
	border-right-style: solid;
	border-bottom-width: 1pt;
	border-bottom-style: solid;
	border-color: #000000;
}

TD.rl
{
	border-left-width: 1pt;
	border-left-style: solid;
	border-top-width: 0pt;
	border-top-style: none;
	border-right-width: 0pt;
	border-right-style: none;
	border-bottom-width: 0pt;
	border-bottom-style: none;
	border-color: #000000;
}

TD.rt
{
	border-left-width: 0pt;
	border-left-style: none;
	border-top-width: 1pt;
	border-top-style: solid;
	border-right-width: 0pt;
	border-right-style: none;
	border-bottom-width: 0pt;
	border-bottom-style: none;
	border-color: #000000;
}

TD.rt_dddddd
{
	border-left-width: 0pt;
	border-left-style: none;
	border-top-width: 1pt;
	border-top-style: solid;
	border-right-width: 0pt;
	border-right-style: none;
	border-bottom-width: 0pt;
	border-bottom-style: none;
	border-color: #dddddd;;
}

TD.rlr
{
	border-left-width: 1pt;
	border-left-style: solid;
	border-right-width: 1pt;
	border-right-style: solid;
	border-color: #000000;
}

TD.rlr_b
{
	border-left-width: 4pt;
	border-left-style: solid;
	border-right-width: 4pt;
	border-right-style: solid;
	border-color: #000000;
}

TD.rlb
{
	border-left-width: 1pt;
	border-left-style: solid;
	border-top-width: 0pt;
	border-top-style: none;
	border-right-width: 0pt;
	border-right-style: none;
	border-bottom-width: 1pt;
	border-bottom-style: solid;
}

TD.rltr
{
	border-left-width: 1pt;
	border-left-style: solid;
	border-top-width: 1pt;
	border-top-style: solid;
	border-right-width: 1pt;
	border-right-style: solid;
	border-bottom-width: 0pt;
	border-bottom-style: none;
}

TD.rltr_b
{
	border-left-width: 4pt;
	border-left-style: solid;
	border-top-width: 1pt;
	border-top-style: solid;
	border-right-width: 4pt;
	border-right-style: solid;
	border-bottom-width: 0pt;
	border-bottom-style: none;
}

TD.rrb
{
	border-left-width: 0pt;
	border-left-style: none;
	border-top-width: 0pt;
	border-top-style: none;
	border-right-width: 1pt;
	border-right-style: solid;
	border-bottom-width: 1pt;
	border-bottom-style: solid;
}

TD.rr
{
	border-left-width: 0pt;
	border-left-style: none;
	border-top-width: 0pt;
	border-top-style: none;
	border-right-width: 1pt;
	border-right-style: solid;
	border-bottom-width: 0pt;
	border-bottom-style: none;
}

TD.rltb
{
	border-left-width: 1pt;
	border-left-style: solid;
	border-top-width: 1pt;
	border-top-style: solid;
	border-right-width: 0pt;
	border-right-style: none;
	border-bottom-width: 1pt;
	border-bottom-style: solid;
}

TD.rlt
{
	border-left-width: 1pt;
	border-left-style: solid;
	border-top-width: 1pt;
	border-top-style: solid;
	border-right-width: 0pt;
	border-right-style: none;
	border-bottom-width: 0pt;
	border-bottom-style: none;
}

TD.rtr
{
	border-left-width: 0pt;
	border-left-style: none;
	border-top-width: 1pt;
	border-top-style: solid;
	border-right-width: 1pt;
	border-right-style: solid;
	border-bottom-width: 0pt;
	border-bottom-style: none;
}

TD.rlrb
{
	border-left-width: 1pt;
	border-left-style: solid;
	border-top-width: 0pt;
	border-top-style: none;
	border-right-width: 1pt;
	border-right-style: solid;
	border-bottom-width: 1pt;
	border-bottom-style: solid;
}

TD.rlrb_b
{
	border-left-width: 4pt;
	border-left-style: solid;
	border-top-width: 0pt;
	border-top-style: none;
	border-right-width: 4pt;
	border-right-style: solid;
	border-bottom-width: 1pt;
	border-bottom-style: solid;
}

TD.rallwl
{
	border-top-width: 1pt;
	border-top-style: solid;
	border-bottom-width: 1pt;
	border-bottom-style: solid;
	border-right-width: 1pt;
	border-right-style: solid;
	border-left-width: 0pt;
	border-left-style: none;
}

TD.rbottom
{
	border-bottom-width: 1pt;
	border-bottom-style: solid;
	border-left-width: 1pt;
	border-left-style: solid;
	border-right-width: 1pt;
	border-right-style: solid;
}

TD.rlrbdotted
{
	border-left-width: 1pt;
	border-left-style: dotted;
	border-top-width: 0pt;
	border-top-style: none;
	border-right-width: 1pt;
	border-right-style: dotted;
	border-bottom-width: 1pt;
	border-bottom-style: dotted;
}

TD.rbdotted
{
	border-left-width: 0pt;
	border-left-style: none;
	border-top-width: 0pt;
	border-top-style: none;
	border-right-width: 0pt;
	border-right-style: none;
	border-bottom-width: 1pt;
	border-bottom-style: dotted;
}

TD.rn
{
	border-left-width: 0pt;
	border-left-style: none;
	border-top-width: 0pt;
	border-top-style: none;
	border-right-width: 0pt;
	border-right-style: none;
	border-bottom-width: 0pt;
	border-bottom-style: none;
	border-color: #dddddd;
}

IMG 
{
	padding: 0;
	border: 0;
	border-color: #000000;
}      

.rfoot
{
	border-left-width: 1pt;
	border-left-style: solid;
	border-top-width: 1pt;
	border-top-style: solid;
	border-right-width: 1pt;
	border-right-style: solid;
	border-bottom-width: 1pt;
	border-bottom-style: solid;
	border-color: #000000;
}

.rfoot:link
{
	color: #000000;
	text-decoration: none;
	border-left-width: 1pt;
	border-left-style: solid;
	border-top-width: 1pt;
	border-top-style: solid;
	border-right-width: 1pt;
	border-right-style: solid;
	border-bottom-width: 1pt;
	border-bottom-style: solid;
	border-color: #000000;
}

.rfoot:hover
{
	border: 1px solid #0A246A;
	background-color: #B6BDD2;
	color: #000000;
	border-left-width: 1pt;
	border-left-style: solid;
	border-top-width: 1pt;
	border-top-style: solid;
	border-right-width: 1pt;
	border-right-style: solid;
	border-bottom-width: 1pt;
	border-bottom-style: solid;
	border-color: #000000;
}

.rfoot:visited
{
	color: #000000;
	text-decoration: none;
	border-left-width: 1pt;
	border-left-style: solid;
	border-top-width: 1pt;
	border-top-style: solid;
	border-right-width: 1pt;
	border-right-style: solid;
	border-bottom-width: 1pt;
	border-bottom-style: solid;
	border-color: #000000;
}
  </style>
  
</head>

<body bgcolor="#ffffff">
 <center>
 <a name="#begin"> </a>

<table width="100%" align="center" cellpadding="0" cellspacing="0" border="0">
 <tr>
  <td  bgcolor="#dddddd" width="100%" align="left" height="20" class="rn"></td>
 </tr>
</table>
 
<!-- LOGOTABLE -->
<table width="100%" align="center" cellpadding="10" cellspacing="0" border="0">
 <tr>
  <td  bgcolor="#dddddd" width="8%" align="left" height="100" class="rt_dddddd"></td>
  <td  bgcolor="#ffffff" width="24%" align="left" height="100" class="rlt"><img src="clam.png" alt="ClamAV Logo"></td>
  <td  bgcolor="#ffffff" width="60%" align="left" height="100" class="rtr">
   <b><font size="-1">ARTYKUŁ Z SERII</font></b><br>
   <b><font size="+1">Ochrona antywirusowa z wykorzystaniem ClamAV</font></b><br><br>
   &nbsp;&nbsp;&nbsp;<font size="+1">Jak zmusić Sendmaila do pracy z ClamAV</font>
  </td>
  <td  bgcolor="#dddddd" width="8%" align="left" height="100" class="rt_dddddd"></td>
 </tr>  
</table>
<!-- end LOGOTABLE -->

<!-- TOPTABLE -->
<table width="100%" align="center" cellpadding="10" cellspacing="0" border="0"> 
 <tr>
  <td bgcolor="#dddddd" colspan="1" valign="top" align="left" width="8%" height="200">
   &nbsp;
  </td>
  
  <td colspan="1" valign="top" align="left" width="84%" height="200" class="rlrb">
   <br><b>Nowości</b>
   <br>W wersjach &lt;= 0.65 ClamAV wykryty został błąd, którego wykorzystanie dokonuje DoS demona <i>clamd</i>
   <br>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
   <br>
   
   <br><br><b>Spis treści</b>
   <br><b>1.</b>&nbsp;<a href="sendmail_clamav.html#a1">Wprowadzenie</a>
   <br><b>2.</b>&nbsp;<a href="sendmail_clamav.html#a2">Jak to działa?</a>
   <br><b>3.</b>&nbsp;<a href="sendmail_clamav.html#a3">Zapotrzebowanie na oprogramowanie</a>
   <br><b>4.</b>&nbsp;<a href="sendmail_clamav.html#a4">Konfiguracja serwera Sendmail</a>
   <br><b>5.</b>&nbsp;<a href="sendmail_clamav.html#a5">Kompilacja ClamAV</a>
   <br><b>6.</b>&nbsp;<a href="sendmail_clamav.html#a6">Uruchamianie</a>
   <br><b>7.</b>&nbsp;<a href="sendmail_clamav.html#a7">Obserwacje i analiza logów</a>
 
<br><br><br>
Po dłuuugiej przerwie, naszła mnie znów ochota na przygotowanie jakiegoś małego HOWTO.<br>
Tym razem zajmę się odwiecznym problemem wirusów, które pustoszą komputery naszych biednych<br>
userów i ich wspaniałe windowsy :)

<a name="a1"> </a>
<br><br><br><b>1.&nbsp;&nbsp;&nbsp;Wprowadzenie</b>
<br><br>Jak już w tytule mogliście przeczytać,
opiszę sposób w jaki można połączyć <a href="http://www.sendmail.org/">Sendmaila</a> z tworzonym na licencji GPL, programem antywirusowym 
<a href="http://www.clamav.net/">ClamAV</a>. Projekt zapoczątkowany został przez Tomasza Kojma a obecnie rozwijany jest przez <a href="http://www.clamav.net/team.html">międzynarodowy zespół programistów</a>.<br> 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 <a href="http://www.clamav.net/snapshot/">snapshotami</a>. Można tam znaleźć naprawdę wiele nowych i przydatnych funkcji.

<a name="a2"> </a>
<br><br><br><b>2.&nbsp;&nbsp;&nbsp;Jak to działa?</b>
<br><br>Na początek krótko opiszę zasadę działania takiego rozwiązania.
<br>Gdy ktoś wysyła pocztę do użytkownika, którego konto znajduje się na naszym serwerze, wówczas serwer pocztowy,<br>
(MTA - <i>Mail Transfer Agent</i>) 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 :>).

<br><br>Sendmail posiada wspaniały mechanizm do zarządzania zawartością e-maili jakim jest <a href="http://www.milter.org/">milter</a> (<i>Sendmail's Content Management API</i>).
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 <a href="http://www.milter.org/milter_api/index.html">tej stronie</a> dowiecie się więcej na temat tego mechanizmu. 
<br><br>Biblioteka <b>libmilter</b> wykorzystywana jest przez filtry antyspamowe, programy do zarządzania treścią maili oraz przez programy antywirusowe. Jednym z takich filtrów jest <b>clamav-milter</b>, 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.

<br><br><i>clamav-milter</i> może łączyć się z demonem ClamAV - <b>clamd</b> na dwa sposoby. Albo poprzez <i>local socket</i> albo poprzez <i>TCP socket</i> na port <i>3310</i>. Sposób w jaki ma działać <i>clamd</i> oraz wszelkie związane z tym parametry określamy w pliku konfiguracyjnym <i>clamav.conf</i>. Oto one:

<pre>
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)
</pre>
<i>Pamiętać należy, że tylko jeden z tych sposobów może być włączony w danej konfiguracji.</i>
<br>Opcja <i>TCPAddr</i> służy do określenie adresu IP na którym będzie nasłuchiwał <i>clamd</i>. Domyślnie <i>clamd</i> akceptuje połączenia przychodzące na wszystkie adresy IP. Jeśli odhaszujemy tę opcję, wówczas ograniczamy <i>clamd</i> 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, <i>clamav-milter</i> sprawdza w pliku <i>clamav.conf</i> wpisy dotyczące  połączenia i na tej podstawie wybiera sposób komunikacji z clamd.
<br><b>Ze względów bezpieczeństwa, autorzy zalecają korzystanie z lokalnego socketu.</b>

<br><br> Po połączeniu z <i>clamd</i>, <i>clamav-milter</i> 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 :-)

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

<a name="a3"> </a>
<br><br><br><b>3.&nbsp;&nbsp;&nbsp;Zapotrzebowanie na oprogramowanie</b>
<br><br> - ClamAV v0.65 - <a href="http://prdownloads.sourceforge.net/clamav/">http://prdownloads.sourceforge.net/clamav/</a>
<br> - Sendmail 8.12.10 - 
 <a href="ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.12.10.tar.gz">ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.12.10.tar.gz</a>

 <br><b>ClamAV posiada wbudowaną obsługę formatów RAR (2.0), Zip, Gzip, Bzip2.</b>
 
<br><br>&nbsp;<b>Skrypty startowe</b>
<br> - Skrypty startowe, które uruchamiają Sendmaila, clamd i clamav-miltera:
<br>&nbsp;&nbsp;&nbsp;<a href="http://clamav.skc.com.pl/howtos/files/rc.sendmail">rc.sendmail</a>
<br>&nbsp;&nbsp;&nbsp;<a href="http://clamav.skc.com.pl/howtos/files/rc.clamd">rc.clamd</a>
<br>&nbsp;&nbsp;&nbsp;<a href="http://clamav.skc.com.pl/howtos/files/rc.clamav-milter">rc.clamav-milter</a>
<br><br>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.
<br>Głównym skryptem startowym jest <i>rc.sendmail</i>. Po uruchomieniu go z opcją <i>start</i> zostaną również uruchomione skrypty <i>rc.clamd</i> i <i>rc.clamav-milter</i>.


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

<a name="a4"> </a>
<br><br><br><b>4.&nbsp;&nbsp;&nbsp;Konfiguracja serwera Sendmail</b>
<br><br>Ja używam obecnie wersji 8.12.10 ale powinno też działać z wcześniejszymi. 
<br><br><i>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 <b>sendmail_source/libmilter/README</b></i>

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

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

a do naszego pliku .mc (u mnie nazywa się on sendmail.mc) <i>sendmail_source/cf/cf/sendmail.mc</i> 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')
</pre>

Oto mój przykładowy plik <a href="http://clamav.skc.com.pl/howtos/files/sendmail.mc">sendmail.mc</a>
<br>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:
<pre>
define(`confAUTH_MECHANISMS',`LOGIN PLAIN')dnl
TRUST_AUTH_MECH(`LOGIN PLAIN')dnl
</pre>

Teraz dokonujemy standardowej kompilacji Sendmaila:
<pre>
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
</pre>
Po tych czynnościach Sendmail jest już zainstalowany i gotowy do działania (na razie jeszcze bez bibliotek libmilter).

<br><br>
Teraz zainstalujemy libmilter:
<pre>
root@linux: cd sendmail_source/libmilter
root@linux: sh Build install
</pre>
libmilter powinien się zainstalować.
<br><br><b>UWAGA: Po instalacji libmiltera konieczna jest konfiguracja bibliotek dynamicznych, czyli:</b>
<pre>
root@linux: ldconfig
</pre>

Bez tego nie skompilowałby się nam clamav-milter :>
<br><br>I to w zasadzie wszystko odnośnie Sendmaila. Teraz przejdziemy do kompilacji ClamAV.

<a name="a5"> </a>
<br><br><br><b>5.&nbsp;&nbsp;&nbsp;Kompilacja ClamAV</b>
<br><br>Przed rozpoczęciem kompilacji należy dodać nowego użytkownika - <i>clamav</i>
<pre>
root@linux: groupadd clamav
root@linux: useradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav
</pre>

Aby ClamAV skompilował się wraz z clamav-milter, należy uruchomić configure z opcją --enable-milter + jakieś nasze dodatkowe opcje, np:
<pre>
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
</pre>
Na koniec musimy jeszcze zrobić link symboliczny:
<pre>
root@linux: ln -s /usr/sbin/sendmail /usr/lib/sendmail
</pre>

Należy jeszcze dokonać edycji pliku /etc/clamav/clamav.conf, czyli pliku konfiguracyjnego ClamAV.
<a href="http://clamav.skc.com.pl/howtos/files/clamav.conf">Tutaj</a> dostępny jest mój plik clamav.conf

<br><br>UWAGA: clamav-milter do działania wymaga odhaszowania następujących wpisów w clamav.conf;
<pre>
LocalSocket /var/run/clamav/clamd.sock
ScanMail
SaveStreamToDisk
</pre>

clamav-milter uruchamiamy poprzez wpisanie polecenia:
<pre>
root@linux: /usr/sbin/clamav-milter -c /etc/clamav/clamav.conf --max-children=15 -blo /var/run/clamav/clmilter.sock
</pre>

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

<br><br>Poniżej przedstawie krótki opis zastosowanych tu parametrów wywołania <i>clamav-milter</i>.
<pre>
-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
</pre>
Polecam również zapoznanie się z komendą <i>clamav-milter --help</i> :-)
<br><br>Na koniec należy skopiować najnowsze bazy sygnatur wirusów do katalogu /etc/clamav
<br>Możesz je ściągnąć ze strony <a href="http://database.clamav.net/">http://database.clamav.net/</a> 
lub z któregoś z <a href="http://www.clamav.net/mirrors.html">mirrorów</a>.
<br><br><i>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.</i>

<br><br>Pliki baz danych to <b>main.cvd</b> i <b>daily.cvd</b>. 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.<br>
W dniu tworzenia tego dokumentu, ClamAV rozpoznawał prawie <b>20800</b> różnych wirusów, robaków i koni trojańskich.

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

<br><br>Do pobrania najnowszych baz sygnatur można użyć programu <b>freshclam</b>, 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. 

<br><br><b>Uprawnienia</b>
<br>Jeszcze kilka słów na temat uprawnień. Demon <i>clamd</i> musi być uruchomiony jako root, ale do poprawnego działania wcale nie potrzebuje praw roota. Wystarczą mu ograniczone uprawnienia jakiegoś użytkownika (np. <i>clamav</i>). Poprzez opcję <i>User</i> 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.

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

<a name="a6"> </a>
<br><br><br><b>6.&nbsp;&nbsp;&nbsp;Uruchamianie</b>
<br><br>Przed uruchomieniem skryptów musimy zadbać jeszcze o stworzenie odpowiednich katalogów i nadanie im odpowiednich uprawnień; i tak:
<pre>
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
</pre>

W nowszych wersjach <i>clamav-milter</i> dostępna jest opcja <i>--quarantine-dir</i> podczas wywołania której musimy podać jako parametr, katalog z plikami poddanymi kwarantannie. W tym celu musimy go najpierw utworzyć.
<pre>
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
</pre>

Teraz wystarczy uruchomić skrypt <i>/etc/rc.d/rc.sendmail start</i> 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.

<a name="a7"> </a>
<br><br><br><b>7.&nbsp;&nbsp;&nbsp;Obserwacje i analiza logów</b>
<br><br>
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 <i>/var/log/clamav/clamd.log</i> i <i>/var/log/maillog</i>

<br><br>Ja po kilku dniach obserwacji trio Sendmail+ClamAV+clamav-milter, doszedłem do nastepujących wniosków:
<br><br>
- Zalecam zwrócenie szczególnej uwagi na clamav-miltera. Najprostszym sposobem jest;
<pre>
root@linux: ps -A
</pre>
i obserwacja czy nie występuje nadmierna liczba procesów clamav-milter.
<br>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 (<i>ang. quarantine</i>). Ma też lepszą obsługę zawieszonych procesów.

<br><br>
-  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 <i>/var/log/maillog</i> można dostrzec wpisy typu:

<pre>
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
</pre>

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.

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

<br><br>
<hr size="1" style="color: #aaa4a0;">
Autor: <b>Przemysław Hołowczyc</b><br>
e-mail: <b>doozer (at) skc (dot) com (dot) pl</b>

<br><br>
Mon Sep 15 22:34:21 CEST 2003 <b>Pierwsza wersja HOWTO</b><br>
Mon Feb  9 16:58:50 CET 2004 <b>Wersja aktualna</b><br>
<font style="font-size: 12px; color: #aaaaaa">
 # sendmail_clamav.html v1.2; Last modified: Mon, 23 Feb, 2004 20:04:34 by doozer #
</font>


 </td>
 <td bgcolor="#dddddd" colspan="1" valign="top" align="left" width="8%" height="2000">
    &nbsp;
 </td>
</tr> 
</table>
<!-- end CONTENTTABLE -->

<table width="100%" align="center" cellpadding="0" cellspacing="0" border="0">
 <tr>
  <td  bgcolor="#dddddd" width="100%" align="center" height="60" class="rn">
   &nbsp;
  </td>
 </tr>
</table>

</center>
</body>
</html>