Добавление Spam assissian к Postfix

Материал из Wiki МИАЦ ВО
Версия от 16:30, 25 декабря 2009; Misha (обсуждение | вклад) (Черные и белые списки)
Перейти к навигации Перейти к поиску

Описание взято spamassissian + Postfix

Установка пакетов

Итак устанавливаем пакет spammassissian*.rpm, spammassissian-spamd *.rpm, spammassissian-spamc *.rpm со всеми зависимостями.

Настройка

Добабляем пользователя, от которого будет работать спамфильтр

adduser spamfilter -s /sbin/nologin

Редактируем /etc/postfix/master.cf

Вконец добавляем строки

spamfilter unix - n n - - pipe 
    flags=Rq user=spamfilter argv=/etc/postfix/scripts/spamfilter -f ${sender} -- ${recipient}

Редактируем строку с smtp

smtp      inet  n       -       y       -       -       smtpd 
        -o content_filter=spamfilter:dummy

Cоздаем конфигурационный файл /etc/mail/spamassassin/local.cf

Если используем базу данных abills

user_scores_dsn                 DBI:mysql:%dbname%:%dbhost%
user_scores_sql_username        %dbuser%
user_scores_sql_password        %dbpasswd%
user_scores_sql_custom_query     SELECT preference, value FROM mail_spamassassin 
          WHERE username = _USERNAME_ OR username = '$GLOBAL' 
          OR username = CONCAT('%',_DOMAIN_)ORDER BY username ASC
# Autowhite list
auto_whitelist_factory Mail::SpamAssassin::SQLBasedAddrList
user_awl_dsn                DBI:mysql:%dbname%:%dbhost%
user_awl_sql_username       %dbuser%
user_awl_sql_password       %dbpasswd%
user_awl_sql_table          mail_awl

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

Использование локальных файлов

(полная документация - см. perldoc Mail::SpamAssassin::Conf)

required_hits 5
rewrite_header Subject ****SPAM****
report_safe 0
auto_learn 1
use_bayes 1
bayes_path /etc/mail/spamassassin/bayes
bayes_file_mode 0666
bayes_learn_to_journal 1
bayes_min_ham_num 50
bayes_min_spam_num 50
score SUBJ_FULL_OF_8BITS 0.00
score HTML_COMMENT_8BITS 0.01
score HEADER_8BITS 0.00
score TO_NO_USER 0.01
score FORGED_MUA_OUTLOOK 0.5
score X_AUTH_WARNING 0.01
score SUBJ_HAS_UNIQ_ID 9.99
score HTTP_USERNAME_USED 9.99
score FORGED_YAHOO_RCVD 9.99
score FORGED_JUNO_RCVD 16
score UNWANTED_LANGUAGE_BODY 1.02
score MLM 5.55
score RCVD_NUMERIC_HELO 4.95
ok_languages en ru
ok_locales en ru
subject_tag MESSAGE_MARKED_AS_SPAM
whitelist_to vt@bykoff.ru
whitelist_from root@localhost
whitelist_from root@localhost.localhost

auto_whitelist_path        /etc/mail/spamassassin/auto-whitelist
auto_whitelist_file_mode   0666
auto_learn_threshold_nonspam    -2
auto_learn_threshold_spam       9

blacklist_from *@888.com
blacklist_from *@msn.com
blacklist_from *@cat.es
blacklist_from *@pmail.gen.nz
blacklist_from *@femenino.com
blacklist_from *@infonium.com
blacklist_from *@outblaze.com

Примечание
bayes_path /etc/mail/spamassassin/bayes указывает что демон создаст три файла базы данных Bayesian фильтра для хранения создаваемых образчиков писем:

/etc/mail/spamassassin/bayes_seen
/etc/mail/spamassassin/bayes_journal
/etc/mail/spamassassin/bayes_toks

Параметры

bayes_min_ham_num 1
bayes_min_spam_num 1

указывают, сколько чистых писем и писем со спамом должно накопится в Bayesian базе прежде чем демон будет пользоваться этой базой (по умолчания - 200 чистых и спама)

Посмотреть базу можно командой sa-learn -dump auto_whitelist_path /etc/mail/spamassassin/auto-whitelist - Если Вы запустили демон с опцией -a то есть автообучения адресов, указывает, что демон создаст два файла базы данных адресов

/etc/mail/spamassassin/auto-whitelist.dir
/etc/mail/spamassassin/auto-whitelist.pag

auto whitelisting вычисляет средний уровень оценки для каждого отправителя и прибавляет его к оценке очередного письма. Это позволяет не блокировать "благонадежных" отправителей если оценка отдельного письма вдруг превысит предел. Кстати, посмотреть базу адресов можно из директории с распакованным дистрибутивом командой ./tools/check_whitelist /etc/mail/spamassassin/auto-whitelist

Создаем Bayes-базу

sa-learn --sync 

Затем следует убедится, что владелец файлов в директории /etc/mail/spamassassin/ - это наш новый пользователь.

# chown -R spamfilter /etc/mail/spamassassin/

Запускаем демон

service spamd start

в почтовом логфайле должны появится соответствующие строки о запуске демона

Создаем файл /etc/postfix/scripts/spamfilter

Используем локальный файл для пользователей без спам фильтра

#!/bin/sh

# Kalinga Athulathmudali
# 2006-01-06
# Variables
#exit $?
SENDMAIL="/usr/sbin/sendmail.postfix -i"
EGREP=/bin/egrep
USERS_WITH_SPAM="/etc/postfix/scripts/users_with_spam"

# Exit codes from <sysexits.h>

EX_UNAVAILABLE=69

# Number of *'s in X-Spam-level header needed to sideline message:
# (Eg. Score of 5.5 = "*****" )

