Информация
На главную Главная

Мой t-cards.ru
Войти Войти
Зарегистрироваться Регистрация

Разное
Форум Форум
Вернуться Форумы на t-cards.ru> Hard"n"Soft
Логин
Пароль
Регистрация Участники Поиск >> FAQ


Сообщения в теме: "SpamAssassin - пример настройки с ипользованием My..."
25.10.2005 17:38
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 272
По умолчаниюSpamAssassin - пример настройки с ипользованием MySQL

Очень хорошая софтина для фильтрации спама, прикручивается к любому MTA (в данном случае, Exim). Имеет кучу настроек, еще со всеми не успел поиграться, спама проходит не много, но все же...
Итак.

emerge spamassassin

Сразу настроим МТА на связку с фильтром, чтоб потом не возвращаться:

#/etc/exim/exim.conf:
#В глобальных параметрах добавляем строку
spamd_address = 127.0.0.1 783

#В секции acl (а конкретно в секции acl_check_message) добавляем условие на проверку
warn
spam = $header_to
#message = Subject: Possible *SPAM* $h_subject:


#message закомментировал, хотя можно оставить. Добавит к письму снизу заголовок. Он не перезаписывает заголовок, а добавляет измененный отдельной строкой снизу, не все почтовые клиенты это понимают. Поэтому хочу перезаписать заголовок в спам-фильтре.

Далее. Переходим к настройке самого фильтра. Создадим базу в MySQL под именем spamassassin, дадим доступ к ней пользователю spamd с паролем например spamd, права на SELECT, INSERT, UPDATE, DELETE и таблицы для хранения инфы (скрипты для создания таблиц в посте ниже).

Теперь непосредственно сами конфиги:

#/etc/mail/spamassassin/init.pre - глобальный файл конфига

loadplugin Mail::SpamAssassin::Plugin::RelayCountry
loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
loadplugin Mail::SpamAssassin::Plugin::Hashcash
loadplugin Mail::SpamAssassin::Plugin::SPF

bayes_store_module Mail::SpamAssassin::BayesStore::SQL
auto_whitelist_factory Mail::SpamAssassin::SQLBasedAddrList


Теперь файл опций, назвать можно как угодно (*.cf)
#/etc/mail/spamassassin/local.cf:

rewrite_header subject Possible *SPAM*

#Хотелось бы, чтоб это работало!!
#Не проверял еще.
#ну и эти заголовки добавим (тоже не проверено еще):

add_header spam Flag _YESNOCAPS_
add_header all Status _YESNO_, score=_SCORE_ required=_REQD_ tests=_TESTS_ autolearn=_AUTOLEARN_ version=_VERSION_
add_header all Level _STARS(*)_
add_header all Checker-Version SpamAssassin _VERSION_ (_SUBVERSION_) on _HOSTNAME_

report_safe 0
trusted_networks 192.168/16 127/8

use_bayes 1
use_bayes_rules 1
bayes_auto_learn 1
bayes_auto_learn_threshold_nonspam 0.1
bayes_auto_learn_threshold_spam 12.0
bayes_use_hapaxes 1
bayes_use_chi2_combining 1
bayes_journal_max_size 102400
bayes_expiry_max_db_size 150000
bayes_auto_expire 1

#mysql
user_scores_dsn DBI:mysql:spamassassin:localhost
user_scores_sql_username spamd
user_scores_sql_password spamd

bayes_sql_dsn DBI:mysql:spamassassin:localhost
bayes_sql_username spamd
bayes_sql_password spamd
bayes_sql_override_username spamd

user_awl_dsn DBI:mysql:spamassassin:localhost
user_awl_sql_username spamd
user_awl_sql_password spamd
user_awl_sql_table awl

Проверить все это дело можно так - запустить фильтр в режиме дебага - spamd -D -q, смотреть на консоль, а в это время дать ему на обработку спамерское письмо:
cat message.txt |spamc

В логе можно увидеть коннект к MySQL либо ошибки коннекта. Если ошибок нет, то можно запускать фильтр в режиме демона. Для этого есть в gentoo существует файл опций запуска демона, /etc/conf.d/spamd, в нем следующую строку указал:
SPAMD_OPTS="-m 5 -c -x -q -i 127.0.0.1 -s /var/log/spamd/spamd.log -H /var/spool/spamd"
(все эти и дpугие опции доступны из man spamd)

