[Comm] Kaspersky AVP & Postfix

Пирогов Алексей =?iso-8859-1?q?ipalex_=CE=C1_ferplast=2Ecom=2Eua?=
Чт Авг 7 12:20:24 MSD 2003


В сообщении от 7 Август 2003 14:56 Oleg K. Artemjev написал(a):
> Так что ежели не в лом отправить кусочки соответствующих конфигов в конфу -
> welcome, думаю кого нибудь да обрадуете.

Ок. Привожу пошаговые инструкцию по установке и настройке демона drwebd, его 
связки с postfix и sendmail (с qmail и exim нету) - частично это описано в 
документации по DrWeb (только там это весьма растянуто), а некоторые вещи 
выяснял методом тыка.
А также пару скриптов для ежедневного обновления, проверки системных и 
домашних каталогов и карантина и отправки отчета по почте.

Установка и настройка демона drwebd
-----------------------------------

1.  Ставим DrWeb
# rpm -ihv drweb-4.29.2-glibc.2.2.i386.rpm
    или
# rpm -ihv drweb-4.29.2-glibc.2.3.i386.rpm

После установки получаем такую картину:
    /opt/drweb - домашний каталог
    /etc/drweb - настройки
    /etc/rc.d/init.d/drwebd - скрипт запуска демона
    /var/drweb - рабочие каталоги

2.  Этот пункт не обязательный, но полезный - по не совсем понятным мне
    причинам DrWeb для Linux устанавливается в каталог /opt, хотя традиционно
    (и так сделано в версии для FreeBSD) приложения находятся в /usr/local,
    поэтому переносим домашний каталог из /opt/drweb в /usr/local/drweb,
    а на старом месте создаем линк - он необходим т.к. привязка к катологу
    зашита в бинарник :(
# mv /opt/drweb /usr/local/drweb
# ln -s /usr/local/drweb /opt/drweb
    Для удобства создаем в домашнем каталоге линки на файл конфигурации и на
    клиента демона
# cd /usr/local/drweb
# ln -s /etc/drweb/drweb32.ini drweb32.ini
# ln -s clients/drwebdc drwebdc

3.  Создаем пользователя drweb
# useradd -d /usr/local/drweb -s /sbin/nologin -M drweb

ЗАМЕЧАНИЯ: 1) не забудьте ключик -M, чтобы в домашний каталог не копировался
	   /etc/skel
	   2) в некоторых дистрибутивах (например ALTLInux) для демонов традиционно
	   принято использовать в качестве shell /dev/null (а не /sbin/nologin)

4.  Меняем владельца и права на рабочие каталоги
    а также исправляем права на каталог конфигурации
    (почему-то по умолчанию туда никого кроме root-а не пускают)
# chown -R drweb:drweb /var/drweb/*
# chown -R root:root /var/drweb/bases
# chmod -R ug+rwX /var/drweb/*
# chmod -R o-rwx /var/drweb/*
# chmod -R a+rX /var/drweb/bases
# chmod -R g-w /var/drweb/bases
# chmod a+rX /etc/drweb

5.  Редактируем файл конфигурации (drweb32.ini)
    задаем бюджет под которым будет работать демон
...
[Linux:Daemon]
...
User = drweb
...

    можно также включить руссификацию (раскомментировать указанные строки)
[Linux]
...
LngFileName = "/usr/local/drweb/lib/russian.dwl"
...
[Linux:Daemon]
...
LngFileName = "/usr/local/drweb/lib/russian.dwl"
...

ЗАМЕЧАНИЕ: Также хорошо заменить все пути /opt/drweb/.* на /usr/local/drweb/.*
	   хотя работаь будет и так, благодаря линке (см. п.2)

6.  Самое время установить лицензионный ключ - см. документацию
    перед установкой лицензионного ключа демо-ключ желательно сохранить
# mv /usr/local/drweb/drwebd.key /usr/local/drweb/drwebd.demo_key
    если лицензионного ключа нету, то этот пункт пропускаем и drweb будет
    работать на демонстрационном ключе и не сможет лечить

