Добавление Spam assissian к Postfix: различия между версиями

Материал из Wiki МИАЦ ВО
Перейти к навигации Перейти к поиску
Новая: Описание взято [http://onetforum.com/fourm/viewtopic.php?p=63#63 spamassissian + Postfix] == Установка пакетов== Итак устанавливаем паке...
 
 
(не показано 17 промежуточных версий этого же участника)
Строка 1: Строка 1:
Описание взято [http://onetforum.com/fourm/viewtopic.php?p=63#63 spamassissian + Postfix]
Описание взято [http://onetforum.com/fourm/viewtopic.php?p=63#63 spamassissian + Postfix]
== Установка пакетов==
== Установка пакетов==
Итак устанавливаем пакет spammassissian*.rpm, spammassissian-cpamd *.rpm, spammassissian-spamc *.rpm со всеми зависимостями.
Итак устанавливаем пакет spammassissian*.rpm, spammassissian-spamd *.rpm, spammassissian-spamc *.rpm со всеми зависимостями.


==Настройка==
==Настройка==
====Добабляем пользователя, от которого будет работать спамфильтр====
===Добабляем пользователя, от которого будет работать спамфильтр===
<pre>adduser spamfilter -s /sbin/nologin</pre>
<pre>adduser spamfilter -s /sbin/nologin</pre>
====Редактируем /etc/postfix/master.cf====
===Редактируем /etc/postfix/master.cf===
Вконец добавляем строки
Вконец добавляем строки
<pre>spamfilter unix - n n - - pipe  
<pre>spamfilter unix - n n - - pipe  
Строка 13: Строка 13:
<pre>smtp      inet  n      -      y      -      -      smtpd  
<pre>smtp      inet  n      -      y      -      -      smtpd  
         -o content_filter=spamfilter:dummy</pre>
         -o content_filter=spamfilter:dummy</pre>
====Cоздаем конфигурационный файл /etc/mail/spamassassin/local.cf====
===Cоздаем конфигурационный файл /etc/mail/spamassassin/local.cf===
====Если используем базу данных abills====
<pre>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</pre>
'''SpamAssassin не понимает переноса строк в конфигурационном файле поэтому пишите запрос в одной строке'''
 
====Использование локальных файлов====
(полная документация - см. perldoc Mail::SpamAssassin::Conf)  
(полная документация - см. perldoc Mail::SpamAssassin::Conf)  
<pre>required_hits 5
<pre>required_hits 5
Строка 57: Строка 73:
blacklist_from *@infonium.com
blacklist_from *@infonium.com
blacklist_from *@outblaze.com</pre>
blacklist_from *@outblaze.com</pre>
====Примечание====
'''Примечание'''<br />
 
bayes_path /etc/mail/spamassassin/bayes указывает что демон создаст три файла базы данных Bayesian фильтра для хранения создаваемых образчиков писем:
bayes_path /etc/mail/spamassassin/bayes указывает что демон создаст три файла базы данных Bayesian фильтра для хранения создаваемых образчиков писем:
<pre>/etc/mail/spamassassin/bayes_seen
<pre>/etc/mail/spamassassin/bayes_seen
/etc/mail/spamassassin/bayes_journal
/etc/mail/spamassassin/bayes_journal
/etc/mail/spamassassin/bayes_toks</pre>
/etc/mail/spamassassin/bayes_toks</pre>
====Параметры====
 
'''Параметры'''<br />
<pre>bayes_min_ham_num 1
<pre>bayes_min_ham_num 1
bayes_min_spam_num 1</pre>
bayes_min_spam_num 1</pre>
Строка 79: Строка 95:
<pre># chown -R spamfilter /etc/mail/spamassassin/</pre>
<pre># chown -R spamfilter /etc/mail/spamassassin/</pre>


Запускаем демон  
'''Черные и белые списки'''<br />
Чтобы добавить почтовый ящик в черный список выполните следующее
<pre>spamassassin --add-addr-to-blacklist=boss@test.mail.com</pre>
Если надо убрать его оттуда, то надо этого пользователя добавить в белый лист, и он так сказать "отбеливается" <pre>spamassassin --add-addr-to-whitelist=boss@test.mail.com</pre>
 
===Запускаем демон===
<pre>service spamd start</pre>
<pre>service spamd start</pre>


в почтовом логфайле должны появится соответствующие строки о запуске демона
в почтовом логфайле должны появится соответствующие строки о запуске демона
===Создаем файл '''/etc/postfix/scripts/spamfilter'''===
====Используем локальный файл для пользователей без спам фильтра====
<pre>#!/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 $?
</pre>
</pre>


====Создаем файл '''/etc/postfix/scripts/spamfilter'''====
====Для тех, кто использует базу данных abills====
<pre>#!/bin/sh
<pre>#!/bin/sh


Строка 91: Строка 155:
# 2006-01-06
# 2006-01-06
# Variables
# Variables
#exit $?


SENDMAIL="/usr/sbin/sendmail.postfix -i"
SENDMAIL="/usr/sbin/sendmail.postfix -i"
EGREP=/bin/egrep
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>
# Exit codes from <sysexits.h>


Строка 103: Строка 176:


SPAMLIMIT=5
SPAMLIMIT=5
 
#echo $$ > /var/tempfs/qqq.$$
# Clean up when done or when aborting.
# Clean up when done or when aborting.
trap "rm -f /var/tempfs/out.$$" 0 1 2 3 15
trap "rm -f /var/tempfs/out.$$" 0 1 2 3 15
# Pipe message to spamc
# Если письмо на пользователей без спам фильтра, то пропускаем не меняя
cat | /usr/bin/spamc -u spamfilter > /var/tempfs/out.$$
# Правда, если в письме спам, то пользователь получит письмо, завернутое
if $EGREP -q "^X-Spam-Level: \*{$SPAMLIMIT,}" < /var/tempfs/out.$$
# спамфильтром
    then
cat | /usr/bin/spamc -u spamfilter > /var/tempfs/out.$$
          ## Change the Email address where you want your spam to get fwd to
# Смотрим в биллинге - включен или отключен spam фильтр для данного пользователя
              $SENDMAIL -f misha@proba.ru  spamtrap@proba.ru < /var/tempfs/out.$$
SPAMF="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS $MyBASE -Bse "SELECT a.antispam
    else
        FROM mail_boxes a
          $SENDMAIL "$@" < /var/tempfs/out.$$
        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
fi
# Postfix returns the exit status of the Postfix sendmail command.
# Postfix returns the exit status of the Postfix sendmail command.
exit $?</pre>
exit $?
</pre>
====Для обоих скриптов====
Теперь поменяйте с этом скрипте почтовые адреса<br />
Теперь поменяйте с этом скрипте почтовые адреса<br />
'''spamadmin@yourdomain.com''' на почтовый адрес администратора.<br />
'''spamadmin@yourdomain.com''' на почтовый адрес администратора.<br />
Строка 128: Строка 216:
<pre>mkdir /var/tempfs
<pre>mkdir /var/tempfs
chown spamfilter:root /var/tempfs</pre>
chown spamfilter:root /var/tempfs</pre>
Создаем файл '''/etc/posfix/scripts/users_with_spam''' (только для локального [[Добавление Spam assissian к Postfix#Используем локальный файл для пользователей без спам фильтра|файла для пользователей]] без спам фильтра), где указываем ящики, на которые нужно пропускать все письма, без спам фильтра. <br />
'''Внимание:''' Если письмо на пользователей без спам фильтра, то пропускаем не меняя пользователя, правда, если в письме спам, то пользователь получит письмо, завернутое  спамфильтром.
<pre>postmaster@yourdomain.com
vasja@yourdomain.com
vona@yourdomain.com</pre>
Ну вот и все. Перезапускаем Postfix.
Ну вот и все. Перезапускаем Postfix.
<pre>/etc/init.d/postfix reload</pre>
<pre>/etc/init.d/postfix reload</pre>


==Черные и белые списки==
Чтобы добавить почтовый ящик в черный список выполните следующее
<pre>spamassassin --add-addr-to-blacklist=boss@test.mail.com</pre>
Если надо убрать его оттуда, то надо этого пользователя добавить в белый лист, и он так сказать "отбеливается" <pre>spamassassin --add-addr-to-whitelist=boss@test.mail.com</pre>
==Перенаправить Spam в отдельный почтовый ящик==
==Перенаправить Spam в отдельный почтовый ящик==



Текущая версия от 16:31, 25 декабря 2009

Описание взято 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/

Черные и белые списки
Чтобы добавить почтовый ящик в черный список выполните следующее

spamassassin --add-addr-to-blacklist=boss@test.mail.com

Если надо убрать его оттуда, то надо этого пользователя добавить в белый лист, и он так сказать "отбеливается"

spamassassin --add-addr-to-whitelist=boss@test.mail.com

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

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.

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