DSPAM

Материал из Provizorii
Перейти к: навигация, поиск

DSPAM — это свободное программное обеспечение, представляющее собой статистический спам фильтр написанный Jonathan A. Zdziarski, автором книги Ending Spam (ISBN 1593270526). Это масштабируемый спам фильтр на основе содержания, для больших многопользовательских систем. DSPAM распространяется под лицензией GNU General Public License

Проект состоит из библиотеки libdspam, которая содержит основные процедуры фильтрации и хранения, и интерфейсы командной строки и HTTP. DSPAM независим от агента пересылки сообщений (англ. mail transfer agent, MTA), может хранить данные классификации спама в форматах разных баз данных, и использует фильтрацию на основе теоремы Байеса для обучения.

DSPAM по умолчанию собирается с опцией запуска от пользователя root и группы mail. Гораздо лучше будет выделить под это отдельного пользователя.

Приступим к установке DSPAM.

<poem> Для начала добавим опции сборки в /etc/make.conf, чтобы собранный DSPAM запускался от имени отдельного пользователя: DSPAM_OWNER=dspam DSPAM_GROUP=dspam DSPAM_HOME_OWNER=dspam DSPAM_HOME_GROUP=dspam

Впоследствии при сборке порта мы столкнемся с тем, что пользователь и группа автоматически не создаются. Поэтому создадим их сейчас руками:

  1. pw groupadd dspam
  2. pw useradd dspam -g dspam -s "/sbin/nologin" -c "DSPAM"

Теперь можно переходить к установке порта.

  1. cd /usr/ports/mail/dspam
  2. make config

Отмечаем поддержку нужных нам опций: [X] SYSLOG Logs via syslog [X] DEBUG Enable debugging logging [X] DAEMON Daemonize dspam; speaks LMTP or DLMTP [X] MYSQL51 Use MySQL 5.1.x as back-end [X] VIRT_USERS Enable virtual users (needs SQL back-end) [X] CGI Install CGI (pulls in Apache or see below)

Собираем и устанавливаем порт:

  1. make install clean

После сборки порта отредактируем /etc/rc.conf и добавим туда: dspam_enable="YES"

Создадим директорию в /var/run, где будут лежать dspam.pid и dspam.sock:

  1. mkdir /var/run/dspam
  2. chown dspam:dspam /var/run/dspam

Создадим базу данных, в которой DSPAM будет хранить токены и прочую информацию:

  1. mysql

mysql> create database dspam; mysql> grant all on dspam.* to ‘dspam’@'localhost’ identified by ‘dspam’; mysql> flush privileges; mysql> quit

Заполняем базу таблицами из .sql файлов, прилагающихся к DSPAM’у:

  1. mysql dspam < /usr/local/share/examples/dspam/mysql/mysql_objects-4.1.sql
  2. mysql dspam < /usr/local/share/examples/dspam/mysql/virtual_users.sql

Переходим к настройке DSPAM. Отредактируем /usr/local/etc/dspam.conf:

  1. Общие настройки

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

  1. Пользовательские настройки по умолчанию

Preference "signatureLocation=headers" # 'message' or 'headers' Preference "showFactors=on" Preference "spamAction=tag" Preference "spamSubject=***SPAM***"

  1. Разрешаем пользователям изменять определенные настройки

AllowOverride trainingMode AllowOverride spamAction spamSubject AllowOverride statisticalSedation AllowOverride enableBNR AllowOverride enableWhitelist AllowOverride signatureLocation AllowOverride showFactors AllowOverride optIn optOut AllowOverride whitelistThreshold

  1. Параметры доступа к БД

MySQLServer localhost MySQLPort 3306 MySQLUser dspam MySQLPass dspam MySQLDb dspam MySQLCompress true MySQLVirtualTable dspam_virtual_uids MySQLVirtualUIDField uid MySQLVirtualUsernameField username MySQLUIDInSignature on

  1. Инжектирование писем назад в постфикс

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 готов к работе. Можно запускать:

  1. /usr/local/etc/rc.d/dspam start

</poem>

См. также