7.  Редактируем скрипт запуска демона (/etc/rc.d/init.d/drwebd)
    Этот шаг необязательный, поскольку стандартный скрипт в целом
    работоспособный, но он больше напоминает заготовку, поэтому
    предлагается использовать следующий скрипт:
--------------------------------------------------------------------
#!/bin/sh

# chkconfig: 35 75 75
# description: Runs Dr. Web antivirus daemon

. /etc/init.d/functions

RETVAL=$?

DRWHOMEDIR="/usr/local/drweb"
DRWDPIDFILE="/var/drweb/run/drwebd.pid"
if [ -e $DRWDPIDFILE ]; then DRWDPID=`cat $DRWDPIDFILE | head -1`; fi

start() {
    action $"Starting Dr. Web daemon: " $DRWHOMEDIR/drwebd
    RETVAL=$?
}

stop() {
    action $"Shutting down Dr. Web daemon: " kill $DRWDPID
    RETVAL=$?
}

reload() {
    action $"Reloading Dr. Web daemon: " kill -HUP $DRWDPID
    RETVAL=$?
}

status() {
    if [ -n "$DRWDPID" ];
	then echo "Dr. Web daemon (pid "$DRWDPID") is running..."
	    $DRWHOMEDIR/clients/drwebdc -sv -sb
	else echo "Dr. Web daemon is stopped"
    fi
}

case "$1" in
    start)
	start
    ;;
    stop)
	stop
    ;;
    status)
	status
    ;;
    reload)
	reload
    ;;
    restart)
	stop
	sleep 1
	start
    ;;
    *)
	echo "Usage: $0 {start|stop|status|restart|reload}"
	exit 1
esac

exit $RETVAL
--------------------------------------------------------------------

8.  Запускаем демона
# service drwebd start

9.  Проверяем поднятый сокет
# netstat -napl | grep drweb
tcp   0      0 127.0.0.1:3000    0.0.0.0:*        LISTEN 6697/drwebd
unix  2      [ ]         DGRAM                    348573 6697/drwebd

10. Проверяем работоспособность демона
    для TCP сокета:  drwebdc -nHOSTNAME -pPORTNUM -sv -sb
    для Unix сокета: drwebdc -uSOCKETFILE -sv -sb
# /usr/local/drweb/drwebdc -nlocalhost -p3000 -sv -sb

    а если Вы использовали предложенный скрипт запуска демона,
    то увидеть состояние демона можно командой:
# service drwebd status

11. Проверяем работу демона (см. документацию, как изготовить
    демонстрационный вирусованый файл eicar.com)
# /usr/local/drweb/drwebdc -feicar.com
Results: daemon return code 0x10020 (known virus is found)

можно получить более подробную информацию так (через TCP сокет)
# /usr/local/drweb/drwebdc -w -nlocalhost -p3000 -f eicar.com
если ее не получилось, то надо посмотреть лог демона

Если проверка прошла правильно, значит демон находится в рабочем состоянии



Настройка автоматического обновления антивирусных баз
-----------------------------------------------------
Для автоматического обновления предусмотрен скрипт update/update.pl
Для его работы необходим модуль String::CRC32

1.  Устанавливаем модуль String::CRC32
    Если модуль входит в состав Вашего дистрибутива (например ALTLinux) в виде
    готового пакета, то просто устанавливаем пакет
# rpm -Uhv perl-String-CRC32-1.2-XXX.iX86.rpm
    или через apt (и весьма желательно, если Вы используете apt)
# apt-get install perl-String-CRC32

    Если модуль не входит в состав Вашего дистрибутива, то загружаем его
    (если у нас его еще нет)
# wget http://cpan.org/modules/by-module/String/String-CRC32-1.2.tar.gz
    и собираем (обычно сборку выполняют в /usr/src, но можно и в /tmp)
# tar zxvf String-CRC32-1.2.tar.gz
# cd String-CRC32-1.2
# perl Makefile.PL
# make
# make test
# make install

