Добавление Spam assissian к Postfix: различия между версиями
Misha (обсуждение | вклад) (→Создаем файл '''/etc/postfix/scripts/spamfilter''') |
Misha (обсуждение | вклад) (→Использование локальных файлов) |
||
(не показано 13 промежуточных версий этого же участника) | |||
Строка 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- | + | Итак устанавливаем пакет 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=== | |
Вконец добавляем строки | Вконец добавляем строки | ||
<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=== | |
+ | ====Если используем базу данных 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 | <pre>#!/bin/sh | ||
Строка 90: | Строка 112: | ||
# 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=/bin/egrep | ||
− | USERS_WITH_SPAM="/etc/ | + | USERS_WITH_SPAM="/etc/postfix/scripts/users_with_spam" |
# Exit codes from <sysexits.h> | # Exit codes from <sysexits.h> | ||
Строка 103: | Строка 125: | ||
SPAMLIMIT=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> | ||
+ | ====Для тех, кто использует базу данных 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. | # 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 | ||
# Если письмо на пользователей без спам фильтра, то пропускаем не меняя | # Если письмо на пользователей без спам фильтра, то пропускаем не меняя | ||
− | # | + | # Правда, если в письме спам, то пользователь получит письмо, завернутое |
− | # | + | # спамфильтром |
− | + | 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 | then | ||
− | $SENDMAIL "$ | + | $SENDMAIL -f "$1" "$4" < /var/tempfs/out.$$ |
else | else | ||
− | # | + | # Проверяем Spam-LevelБ если > $SPAMLIMIT, то отправляем в spam ящик |
− | + | if $EGREP -q "^X-Spam-Level: \*{$SPAMLIMIT,}" < /var/tempfs/out.$$ | |
− | if $EGREP -q "^X-Spam-Level: \*{$SPAMLIMIT,}" < /var/tempfs/out.$$ | ||
then | then | ||
− | ## | + | ## Change the Email address where you want your spam to get fwd to |
− | $SENDMAIL -f | + | $SENDMAIL -f misha@volmed.org.ru spam@volmed.org.ru < /var/tempfs/out.$$ |
else | else | ||
$SENDMAIL "$@" < /var/tempfs/out.$$ | $SENDMAIL "$@" < /var/tempfs/out.$$ | ||
Строка 126: | Строка 205: | ||
exit $? | exit $? | ||
</pre> | </pre> | ||
+ | ====Для обоих скриптов==== | ||
Теперь поменяйте с этом скрипте почтовые адреса<br /> | Теперь поменяйте с этом скрипте почтовые адреса<br /> | ||
'''spamadmin@yourdomain.com''' на почтовый адрес администратора.<br /> | '''spamadmin@yourdomain.com''' на почтовый адрес администратора.<br /> | ||
Строка 136: | Строка 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 /> | |
− | + | '''Внимание:''' Если письмо на пользователей без спам фильтра, то пропускаем не меняя пользователя, правда, если в письме спам, то пользователь получит письмо, завернутое спамфильтром. | |
− | |||
− | Создаем файл /etc/posfix/scripts/users_with_spam, где указываем ящики, на которые нужно пропускать все письма, без спам фильтра | ||
<pre>postmaster@yourdomain.com | <pre>postmaster@yourdomain.com | ||
vasja@yourdomain.com | vasja@yourdomain.com | ||
vona@yourdomain.com</pre> | vona@yourdomain.com</pre> | ||
− | |||
Ну вот и все. Перезапускаем Postfix. | Ну вот и все. Перезапускаем Postfix. | ||
<pre>/etc/init.d/postfix reload</pre> | <pre>/etc/init.d/postfix reload</pre> | ||
− | |||
− | |||
− | |||
− | |||
==Перенаправить Spam в отдельный почтовый ящик== | ==Перенаправить Spam в отдельный почтовый ящик== | ||
Текущая версия на 16:31, 25 декабря 2009
Описание взято 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.
В почтовый ящик, указанный в скрипте для спама должен попасть это письмо.