Добавление Spam assissian к Postfix
Описание взято spamassissian + Postfix
Содержание
- 1 Установка пакетов
- 2 Настройка
- 3 Перенаправить Spam в отдельный почтовый ящик
- 4 Проверка
Установка пакетов
Итак устанавливаем пакет 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.
В почтовый ящик, указанный в скрипте для спама должен попасть это письмо.