SpamAssassin, ClamAV и взаимодействие с Exim
Ну, можно начать с простого — с clamav. Надо его установить, запустить и регулярно обновлять.
Устанавливаем clamav и clamsmtpd:
1 2 3 4 | cd /usr/ports/security/clamav sudo make install clean cd /usr/ports/security/clamsmtp sudo make install clean |
Редактируем конфиги:
1 2 3 4 | cd /usr/local/etc/ cp clamsmtpd.conf-sample clamsmtpd.conf cp clamd.conf.default clamd.conf cp freshclam.conf.default freshclam.conf |
clamsmtpd.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # Порт, на который перенаправляется сканируемая почта OutAddress: 10026 # Максимальное количество подключений за раз. # В настройках демона clamd должно быть указано аналогичное число подключений MaxConnections: 200 # Время (в секундах) ожидания ответа от сети TimeOut: 180 # Поддержка соединения. 0 - если отключено, либо выставляем интервал отправления # серверу NOOP'ов в секундах KeepAlives: 0 # Прослушиваемый адрес (По умолчанию: порт 10025 на всех локальных адресах) Listen: 127.0.0.1:10025 # Адрес для соединения с демоном clamd ClamAddress: /var/run/clamav/clamd.sock # Заголовок, добавляемый к отсканированной почте Header: X-Virus-Scanned: ClamAV using ClamSMTP # Каталог для временных файлов TempDirectory: /tmp # Что делаем, если нашли вирус Action: drop # Помещаем файлы,содержащие вирус, на карантин в директорию # хранения временных файлов Quarantine: on # Юзер, от имени которого запускается демон User: clamav # Команда, выполняемая при обнаружении вируса # Скрипт можно взять в /usr/local/share/examples/clamsnmp, отредактировать под свои нужды # и положить в любое удобное место VirusAction: /var/script/virus_action.sh |
clamd.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #Пишем лог LogFile /var/log/clamav/clamd.log #Блокировка файла лога. Защищает от многократного запуска демона. В случае необходимости # запуска еще одного демона - надо скопировать конфиг, изменить в нем местоположение лога # и запустить демона с указанием этого файла конфига LogFileUnlock no #Максимальный размер файла лога LogFileMaxSize 2M # Ставим в логе отметки времени LogTime yes # Пишем в лог сообщения о проверенных чистых файлах. Удобно для дебага, # но размер лога быстро растет LogClean yes # Используем сислог LogSyslog yes # Определение типа сообщений для сислога LogFacility LOG_MAIL # Включаем подробное логгирование LogVerbose yes # Сохраняем идентификатор процесса PidFile /var/run/clamav/clamd.pid # Директория для хранения временных файлов TemporaryDirectory /var/tmp # Путь к директории базы DatabaseDirectory /var/db/clamav # Путь к файлу сокета LocalSocket /var/run/clamav/clamd.sock # Удалять сокет в случае некорректного завершения работы FixStaleSocket yes # Максимальная длина очереди входящих соединений MaxConnectionQueueLength 15 # Закрыть соединение при превышении предельного размера данных. # Значение должно соответствовать ограничению на максимальный размер вложения. StreamMaxLength 500M # Максимальное количество одновременно запущеных потоков MaxThreads 20 # Время ожидания ответа от клиента ReadTimeout 180 # Время (в секундах), после истечения которого демон должен закрыть соединение, # если клиент не отправляет никаких команд после установления соединения CommandReadTimeout 5 # Время ожидания (в милисекундах), если буфер заполнен. # Надо оставить значение низким во избежание зависания clamd SendBufTimeout 200 # Максимальное количество пунктов в очереди (включая те, которые обрабатывает MaxThreads) # Рекомендуемое значение параметра - двойное значение MaxThreads # Во избежание исчерпания файловых дескрипторов не нужно ставить большое значение # Можно руководствоваться формулой # MaxThreads*MaxRecursion+(MaxQueue-MaxThreads)+6 < RLIMIT_NOFILE (usual max is 1024) MaxQueue 200 # Ожидание нового задания будет завершено по истечении этого времени (в секундах) IdleTimeout 60 # Максимальное количество вложенных директорий MaxDirectoryRecursion 30 # Следовать по симлинкам директорий FollowDirectorySymlinks yes # Следовать по симлинкам файлов FollowFileSymlinks yes # Промежуток времени (в секундах), через который производится проверка баз SelfCheck 1800 # Команда, выполняемая при обнаружении вируса. %v добавит в строку имя вируса. VirusEvent /bin/echo "Virus found: %v" >> /var/log/clamav/virus.log # Юзер, от имени которого будет запускаться антивирус User clamav # Инициализировать права дополнительных групп AllowSupplementaryGroups yes # Включаем дебаг (если необходимо) Debug yes # Не удалять временные файлы LeaveTemporaryFiles yes # Обнаружение потенциально-нежелательного ПЛ DetectPUA yes # clamav попытается обнаружить битые исполняемые файлы (оба PE и ELF) # и пометят их как Broken.Executable. DetectBrokenExecutables yes # Сканировать почту ScanMail yes |
Остальные настройки были оставлены по умолчанию
freshclam.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # Расположение антивирусных баз DatabaseDirectory /var/db/clamav # Пишем лог UpdateLogFile /var/log/clamav/freshclam.log # Максимальный размер лога LogFileMaxSize 2M # Ставим в логе отметки времени LogTime yes # Подробное логгирование LogVerbose yes # Использовать сислог LogSyslog yes # Определение типа сообщений для сислога LogFacility LOG_MAIL # Сохраняем идентификатор процесса PidFile /var/run/clamav/freshclam.pid # Владелец базы DatabaseOwner clamav # Инициализировать права дополнительных групп AllowSupplementaryGroups yes # Зеркало антивирусных баз DatabaseMirror database.clamav.net # Количество попыток подключения к зеркалу MaxAttempts 5 # Отключаем сжатие баз для увеличения скорости работы CompressLocalDatabase no # Посылаем clamav команду перезагрузки NotifyClamd /usr/local/etc/clamd.conf |
Теперь установим SpamAssassin:
1 2 | cd /usr/ports/mail/p5-Mail-SpamAssassin/ sudo make install clean |
И необходимые perl-модули
1 2 3 | /usr/ports/security/p5-Digest-SHA1/ /usr/ports/www/p5-HTML-Parser/ /usr/ports/dns/p5-Net-DNS/ |
Редактируем конфиг
1 2 | cd /usr/local/etc/mail/spamassassin/ cp local.cf.sample local.cf |
local.cf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # Добавляем запись к заголовку письма, если письмо определено как спам rewrite_header Subject *****SPAM***** # Доверенные сети trusted_networks 192.168/16 # Метод защиты файлов базы lock_method flock # Количество "очков", набрав которые письмо считается спамом required_score 5.0 # Использовать Bayes алгоритмы при проверке почтовых сообщений use_bayes 1 # Автообучение Bayes bayes_auto_learn 1 # Не активировать систему, пока она не обучится на некотором количестве писем bayes_min_spam_num 50 bayes_min_ham_num 50 # Журналировать процесс обучения bayes_learn_to_journal 1 # Выставляем права на файлы bayes_file_mode 0666 # Не выполнять проверку по блэклистам. При установке параметра в 0 - опция будет включена skip_rbl_checks 0 |
Ну а теперь всё это надо связать с exim. Дописываем в конфиг строчки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # Разрешаем проверку содержимого сообщения acl_smtp_data = acl_check_data # Подключаемся к интерфейсам антивируса и антиспама av_scanner = clamd:/var/run/clamav/clamd.sock spamd_address = 127.0.0.1 783 # Проверяем содержимое на вирусы и спам acl_check_data: deny malware = * message = This message contains a virus ($malware_name) warn message = X-Spam-Score: $spam_score ($spam_bar) hosts = !+relay_from_hosts spam = spamd:true warn message = X-Spam-Report: $spam_report hosts = !+relay_from_hosts spam = spamd:true warn message = Subject: ***SPAM*** $h_Subject: hosts = !+relay_from_hosts spam = spamd deny message = This message scored $spam_score spam points. spam = spamd:true hosts = !+relay_from_hosts condition = ${if >{$spam_score_int}{120}{1}{0}} accept |
В rc.conf пишем:
1 2 3 4 5 | clamav_clamd_enable="YES" clamav_freshclam_enable="YES" clamav_freshclam_flags="-c 2" # Обновляемся 2 раза в сутки clamsmtpd_enable="YES" spamd_enable="YES" |
Запускаем
1 2 3 4 5 6 | cd /usr/local/etc/rc.d/ ./clamav-clamd start ./clamav-freshclam start ./clamsmtpd start ./sa-spamd start ./exim restart |
Проверяем
1 2 3 4 5 6 7 8 | $ps ax | grep clam 1054 ?? Is 0:02.32 /usr/local/bin/freshclam -c 2 --daemon -p /var/run/clamav/freshclam.pid 32152 ?? Is 0:06.28 /usr/local/sbin/clamd 36745 ?? Is 0:00.00 /usr/local/sbin/clamsmtpd -f /usr/local/etc/clamsmtpd.conf -p /var/run/clamav/clamsmtpd.pid $ps ax | grep spam 47540 ?? Ss 0:01.74 /usr/local/bin/spamd -c -Q -d -r /var/run/spamd/spamd.pid (perl5.8.9) 47556 ?? I 0:05.41 spamd child (perl5.8.9) 47557 ?? I 0:00.01 spamd child (perl5.8.9) |
Ротация логов clamav.
Еженедельное архивирование и хранение не более 7ми архивов будет выглядеть так:
1 2 | /etc/newsyslog.conf /var/log/clamav/clamd.log clamav:clamav 644 7 * $W1D0 JB /var/run/clamav/clamd.pid 1 |
Всё получилось :)
Домашняя директория spamd находится в /var/spool/spamd/.spamassassin.
Не забываем проверять пути и права на файлы.
Привет, Лена.
Сейчас мучаю Exim, дошло дело до антивируса.
Прочитал твою статью эту и мне кажеца есть лишний шаг.
Касаеца программы clamsmtp. Здесь:
http://packages.debian.org/ru/sid/clamsmtp
Я так понимаю, если бы использовался clamsmtp, то проверка входящих письменов (с учетом конфигов выше) была бы приблизительно такая:
Письмо -> Exim -> 127.0.0.1:10025 (clamsmtp) -> /var/run/clamav/clamd.sock (ClamAV) -> (clamsmtp) 127.0.0.1:10026 -> Exim
НО в твоем случае проверка будет проходить так:
Exim -> /var/run/clamav/clamd.sock (ClamAV) -> Exim
Т.е. прога clamsmtp — лишняя (во всяком случае мне так показалосЬ).