Украинская Баннерная Сеть

Аренда сервера. Выделенные серверы в Украине и Нидерландах
Аренда сервера

VPS, VDS, Windows VPS - от $10
VPS
DSPAM. Установка и настройка.

dspam

В этой части мы рассмотрим установку и настройку DSPAM, но сначала я сделаю пару оговорок.

Первая. Во время моего первого знакомства с этим фильтром я столкнулся с проблемой, когда DSPAM периодически отваливался. При чем проблема возникала спонтанно вне зависимости от нагрузки, времени работы или любых других факторов. В итоге после чтения форумов и списков рассылки выяснилось, что проблема присутствует не только у меня одного. Общей сходной чертой у всех было включенная поддержка ClamAV в DSPAM. Проблема исчезла после того, как обязанность передачи писем Clam’у была снята с DSPAM’а и возложена на postfix. И хотя, в текущей версии (3.6.8) проблема устранена, но я уже привык не использовать поддержку ClamAV и передавать сообщения для проверки Clam’у непосредственно из postfix’а.

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

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

Для начала добавим опции сборки в /etc/make.conf, чтобы собранный DSPAM запускался от имени отдельного пользователя:

DSPAM_OWNER=dspam
DSPAM_GROUP=dspam
DSPAM_HOME_OWNER=dspam
DSPAM_HOME_GROUP=dspam

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

# pw groupadd dspam
# pw useradd dspam -g dspam -s "/sbin/nologin" -c "DSPAM"

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

# cd /usr/ports/mail/dspam
# 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)

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

# make install clean

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

dspam_enable="YES"

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

# mkdir /var/run/dspam
# chown dspam:dspam /var/run/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

Переходим к настройке DSPAM. Отредактируем /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

# Инжектирование писем назад в постфикс
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 webuiDSPAM WebUI – это web-интерфейс, который позволяет пользователю просмотреть статистику по своему почтовому ящику, изменить некоторые настройки (которые администратор разрешил изменять пользователям), просмотреть список принятых сообщений, результаты классификации этих сообщений фильтром; позволяет произвести “переобучение” фильтра в случае неверной классификации сообщения.

Перейдем к настройке DSPAM WebUI. Для начала создадим дерево каталогов для виртуального хоста с DSPAM WebUI и зададим права:

# mkdir /home/dspam
# mkdir /home/dspam/dspam.example.com
# chmod -R 755 /home/dspam

В директории /usr/local/www/vhosts/dspam находятся непосредственно скрипты WebUI. Скопируем их в директорию, где будет размещаться наш VirtualHost и зададим владельца:

# cp -R /usr/local/www/vhosts/dspam/* /home/dspam/dspam.example.com/
# chown -R dspam:dspam /home/dspam

В корневой директории со скриптами есть файл configure.pl.sample, переименуем его в configure.pl, чтобы он был доступен для DSPAM WebUI:

# cp /home/dspam/dspam.example.com/configure.pl.sample /home/dspam/dspam.example.com/configure.pl

Отредактируем этот файл изменив всего одну опцию:

$CONFIG{'LOCAL_DOMAIN'} = "dspam.example.com";

То же самое делаем с файлом пользовательских настроек по умолчанию:

cp /home/dspam/dspam.example.com/default.prefs.sample /home/dspam/dspam.example.com/default.prefs

И отредактируем его:

trainingMode=TUM
spamAction=tag
spamSubject=***SPAM***
statisticalSedation=5
enableBNR=on
enableWhitelist=on
signatureLocation=headers
showFactors=off

Для того, чтобы эти настройки были видны демону DSPAM сделаем символическую ссылку:

# ln -s /home/dspam/dspam.example.com/default.prefs /var/db/dspam/default.prefs

Затем, в созданной нами директории для конфигурационных файлов виртуалхостов (/usr/local/etc/apache/vhosts) создаем файл виртуалхоста для DSPAM WebUI:

touch /usr/local/etc/apache/vhosts/dspam.conf

Сконфигурируем его:

<Virtualhost>
ServerName dspam.example.com
ServerAdmin [email protected]
DocumentRoot "/home/dspam/dspam.example.com"

# Разрешаем исполнение 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

# Логирование
ErrorLog /var/log/httpd/dspam-error.log
TransferLog /var/log/httpd/dspam-access.log
</Virtualhost>

Перезапускаем apache:

# apachectl restart