Если ранее spamd работал в режиме автообучения, но записи хранил не в MySQL, то надо сделать слудющее: до того, как менять основной файл конфига, надо бэкапнуть все прошлые записи посредством
sa-learn --backup > backup.spamd
и потом, поменяв файл конфига, восстановить уже в MySQL:
sa-learn --restore backup.spamd

В дальнейшем записи в базу буду заноситься автоматически при проверке писем.
Для начального обучения фильтра я подсунул ему коллекцию из 3518 спамерских писем, которые собирал в имаповскую папку:
sa-learn --spam /var/mail/msk.x-card.ru/serg/.INBOX.Spam/*

В дальнейшем планируется создать расшаренную имаповскую папку, в которую будут складываться письма, пропущенные фильтром, а также вторую папку. в которой будут ошибочно помеченные, надо будет разобучать фильтр командой типа
sa-learn --ham ...папка
26.10.2005 00:02
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 272
По умолчаниюSpamAssassin - пример настройки с ипользованием MySQL

Скрипты для создания таблиц в базе:

1. Для userpref:

CREATE TABLE userpref (
username varchar(100) NOT NULL default "",
preference varchar(30) NOT NULL default "",
value varchar(100) NOT NULL default "",
prefid int(11) NOT NULL auto_increment,
PRIMARY KEY (prefid),
KEY username (username)
) TYPE=MyISAM;

2. Для bayes:

CREATE TABLE bayes_expire (
id int(11) NOT NULL default "0",
runtime int(11) NOT NULL default "0",
KEY bayes_expire_idx1 (id)
) TYPE=MyISAM;

CREATE TABLE bayes_global_vars (
variable varchar(30) NOT NULL default "",
value varchar(200) NOT NULL default "",
PRIMARY KEY (variable)
) TYPE=MyISAM;

INSERT INTO bayes_global_vars VALUES ("VERSION","3");

CREATE TABLE bayes_seen (
id int(11) NOT NULL default "0",
msgid varchar(200) binary NOT NULL default "",
flag char(1) NOT NULL default "",
PRIMARY KEY (id,msgid)
) TYPE=MyISAM;

CREATE TABLE bayes_token (
id int(11) NOT NULL default "0",
token char(5) NOT NULL default "",
spam_count int(11) NOT NULL default "0",
ham_count int(11) NOT NULL default "0",
atime int(11) NOT NULL default "0",
PRIMARY KEY (id, token)
) TYPE=MyISAM;

CREATE TABLE bayes_vars (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(200) NOT NULL default "",
spam_count int(11) NOT NULL default "0",
ham_count int(11) NOT NULL default "0",
token_count int(11) NOT NULL default "0",
last_expire int(11) NOT NULL default "0",
last_atime_delta int(11) NOT NULL default "0",
last_expire_reduce int(11) NOT NULL default "0",
oldest_token_age int(11) NOT NULL default "2147483647",
newest_token_age int(11) NOT NULL default "0",
PRIMARY KEY (id),
UNIQUE bayes_vars_idx1 (username)
) TYPE=MyISAM;

3. Для AWL (Automatic Whitelists):

CREATE TABLE awl (
username varchar(100) NOT NULL default "",
email varchar(200) NOT NULL default "",
ip varchar(10) NOT NULL default "",
count int(11) default "0",
totscore float default "0",
PRIMARY KEY (username,email,ip)
) TYPE=MyISAM;
26.10.2005 00:17
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 272
По умолчаниюSpamAssassin - пример настройки с ипользованием MySQL

Говорят, rewrite_header и add_header работать с Exim не будет, надо средствами exim system filter (пример есть где-то в exiscan-acl-examples.txt)...

А посему оставляем пока в конфиге почтовика так:

#spam

warn message = Subject: Possible *SPAM* $h_subject
spam = nobody:true
warn message = X-Spam-Score: $spam_score ($spam_bar)
spam = nobody:true
warn message = X-Spam-Checker-Version: SpamAssassin 3.0.4
spam = nobody:true

#Add X-Spam-Flag if spam is over system-wide threshold

warn message = X-Spam-Flag: YES
spam = nobody

# Reject spam messages with score over 10, using an extra condition.

deny message = This message scored $spam_score spam-points. Congratulations!
spam = nobody:true
condition = ${if >{$spam_score_int}{100}{1}{0}}
31.10.2005 14:05
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 272
По умолчаниюSpamAssassin - пример настройки с ипользованием MySQL

Так, найден способ перезаписать заголовок.. все гениально блин просто!

Меняем exim.conf так:

warn message = X-New-Subject: Possible *SPAM* $h_subject
spam = nobody


(типа формируем новую строку заголовка X-New-Subject)

Далее в системном фильтре (в моем случае - файл my_filter) делаем следующее:

if "${if def:header_X-New-Subject: {there}}" is there
then
headers remove Subject
headers add "Subject: $h_X-New-Subject:"
headers remove X-New-Subject
endif


(смотрим, если есть заголовок X-New-Subject, удаляем старый Subject и заменяем его на новое значение).
02.11.2005 13:32
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 272
По умолчаниюSpamAssassin - пример настройки с ипользованием MySQL

А теперь заведем в таблицу юзеров и алиясов колонку refuse_spam, если 1 - то не принимать спам, если 0 - то помечать и принимать.

В конфиге:
#/etc/exim/exim.conf
#В цепочке проверки acl_check_rcpt:

warn message = X-Refuse-Spam: Yes
condition = ${lookup mysql{SELECT refuse_spam FROM dbmail_users WHERE lower(userid) = lower("$local_part") AND lower(domain) = lower("$domain") AND refuse_spam = 1 UNION ALL SELECT DISTINCT refuse_spam FROM aliases WHERE lower(alias) = "$local_part@$domain" AND refuse_spam = 1}{yes}{no}}
set acl_m0 = 1

(Добавили флаг в письмо X-Refuse-Spam: Yes для виду и проверили, если refuse_spam = 1, то устанавливаем переменную acl_m0 = 1, которую можно использовать в любой цепочке на протяжении проверки в acl)

#В цепочке проверки acl_check_message: (между какими-нить условиями, что описаны были выше)

deny message = This user doesn"t want to accept spam!
spam = nobody
condition = ${if eq {$acl_m0}{1}{1}{0}}

Еще планируется в таблицу завести предельное значение коэфф-та, после которого письмо считать спамом. Я думаю сделать по умолчанию 6.
02.11.2005 14:14
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 272
По умолчаниюSpamAssassin - пример настройки с ипользованием MySQL

Лирическое отступление.
Проверим возможность локальной доставки сразу после команды RCPT TO и сгенерим 5хх сразу:

#В цепочке проверки acl_check_rcpt:

deny message = User does not exist!
condition = ${lookup mysql{SELECT userid FROM dbmail_users WHERE lower(userid) = lower("$local_part") AND lower(domain) = lower("$domain") UNION ALL SELECT deliver_to FROM aliases WHERE lower(alias) = lower("$local_part@$domain")}{no}{yes}}
25.11.2005 15:45
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 272
По умолчаниюSpamAssassin - пример настройки с ипользованием MySQL

> Еще планируется в таблицу завести предельное значение коэфф-та, после которого письмо считать спамом. Я думаю сделать по умолчанию 6.

Вот сделал:
#В цепочке проверки acl_check_rcpt:

warn
condition = ${if eq {1}{1}{1}{0}}
set acl_m1 = ${lookup mysql{SELECT spam_score FROM dbmail_users WHERE lower(userid) = lower("$local_part") AND lower(domain) = lower("$domain") AND refuse_spam = 1}}


#В цепочке проверки acl_check_message: (к тому, что было выше, добавлена одна строка):

deny message = This user doesn"t want to accept spam!
spam = nobody
condition = ${if eq {$acl_m0}{1}{1}{0}}
condition = ${if > {$spam_score_int}{$acl_m1}{1}{0}}


Поле spam_score завел в таблице и сделал туда по умолчанию 50 ($spam_score_int измеряется в величинах, в 10 раз больших, а так считай, это критерий в 5.0)
11.07.2006 14:29
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 272
По умолчаниюSpamAssassin - пример настройки с ипользованием MySQL

Наметилась проблема - на больших письмах при проверке письма на спам и на вирус сервак просто начал умирать... Поэтому отключил приверку, если размер письма более 2Мб:

accept
condition = ${if > {$message_size}{2097152}{1}{0}}