SPAMLIMIT=5
#echo $$ > /var/tempfs/qqq.$$
# Clean up when done or when aborting.
trap "rm -f /var/tempfs/out.$$" 0 1 2 3 15
# Если письмо на пользователей без спам фильтра, то пропускаем не меняя
# Правда, если в письме спам, то пользователь получит письмо, завернутое
# спамфильтром
cat | /usr/bin/spamc -u spamfilter  > /var/tempfs/out.$$
if [ -n "`$EGREP  -i $4 $USERS_WITH_SPAM`" ]
    then
        $SENDMAIL -f "$1" "$4"  < /var/tempfs/out.$$
    else
        # Проверяем Spam-LevelБ если > $SPAMLIMIT, то отправляем в spam ящик
        if  $EGREP -q "^X-Spam-Level: \*{$SPAMLIMIT,}" < /var/tempfs/out.$$
            then
                ## Change the Email address where you want your spam to get fwd to
                $SENDMAIL -f spamadmin@yourdomain.com  spamtrap@yourdomain.com < /var/tempfs/out.$$
            else
                $SENDMAIL "$@" < /var/tempfs/out.$$
    fi
fi
# Postfix returns the exit status of the Postfix sendmail command.
exit $?

Для тех, кто использует базу данных abills

#!/bin/sh

# Kalinga Athulathmudali
# 2006-01-06
# Variables
#exit $?

SENDMAIL="/usr/sbin/sendmail.postfix -i"
EGREP="$(which egrep)"
MYSQL="$(which mysql)"

MyUSER="sql_user" # Пользователь базы данных
MyPASS="sql_path" # PASSWORD
MyHOST="localhost" # Hostname
MyBASE="abills"

NAME=`echo "$4" | cut -d "@" -f1`
DOMAIN=`echo "$4" | cut -d "@" -f2`
# Exit codes from <sysexits.h>

EX_UNAVAILABLE=69

# Number of *'s in X-Spam-level header needed to sideline message:
# (Eg. Score of 5.5 = "*****" )

SPAMLIMIT=5
#echo $$ > /var/tempfs/qqq.$$
# Clean up when done or when aborting.
trap "rm -f /var/tempfs/out.$$" 0 1 2 3 15
# Если письмо на пользователей без спам фильтра, то пропускаем не меняя
# Правда, если в письме спам, то пользователь получит письмо, завернутое
# спамфильтром
cat | /usr/bin/spamc -u spamfilter  > /var/tempfs/out.$$
# Смотрим в биллинге - включен или отключен spam фильтр для данного пользователя
SPAMF="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS $MyBASE -Bse "SELECT a.antispam
        FROM mail_boxes a
        INNER JOIN mail_domains b ON a.domain_id = b.id
        WHERE a.username=\"$NAME\"
        AND b.domain = \"$DOMAIN\"")"
if [ $SPAMF -eq 1 ]
    then
        $SENDMAIL -f "$1" "$4"  < /var/tempfs/out.$$
    else
        # Проверяем Spam-LevelБ если > $SPAMLIMIT, то отправляем в spam ящик
        if  $EGREP -q "^X-Spam-Level: \*{$SPAMLIMIT,}" < /var/tempfs/out.$$
            then
                ## Change the Email address where you want your spam to get fwd to
                $SENDMAIL -f misha@volmed.org.ru  spam@volmed.org.ru < /var/tempfs/out.$$
            else
                $SENDMAIL "$@" < /var/tempfs/out.$$
    fi
fi
# Postfix returns the exit status of the Postfix sendmail command.
exit $?

Для обоих скриптов

Теперь поменяйте с этом скрипте почтовые адреса
spamadmin@yourdomain.com на почтовый адрес администратора.
spamtrap@yourdomain.com на адрес, где будет складываться спам.

Теперь поменяйте владельца файла и его атрибуты.

chown spamfilter /etc/postfix/scripts/spamfilter
chmod 755 /etc/postfix/scripts/spamfilter

Теперь надо создать temp папку и дать ей нужные аттрибуты

mkdir /var/tempfs
chown spamfilter:root /var/tempfs

Создаем файл /etc/posfix/scripts/users_with_spam (только для локального файла для пользователей без спам фильтра), где указываем ящики, на которые нужно пропускать все письма, без спам фильтра.
Внимание: Если письмо на пользователей без спам фильтра, то пропускаем не меняя пользователя, правда, если в письме спам, то пользователь получит письмо, завернутое спамфильтром.

postmaster@yourdomain.com
vasja@yourdomain.com
vona@yourdomain.com

Ну вот и все. Перезапускаем Postfix.

/etc/init.d/postfix reload

Перенаправить Spam в отдельный почтовый ящик

В main.cf - раскоментировал

header_checks = regexp:/etc/postfix/header_checks 

Создал файлик header_checks

/^Subject: .*SPAM.*/ REDIRECT spamtrap@mydomain.ru

Но если ипользовать скрипт, то в нем и так идет перенаправление спама в указанный почтовый ящик.

Проверка

Отправьте на свой почтовый ящик письмо следующего содержимого

Subject: Test spam mail (GTUBE)
Message-ID: <GTUBE1.1010101@example.net>
Date: Wed, 23 Jul 2003 23:30:00 +0200
From: Sender <sender@example.net>
To: Recipient <recipient@example.net>
Precedence: junk
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

This is the GTUBE, the
	Generic
	Test for
	Unsolicited
	Bulk
	Email

If your spam filter supports it, the GTUBE provides a test by which you
can verify that the filter is installed correctly and is detecting incoming
spam. You can send yourself a test mail containing the following string of
characters (in upper case and with no white spaces and line breaks):

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

You should send this test mail from an account outside of your network.

В почтовый ящик, указанный в скрипте для спама должен попасть это письмо.