Статья размещена с согласия его автора. Оригинал, т.е. материал в его авторском виде, доступен на .
В этой статье рассмотрены установка и настройка спам-фильтра DSPAM в среде операционной системы FreeBSD. С некоторыми подробностями о том, как DSPAM фильтрует спам в письмах, можно ознакомиться в статье «Краткий обзор спам-фильтра DSPAM».
Сперва я сделаю пару оговорок:
Во время моего первого знакомства с этим фильтром я столкнулся с проблемой, когда DSPAM периодически «отваливался». Причем проблема возникала спонтанно — вне зависимости от нагрузки, времени работы и любых других факторов. В итоге, после чтения форумов и списков рассылки выяснилось, что проблема присутствует не только у меня одного. Общей сходной чертой у всех была включенная поддержка ClamAV в DSPAM. И проблема исчезла после того, как обязанность передачи писем ClamAV'у была снята с DSPAM'а и возложена на Postfix. Хотя в текущей версии (3.6.8) проблема устранена, я уже привык не использовать поддержку ClamAV и передавать сообщения для проверки в ClamAV непосредственно из Postfix.
DSPAM по умолчанию собирается с опцией запуска от пользователя root и группы mail. Я считаю, что гораздо лучше будет выделить под это отдельного пользователя.
Итак, приступим. Для начала добавим опции сборки в
/etc/make.conf
, чтобы собранный DSPAM запускался от имени отдельного пользователя:
Создадим базу данных, в которой DSPAM будет хранить токены и прочую информацию:
# mysql
mysql> create database dspam;
mysql> grant all on dspam.* to 'dspam'@'localhost' identified by 'dspam';
mysql> flush privileges;
mysql> quit
Заполняем базу таблицами из SQL-файлов, прилагающихся к DSPAM:
# mysql dspam < /usr/local/share/examples/dspam/mysql/mysql_objects-4.1.sql
# mysql dspam < /usr/local/share/examples/dspam/mysql/virtual_users.sql
Переходим к редактированию
/usr/local/etc/dspam.conf
:
# Общие настройки
ServerMode auto
Home /var/db/dspam
StorageDriver /usr/local/lib/libmysql_drv.so
ServerDomainSocketPath "/var/run/dspam/dspam.sock"
ServerPID /var/run/dspam/dspam.pid
ServerParameters "--deliver=innocent, spam"
ServerIdent "localhost.localdomain"
Notifications off
PurgeSignatures 14 # Stale signatures
PurgeNeutral 90 # Tokens with neutralish probabilities
PurgeUnused 90 # Unused tokens
PurgeHapaxes 30 # Tokens with less than 5 hits (hapaxes)
PurgeHits1S 15 # Tokens with only 1 spam hit
PurgeHits1I 15 # Tokens with only 1 innocent hit
LocalMX 127.0.0.1
SystemLog on
UserLog on
Opt out
ParseToHeaders on
ChangeModeOnParse on
ChangeUserOnParse off
MaxMessageSize 307200
Trust dspam
TrainingMode teft
TestConditionalTraining on
Feature chained
Feature whitelist
Algorithm graham burton
PValue graham
ProcessorBias on
# Пользовательские настройки по умолчанию
Preference "signatureLocation=headers" # 'message' or 'headers'
Preference "showFactors=on"
Preference "spamAction=tag"
Preference "spamSubject=***SPAM***"
# Разрешаем пользователям изменять определенные настройки
AllowOverride trainingMode
AllowOverride spamAction spamSubject
AllowOverride statisticalSedation
AllowOverride enableBNR
AllowOverride enableWhitelist
AllowOverride signatureLocation
AllowOverride showFactors
AllowOverride optIn optOut
AllowOverride whitelistThreshold
# Параметры доступа к БД
MySQLServer localhost
MySQLPort 3306
MySQLUser dspam
MySQLPass dspam
MySQLDb dspam
MySQLCompress true
MySQLVirtualTable dspam_virtual_uids
MySQLVirtualUIDField uid
MySQLVirtualUsernameField username
MySQLUIDInSignature on
# Инжектирование писем назад в Postfix
DeliveryHost 127.0.0.1
DeliveryPort 10027
DeliveryIdent localhost
DeliveryProto SMTP
Фильтр практически готов к работе. Нам остается только решить, каким образом мы будем хранить токены. DSPAM позволяет хранить отдельную базу токенов для каждого пользователя. Таким образом, у каждого будет свой набор токенов и фильтр будет индивидуально для каждого проверять письмо на его принадлежность к категории «спам». В моем случае этот подход не прижился. Дело в том, что для случая со 100 пользователями справедливо, что если хотя бы десяток из них занимается обучением фильтра — уже хорошо. Остальные 90 не утруждают себя этой задачей и, как следствие, в итоге имеют достаточное количество неверных классификаций. Выходом из этой ситуации для меня стало использование «разделяемой» группы (
shared
). При внесении пользователей в
shared
токены становятся общими для этой группы. Таким образом, если из 100 пользователей 10 будут периодически указывать фильтру на ошибки в классификации, то база токенов будет поддерживаться в актуальном виде для всех. Да и размер самой базы станет заметно меньше. Для занесения пользователей в группу
shared
нужно отредактировать файл
/var/db/dspam/group
(если его нет — создайте и не забудьте про владельца:
chown dspam:dspam
):
globalgroup:shared:*
Всё. DSPAM готов к работе. Можно запускать:
# /usr/local/etc/rc.d/dspam start
Установка и настройка веб-интерфейса DSPAM WebUI
DSPAM WebUI — это Web-интерфейс, который позволяет пользователю просмотреть статистику по своему почтовому ящику, изменить некоторые настройки (которые администратор разрешил изменять пользователям), просмотреть список принятых сообщений, результаты классификации этих сообщений фильтром, а также произвести «переобучение» фильтра в случае неверной классификации сообщения.
Перейдем к настройке DSPAM WebUI. Для начала создадим дерево каталогов для виртуального хоста с DSPAM WebUI и зададим права:
# Разрешаем исполнение CGI,
# запрещаем изменение параметров htacess'ом
# и включаем аутентификацию через MySQL
<Directory "/home/dspam/dspam.example.com">
Options ExecCGI
AllowOverride None
AuthName "DSPAM WebUI"
AuthType Basic
AuthMySQLEnable On
AuthMySQLHost localhost
AuthMySQLUser postfix
AuthMySQLPassword postfix
AuthMySQLDB postfix
AuthMySQLUserTable mailbox
AuthMySQlNameField username
AuthMySQLPasswordField password
AuthMySQLPwEncryption crypt
require valid-user
</Directory>
# Запрещаем пользователям доступ к служебным файлам
<Files admins>
Order allow,deny
Deny from all
</Files>
<Files configure.pl>
Order allow,deny
Deny from all
</Files>
<Files default.prefs>
Order allow,deny
Deny from all
</Files>
# Задаем индексный файл
DirectoryIndex dspam.cgi
# Поскольку мы не предусматриваем на этом
# виртуальном хосте исполнение PHP-скриптов,
# на всякий случай отключим их исполнение
AddType text/plain .php
# Задаем пользователя, от которого
# будут работать CGI-скрипты
User dspam
Group dspam