2.  Проверяем работоспособность
# /usr/local/drweb/update/update.pl

3.  Обеспечиваем ежедневный запуск update.pl
    это реализовано в скрипте /etc/cron.daily/drweb-check (см. ниже) в первых
    двух строках
----------------------------------
cd /usr/local/drweb/update
./update.pl
----------------------------------
    не забудьте сделать его исполняемым
# chmod a+rx /etc/cron.daily/drweb-check
    и перегрузить конфигурацию crond
# service crond reload

При необходимости можно поправить update.pl чтобы он забирал
обновления оттуда, откуда скажете



Установка и настройка связки drweb+postfix
------------------------------------------
1.  Распаковываем и устанавливаем клиента  клиента drweb-postfix
    (и поправляем имя файла ChangeLog, чтобы не затереть основной файл)
# tar zxvf drweb-postfix-4.29.10-linux.tar.gz -C /tmp
# cd /tmp/drweb-postfix
# mv opt/drweb/ChangeLog opt/drweb/ChangeLog.postfix
# cp -fR etc/* /etc/
# cp -fR opt/* /usr/local/

2.  Строим конфигурацию демона drweb-postfix
# cd /usr/local/drweb/doc/postfix
# ./configure.pl
    и внимательно отвечаем на вопросы (не забудте изменить /opt/drweb на
    /usr/local/drweb)
    Конфигурационный скрипт внесет необходимые изменения в
    /etc/postfix/master.cf и /etc/drweb/drweb_postfix.conf

3.  Перезапускаем postfix
# service postfix restart

4.  Проверяем работу антивирусного фильтра
    Пришлите тестовому пользователю письмо, содержащее вложение eicar.com



Установка и настройка связки drweb+sendmail
-------------------------------------------
1.  Распаковываем и устанавливаем клиента  клиента drweb-sendmail
    (и поправляем имя файла ChangeLog, чтобы не затереть основной файл)
# tar zxvf drweb-sendmail-4.29-linux.tar.gz -C /tmp
# cd /tmp/drweb-sendmail
# mv opt/drweb/ChangeLog opt/drweb/ChangeLog.smf
# cp -fR etc/* /etc/
# cp -fR opt/* /usr/local/

3.  Строим конфигурацию демона drweb-sendmail
# cd /usr/local/drweb/doc/sendmail
# ./configure
    и внимательно отвечаем на вопросы

4.  После завершения работы конфигурационного скрипта получим скрипт
    инициализации демона drweb-sendmail, нужно поправить в нем путь
    к домашнему каталогу drweb (с /opt/drweb на /usr/local/drweb)
# vi drweb-sendmail
...

5.  Переносим скрипт инициализации демона drweb-sendmail в каталог
    стартовых скриптов, устанавливаем его запуск и запускаем демона
# mv drweb-sendmail /etc/rc.d/init.d
# chkconfig --add drweb-sendmail
# service drweb-sendmail start

6.  Изменяем конфигурацию sendmail
    (конфигурационный скрипт создает не только скрипт инициализации
    демона drweb-sendmail, но и заготовку для добавления в sendmail.mc,
    это файл sendmail.mc.addon)
    Добавляем содержимое sendmail.mc.addon в sendmail.mc (можно в конце)
# cat sendmail.mc.addon >> /etc/mail/sendmail.mc

7.  Пересобираем конфигурацию sendmail
    (расположение sendmail.cf зависит от настройки sendmail)
# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
    или можно так
# make -C /etc/mail

8.  Перезапускаем sendmail
# service sendmail restart

9.  Проверяем работу антивирусного фильтра
    Пришлите тестовому пользователю письмо, содержащее вложение eicar.com



/usr/local/sbin/drweb-antivirus_check
-------------------------------------
#!/bin/sh
DRWEB=/usr/local/drweb/drweb
OPTS="-arn -cnn -fm -ha -upn -mln -sd -ok- -ot"
LOGFILE=/var/drweb/log/last.log