Теперь можно зайти браузером по адресу http://dspam.example.com, используя в качестве логина [email protected] и пароль от этого ящика. Вы увидите информацию по ящику [email protected] Кроме того, если добавить [email protected] в /home/dspam/dspam.example.com/admins, то пользователь [email protected] будет обладать правами администратора и в web-интерфейсе мы сможем видеть информацию по любому почтовому ящику.

DSPAM, shared группа и WebUI (дополнение)

Парой постов раньше я уже описывал о проблеме обучения DSPAM’а через web интерфейс. Я не заметил, что обучение нажатием на ссылку описывается в скрипте отдельно от обучения проставлением галочек и нажатием на кнопку. В итоге групповая пометка писем не работала. Вот кусок кода который за это отвечает:

if ($FORM{’command’} eq “retrainChecked”) {
foreach my $i (0 .. $#{ $FORM{retrain_checked} }) {
my ($retrain, $signature) = split(/:/, $FORM{retrain_checked}[$i]);
if ($retrain eq “innocent”) {
$FORM{’signatureID’} = quotemeta($signature);
&ProcessFalsePositive();
undef $FORM{’signatureID’};
} elsif ($retrain eq “innocent” or $retrain eq “spam”) {
system($CONFIG{’DSPAM’}-source=error –-class=. quotemeta($retrain) . ” –-signature=. quotemeta($signature) .-–user ” . quotemeta($CURRENT_USER));
}
}

А вот diff:

223c223,232
< &ProcessFalsePositive();

> my($w_log) = “$USER.log”;
> my($w_stamp) = time;
> my($w_status) = “F”;
> my($w_info) = “NA”;
> my($w_result) = “Retrained”;
> system(”$CONFIG{’DSPAM’} –-source=error -–class=” . quotemeta($retrain) . ” --signature=” . quotemeta($signature) . ” –-user ” . quotemeta(”$CURRENT_USER”));
> open (FILE, ‘>>’ . $w_log);
> print(FILE join(”t”, $w_stamp, $w_status, $w_info, $signature, $w_info, $w_result ), “nn”);
> close FILE;
>
226c235,245
< system(”$CONFIG{’DSPAM’} –-source=error –-class=” . quotemeta($retrain) . ” –-signature=” . quotemeta($signature) . ” –-user ” . quotemeta(”$CURRENT_USER”));

>
> my($w_log) = “$USER.log”;
> my($w_stamp) = time;
> my($w_status) = “M”;
> my($w_info) = “NA”;
> my($w_result) = “Retrained”;
> system(”$CONFIG{’DSPAM’} -–source=error –-class=” . quotemeta($retrain) . ” –-signature=” . quotemeta($signature) . ” –-user ” . quotemeta(”$CURRENT_USER”));
> open (FILE, ‘>>’ . $w_log);
> print(FILE join(”t”, $w_stamp, $w_status, $w_info, $signature, $w_info, $w_result ), “nn”);
> close FILE;
>

Конечно не совсем кошерно, но выходной на дворе, подробно разбираться лень :)

DSPAM, shared группа и WebUI

Стоял у меня дспам, работал себе, у каждого пользователя была своя база токенов. Работал он так до тех пор, пока мне не перестали нравиться размеры базы и я решил поэкспериментировать. Захотелось мне узнать какие будут результаты работы, если база токенов для всех будет общей. Добавил shared группу в group файл и наступил на грабли.

Оказалось, что переобучение в веб-интерфейсе не работает для тех сообщений, которые пришли пользователям в shared группе. На поверку выяснилось, что переобучение все таки происходит, но вот результаты переобучения не отображаются. Пришлось выяснять какого собственно хрена…

Подробнее »

DSPAM WebUI. Исправляем кодировку на странице истории.

У DSPAM’а есть одна неприятная особенность. На странице “история” вместо темы письма в некоторых случаях отображаются кракозябры. Происходит это потому, что письма приходят в разных кодировках и информация из них заносится в логи как есть, без перекодировок. dspam.cgi же в свою очередь просто берет информацию из лога и выводит тоже как есть. Сегодня меня эта особенность достала окончательно и я решил научить dspam.cgi определять кодировку и перекодировать строки. Результат выкладываю. Оранжевым для наглядности выделены добавленные или измененные строки.

Подробнее »


Украинская Баннерная Сеть
Hosting Catalog Rambler's Top100