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

Материал из Wiki МИАЦ ВО
Перейти к навигации Перейти к поиску
(Использование локальных файлов)
 
(не показано 9 промежуточных версий этого же участника)
Строка 19: Строка 19:
 
user_scores_sql_password        %dbpasswd%
 
user_scores_sql_password        %dbpasswd%
 
user_scores_sql_custom_query    SELECT preference, value FROM mail_spamassassin  
 
user_scores_sql_custom_query    SELECT preference, value FROM mail_spamassassin  
  WHERE username = _USERNAME_ OR username = '$GLOBAL' OR username = CONCAT('%',_DOMAIN_)  
+
          WHERE username = _USERNAME_ OR username = '$GLOBAL'  
  ORDER BY username ASC
+
          OR username = CONCAT('%',_DOMAIN_)ORDER BY username ASC
 
 
 
# Autowhite list
 
# Autowhite list
 
auto_whitelist_factory Mail::SpamAssassin::SQLBasedAddrList
 
auto_whitelist_factory Mail::SpamAssassin::SQLBasedAddrList
Строка 29: Строка 28:
 
user_awl_sql_table          mail_awl</pre>
 
user_awl_sql_table          mail_awl</pre>
 
'''SpamAssassin не понимает переноса строк в конфигурационном файле поэтому пишите запрос в одной строке'''
 
'''SpamAssassin не понимает переноса строк в конфигурационном файле поэтому пишите запрос в одной строке'''
 +
 
====Использование локальных файлов====
 
====Использование локальных файлов====
 
(полная документация - см. perldoc Mail::SpamAssassin::Conf)  
 
(полная документация - см. perldoc Mail::SpamAssassin::Conf)  
Строка 73: Строка 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>
Строка 94: Строка 94:
 
Затем следует убедится, что владелец файлов в директории '''/etc/mail/spamassassin/''' - это наш новый пользователь.  
 
Затем следует убедится, что владелец файлов в директории '''/etc/mail/spamassassin/''' - это наш новый пользователь.  
 
<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>
  
 
===Запускаем демон===
 
===Запускаем демон===
Строка 101: Строка 106:
  
 
===Создаем файл '''/etc/postfix/scripts/spamfilter'''===
 
===Создаем файл '''/etc/postfix/scripts/spamfilter'''===
 +
====Используем локальный файл для пользователей без спам фильтра====
 
<pre>#!/bin/sh
 
<pre>#!/bin/sh
  
Строка 142: Строка 148:
 
exit $?
 
exit $?
 
</pre>
 
</pre>
 +
 +
====Для тех, кто использует базу данных abills====
 +
<pre>#!/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 $?
 +
</pre>
 +
====Для обоих скриптов====
 
Теперь поменяйте с этом скрипте почтовые адреса<br />
 
Теперь поменяйте с этом скрипте почтовые адреса<br />
 
'''spamadmin@yourdomain.com''' на почтовый адрес администратора.<br />
 
'''spamadmin@yourdomain.com''' на почтовый адрес администратора.<br />
Строка 152: Строка 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, где указываем ящики, на которые нужно пропускать все письма, без спам фильтра и postmaster, удалив ящики и алиасы связанные с ним. <br />
+
Создаем файл '''/etc/posfix/scripts/users_with_spam''' (только для локального [[Добавление Spam assissian к Postfix#Используем локальный файл для пользователей без спам фильтра|файла для пользователей]] без спам фильтра), где указываем ящики, на которые нужно пропускать все письма, без спам фильтра. <br />
'''Внимание:''' Если письмо на пользователей без спам фильтра, то пропускаем не меняя Правда, если в письме спам, то пользователь получит письмо, завернутое  спамфильтром.
+
'''Внимание:''' Если письмо на пользователей без спам фильтра, то пропускаем не меняя пользователя, правда, если в письме спам, то пользователь получит письмо, завернутое  спамфильтром.
 
<pre>postmaster@yourdomain.com
 
<pre>postmaster@yourdomain.com
 
vasja@yourdomain.com
 
vasja@yourdomain.com
 
vona@yourdomain.com</pre>
 
vona@yourdomain.com</pre>
Можно, конечно взять данные адреса и из базы данных, но тут я не буду это рассматривать. Главное смысл понятен.<br>
 
 
Ну вот и все. Перезапускаем 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.

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