SYSDIRS="/bin /boot /etc /lib /sbin /usr"
HOMEDIRS="/root /home"
VARDIRS="/var/spool/mail /tmp"
DIRS="$SYSDIRS $HOMEDIRS $VARDIRS"

REPORTHEAD=`date '+%Y.%m.%d %R'`"\nCheck directories: sys($SYSDIRS), 
home($HOMEDIRS), var($VARDIRS)\n"

(   echo -e "$REPORTHEAD"
    nice -n 19 $DRWEB $DIRS $OPTS
) > $LOGFILE

REPORT=`cat $LOGFILE | grep -v 'Загрузка /var/drweb/bases/'`
[ -z `echo $REPORT | grep 'инфицирован'` ] && REPORT=$REPORTHEAD"No viruses 
found"
echo -e "$REPORT"



/usr/local/sbin/drweb-quarantine_check
--------------------------------------
#!/bin/sh
DRWEBDC=/usr/local/drweb/drwebdc
QUARANTINE=/var/drweb/infected
LSQFILE=/var/drweb/log/infected.list

MAILSPOOL=/var/spool/mail
MAILER="/usr/lib/sendmail -t"
MAILTO=postmaster

LIST=`ls -1 $QUARANTINE | grep -v -E '\.gz$'`
for FILE in $LIST; do
    $DRWEBDC -h -q -f$QUARANTINE/$FILE
    if [ $? -eq 32 ]; then # 32 = 0x10000 (ok)
	HEAD=`awk '{if ($0=="") exit; print $0}' $QUARANTINE/$FILE`
	(echo "To: $MAILTO"
	echo 'Subject: UNDELIVERED MAIL ('`echo "$HEAD" | grep -E 
'^Subject:|^To:'`')'
	awk '{if (h==0) {if ($0~/^Subject:|^To:/) next; if ($0=="") h=1}; print $0}' 
$QUARANTINE/$FILE
	) | $MAILER
	rm $QUARANTINE/$FILE
    else
	gzip $QUARANTINE/$FILE
    fi
done

COUNT=0
echo -e `date '+%Y.%m.%d %R'`"\nIn quarantine ($QUARANTINE) there are such 
files:"
LSQ=`ls -1 $QUARANTINE`
for FILE in $LSQ; do
    let COUNT=COUNT+1
    VIRINFO=`zcat $QUARANTINE/$FILE | $DRWEBDC -h -q -rv -i`
    VIRNAMES=`(for ITEM in $VIRINFO; do echo $ITEM; done) | grep -v -E 
'DrWeb|report|-----|========'`
    echo "$COUNT. $FILE: "$VIRNAMES
done
echo "Total $COUNT files"

NEWFILES=`echo "$LSQ" | comm -2 -3 - $LSQFILE`
if [ -n "$NEWFILES" ]; then
    echo -e "\nNew files in quarantine:"
    echo "$NEWFILES"
fi
echo "$LSQ" > $LSQFILE


не забудьте сделать эти скрипты исполняемыми
# chmod a+rx /usr/local/sbin/drweb-antivirus_check
# chmod a+rx /usr/local/sbin/drweb-quarantine_check



/etc/cron.daily/drweb-check
---------------------------
#!/bin/sh
cd /usr/local/drweb/update
./update.pl
( service drwebd status 2>&1
  echo -e "\n"
  /usr/local/sbin/drweb-antivirus_check
  echo -e "\n"
  /usr/local/sbin/drweb-quarantine_check
) | mail -s "DrWeb check - "`date +%Y-%m-%d` root



Если кому-то не понравится, просьба ногами сильно не бить :)
-- 
Наилучшие пожелания,                      Registered         .--.
Пирогов Алексей                       Linux User #293162    |@_@ |
mailto:ipalex на ukr.net                                       |!_/ |
mailto:ipalex на ferplast.com.ua                              //   \ \
(AlekseyPirogov на ferplast.com.ua)                          (|     | )
UIN:172368093                                            /'\_   _/`\
                                       Powered by Linux  \___)=(___/


Подробная информация о списке рассылки community