Sendmail: Обеспечение антивирусной защиты с помощью Clamav


Мини-руководство "шаг за шагом"

Устанавливаем clamav из портов:

# cd /usr/ports/security/clamav
# make install clean CLEANDEPENDS=Yes

Или с помощью прекомпилированного пакета:

# pkg_add ftp://ftp.openbsd.org/pub/OpenBSD/3.8/packages/i386/clamav-0.88.tgz

Переходим в каталог с примерами конфигурационных mc-файлов:

# cd /usr/share/sendmail/cf

Подключаем антивирус:

# vi server.mc

# Для взаимодействия с sendmail используем TCP-сокет.
#
INPUT_MAIL_FILTER(`clamav', `S=inet:3311@127.0.0.1, F=T, T=S:4m;R:4m')dnl

# Альтернативный вариант: используем доменный сокет Unix.
#
INPUT_MAIL_FILTER(`clamav', `S=local:/var/clamav/clamav-milter.sock, F=T, T=S:4m;R:4m')dnl

# `F=' позволяет разрешать прохождение почты в случае сбоя clamav-milter.
#
dnl INPUT_MAIL_FILTER(`clamav', `S=inet:3311@127.0.0.1, F=, T=S:4m;R:4m')dnl
dnl INPUT_MAIL_FILTER(`clamav', `S=local:/var/clamav/clamav-milter.sock, F=, T=S:4m;R:4m')dnl

Пересобираем mc-файл, предварительно сделав копию исходного /etc/mail/sendmail.cf:

# cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.bak
# m4 ../m4/cf.m4 server.mc > /etc/mail/sendmail.cf

Редактируем конфигурационный файл freshclam:

# vi /etc/freshclam.conf
DatabaseDirectory /var/db/clamav
UpdateLogFile /var/clamav/freshclam.log
PidFile /var/clamav/freshclam.pid
DatabaseOwner _clamav
DatabaseMirror database.clamav.net
Checks 2

Запускаем freshclam в режиме демона:

# /usr/local/bin/freshclam -d

Проверяем получение антивирусных баз:

# ls -l /var/db/clamav
total 5344
-rw-r--r--  1 _clamav  _clamav   146241 Oct 25 23:36 daily.cvd
-rw-r--r--  1 _clamav  _clamav  2560365 Oct 25 23:36 main.cvd

Вариант 1: используем TCP-сокет и отказываемся от демона clamd:

# /usr/local/sbin/clamav-milter -qlo -U /var/clamav/quarantine \
	-m 10 -T 0 inet:3311@127.0.0.1

Вариант 2: взаимодействуем через Unix-сокет и используем clamd:

# vi /etc/clamd.conf
LogFile /var/clamav/clamd.log
PidFile /var/clamav/clamd.pid
TemporaryDirectory /var/tmp
DatabaseDirectory /var/db/clamav
LocalSocket /var/clamav/clamd.sock
FixStaleSocket
User _clamav

Создаем лог-файл, чтобы clamd и clamav-milter могли выполнять журналирование событий:

# touch /var/clamav/clamd.log
# chown _clamav:_clamav /var/clamav/clamd.log

Загружаем clamd:

# /usr/local/sbin/clamd

Загружаем clamav-milter:

# /usr/local/sbin/clamav-milter -loP -U /var/clamav/quarantine \
	--pidfile=/var/clamav/clamav-milter.pid \
	--external local:/var/clamav/clamav-milter.sock

Вне зависимости от выбранного варианта запускаем sendmail:

# /usr/sbin/sendmail -L sm-mta -bd -q30m

Либо заставляем демона перечитать свой cf-конфиг:

# kill -HUP `head -1 /var/run/sendmail.pid`

В первом случае в /etc/rc.local прописываем автозапуск freshclam и clamav-milter:

# vi /etc/rc.local
if [ -x /usr/local/bin/freshclam ]; then
	echo -n ' freshclam'; /usr/local/bin/freshclam -d
fi

if [ -x /usr/local/sbin/clamav-milter ]; then
	echo -n ' clamav-milter'
	/usr/local/sbin/clamav-milter -qlo -U /var/clamav/quarantine \
		-m 10 -T 0 inet:3311@127.0.0.1
fi

При использовании второго варианта:

# vi /etc/rc.local
if [ -f /etc/clamd.conf -a -f /etc/freshclam.conf ]; then

	rm -f /var/clamav/*.pid /var/clamav/*.sock

	if [ -x /usr/local/bin/freshclam ]; then
		echo -n ' freshclam'; /usr/local/bin/freshclam -d
	fi

	if [ -x /usr/local/sbin/clamd ]; then
		echo -n ' clamd'; /usr/local/sbin/clamd
	fi

	if [ -x /usr/local/sbin/clamav-milter ]; then
		echo -n ' clamav-milter'
			sleep 2
			/usr/local/sbin/clamav-milter \
			-loP -U /var/clamav/quarantine \
			--pidfile=/var/clamav/clamav-milter.pid \
			--external local:/var/clamav/clamav-milter.sock
	fi

fi

Начиная с версии 0.90.х, может потребоваться изменить стартовый сценарий так, чтобы clamav-milter смог корректно запуститься после того, как clamd загрузит свою вирусную базу.

# vi /etc/rc.local
if [ -f /etc/clamd.conf -a -f /etc/freshclam.conf ]; then
	rm -f /var/clamav/*.pid /var/clamav/*.sock

	if [ -x /usr/local/bin/freshclam ]; then
		echo -n ' freshclam'; /usr/local/bin/freshclam -d
	fi

	sleep 2

	if [ -x /usr/local/sbin/clamd ]; then
		echo -n ' clamd'; /usr/local/sbin/clamd
	fi

	if [ -x /usr/local/sbin/clamav-milter ]; then
		echo -n ' clamav-milter'

		retry=20
		while [ ! -f /var/clamav/clamd.sock -a ! $retry = 0 ]; do
			sleep 1
			retry=$(($retry - 1))
		done

		/usr/local/sbin/clamav-milter -eql -U /var/clamav/quarantine \
			inet:3311@127.0.0.1
	fi
fi


OpenBSD.ru www@openbsd.ru
$RuOBSD: clamav.html,v 1.19 2010/11/01 10:57:48 dinar Exp $