Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> почтовые системы —> spamooborona

yandex spamooborona

Автор: Al.


Не подумайте, что реклама....
Была поставлена задача найти спаморезалку хорошую, при этом цена не имела особого значения. До этого работал dspam - отличная штука, но требует обучения - в этом его минус. Ленивые пользователи обучать его не хотели.
В итоге решил попробовать спамоборону от яндекса. Результаты работы будут ниже, а пока по установке.
Надо скачать дистрибутив с http://so.yandex.ru/. Там есть пробная версия на 30 дней. Для получения пробной версии надо зарегиться - поставить спамоборону - ответить на необходимые вопросы - выслать конф файлы и получить ключ на 30 дней.
Итак, установка.
Просто качаем файл для нашей оси и ставим. Там есть установочный скрипт с подобием гуя. В качестве метода интеграции с почтовой системой выбираем smtp-proxy. Если выбрать exim, то они предлагают пересобрать экзим со своим файлецом - мне такая затея не понравилась сразу - даж не стал разбираться.....
Косяки на этом этапе следующие:
- локальные домены надо писать сразу все. После получения ключа список изменять НЕЛЬЗЯ!.
- ключ и конф фай присылается иногда с добавленим ^M в конце строк. естественно, при этом ничего не работает. Открываем файл присланного ключа на редактирование в мс (другие редакторы не показывают этот косяк) и стираем виндовые хрени оттуда.

Инсталлер сам добавляет везде свои записи, не особо нас об этом спрашивая. После установки в rc.d появляются 2 скрипта: sp-daemon.sh* и sp-proxy.sh*. При перезагрузке мы обнаруживаем, что сцуко работает от рута..
Для исправления переносим эти скрипты в /var/yamail, а в rc.d создаем свой скрипт
[mx1:/usr/local/etc]#cat rc.d/so-proxy.sh
#!/bin/sh

# PROVIDE: soproxy
# REQUIRE: DAEMON
# BEFORE:  LOGIN
# KEYWORD: nojail shutdown

# Подключаем доп. функции
. /etc/rc.subr

# Имя скрипта
name="soproxy"

# Значение _enable из rc.conf
rcvar=`set_rcvar`
# Старт -стоп функции
start_cmd="${name}_start"
restart_cmd="${name}_restart"
stop_cmd="${name}_stop"


# Ставим NO, если в rc.conf не задан параметр soproxy_enable="YES"
eval "${rcvar}=\${${rcvar}:-"NO"}"

soproxy_restart()
{
  echo "restarting sp-proxy"

  # Запуск спамобороны от имени souser
  /var/yamail/sp-daemon.sh stop
  /var/yamail/sp-proxy.sh stop
  /usr/sbin/chown souser:souser /var/yamail/*
  /bin/chmod 775 /var/run
  /usr/bin/chgrp souser /var/run
  /usr/sbin/chown souser /var/spool/spamooborona
  /usr/sbin/chown souser /var/spool/spamooborona/*
  /bin/rm /var/run/sp-*
  /usr/bin/su souser -c "/var/yamail/sp-daemon.sh start"
  /usr/bin/su souser -c "/var/yamail/sp-proxy.sh start"

  echo "sp-proxy restarted"
}


soproxy_start()
{
  echo "Starting sp-proxy"

  # Запуск спамобороны от имени souser
  /var/yamail/sp-daemon.sh stop
  /var/yamail/sp-proxy.sh stop
  /usr/sbin/chown souser:souser /var/yamail/*
  /bin/chmod 775 /var/run
  /usr/bin/chgrp souser /var/run
  /usr/sbin/chown souser /var/spool/spamooborona
  /usr/sbin/chown souser /var/spool/spamooborona/*
  /bin/rm /var/run/sp-*
  /usr/bin/su souser -c "/var/yamail/sp-daemon.sh start"
  /usr/bin/su souser -c "/var/yamail/sp-proxy.sh start"

  echo "sp-proxy started"
}



soproxy_stop()
{
  echo "Starting sp-proxy"

  # Запуск спамобороны от имени souser
  /var/yamail/sp-daemon.sh stop
  /var/yamail/sp-proxy.sh stop
  echo "sp-proxy stoped"
}

# Загружаем переменные из rc.conf
load_rc_config $name
run_rc_command "$1"
[mx1:/usr/local/etc]#     

При этом не забываем добавить пользователя souser c домашкой /var/yamail. У пользователя обязательно должен быть шел, а пароль лучше закоментить.
Добавляем в rc.conf
soproxy_enable="YES"

для старта нашего свежеиспеченного скрипта.
Запускаем его от рута и проверяем, что получилось
[mx1:/usr/local/etc]#rc.d/so-proxy.sh start
[mx1:/usr/local/etc]#ps -aux | grep sp-
souser    6697  0,0  0,0  1736  1172  p0  I    11:49     
          0:00,00 /bin/sh /var/yamail/sp-daemon.sh start
souser    6698  0,0  0,0  1736  1176  p0  I    11:49     
          0:00,00 /bin/sh /var/yamail/sp-daemon.sh start
souser    6699  0,0  1,4 85148 43296  p0  S    11:49     
          2:08,81 /usr/local/sbin/sp-daemon -f -m X-Spam
          Flag -p /var/run/sp-daemon.sock -i/usr/local/etc/
souser    6706  0,0  0,0  1732  1164  p0  I    11:49     
          0:00,00 /bin/sh /var/yamail/sp-proxy.sh start
souser    6707  0,0  0,0  1732  1172  p0  I    11:49     
          0:00,00 /bin/sh /var/yamail/sp-proxy.sh start
souser    6708  0,0  0,1  4652  2716  p0  S    11:49     
          0:47,61 /usr/local/sbin/sp-proxy -f -l 1125 -p
var/run/sp-daemon.sock
root     20449  0,0  0,0  1600   948  p0  S+   18:39     
          0:00,00 grep sp-
[mx1:/usr/local/etc]#  

Теперь все работает от непривелегированного пользователя.
не забываем менять владельца файлов на нового пользователя
chown souser:souser /var/yamail/*

Далее эту хрень надо подружить с почтовиком. В моем случае - exim.
Перед роутером локальной доставки добавляем
684 #проверяем на спам
685 spam_yandex_route:
686   driver = manualroute
687   transport = spamoborona
688   domains = +local_domains
689 ##  no_verify
690   condition = ${if eq {$interface_port}{25}{yes}{no}}
691   #condition=${if !eq {$received_protocol}{local}}"
692 ##  address_test = false
693   route_data = localhost
694   self = send

В транспортах описываем транспорт
827 spamoborona:
828  driver = smtp
829  allow_localhost = true
830  port = 1125

И в самом начале аклей добавляем
360   # принимаем с локалхоста без проверки, т.к. с него приходят
361   # проверенные письма с спамобороны, а она не пишет отправителя
362   accept  hosts = localhost:127.0.0.1

Теперь логика работы.
Если письмо доходит до роутера локальной доставки - это локальное письмо. Соответственно,перед локальной доставкой мы его пересылаем на проверку на локалхост на порт 1125 в спамоборону. Там проверяется на спам и возвращается на локалхост на порт 1025 в экзим. Для него мы не проверяем акли и смотрим, что пришло не с 25 порта в роутерах - значит, письмо от спамобороны - доставляем локально.
В заголовках появляется
X-Spam-Yversion: Spamooborona-2.3

Кстати,не забываем в exim указывать, чтоб слушал 1025 порт на локахосте.
local_interfaces = <; [127.0.0.1]:1025; [127.0.0.1]:25; [ваши адреса]

Тестированию поддается так: убираем роутер спамобороны из экзима и заходим телнетом на 1125 порт (это спамоборона) и средствами smtp пытаемся отправить себе письмо. Если все ок, письмо проходит проверку в спамобороне и передается в экзим на 1025 порт для доставки. Если с этим все ок и вы получили письмо, включаем роутер, и экзим начинает перенаправлять все письма на спамоборону.
Логи читаем так:
[mx1:/usr/local/etc]#cat /etc/syslog.conf
*.*                                             /var/log/all.log
.....

Чтоб нормально обновлялся правим /etc/crontab до такого
##-- Spamooborona cron entries start
10 5 * * *      souser  /usr/local/etc/spamooborona/scripts/cron_spamstat
*/20 * * * *    souser  /usr/bin/lockf -st 0 /var/tmp/rsync.so-rules.lock \
                             /usr/local/etc/spamooborona/scripts/cron_rul
00 09 * * *     souser  /usr/local/etc/spamooborona/scripts/cron_notify

Штука имеет гуй для настройки
/usr/local/etc/spamooborona/adm_so  


или можно покопаться вручную в /usr/local/etc/spamooborona или /var/yamail.
Кстати через гую рекомендую настроить глобальную политику обработки спама - я просто помечаю в теме.
Так же есть статистика (не забываем ее включить и создать под нее папку)
[mx1:/usr/local/etc]#spamooborona/scripts/statcalc.sh summary at 2008-07-15
08-07-15 00:00:05 - 08-07-16 0
Summary:
*        1 (0,00%)
*       93 (0,44%) DLVR
*    16732 (79,04%) SPAM
*     4341 (20,51%) Mail
*        1 (0,00%) 17:40:03
*    21168 total

[mx1:/usr/local/etc]#

Интересно реализован механазм вайтлистинга. При добавлении в вайтлист письмо все равно проходит через спамобороу и ему присуждается спамовый коэффициент.
Реализованы разные алгоритмы на обработку белых листов, в которых просто домен и белых листов, в которых пользователь@домен получатель@домен.
если в белом списке найден домен - то минус 3 балла к спамовому весу
если связка получатель - отправитель - то минус 10 баллов
правила регулируются тут
cat /var/yamail/wl.rul

rule FROM_IN_WL R_ALG -10
describe whitelist

rule FROM_IN_PERSONAL_WL R_ALG -10
describe personal whitelist

rule DOMAIN_IN_WL R_ALG -3
describe domain whitelisted

rule DOMAIN_IN_PERSONAL_WL R_ALG -5
describe domain whitelisted personally

По поводу вайтлистинга. У них разные алгоритмы на обработку белых листов, в которых прото домен и белых листов, в которых пользователь@домен получатель@домен.
если в белом списке найден домен - то минус 3 балла к спамовому весу
если связка получатель - отправитель - то минус 10 баллов
правила регулируются тут
cat /var/yamail/wl.rul

rule FROM_IN_WL R_ALG -10
describe whitelist

rule FROM_IN_PERSONAL_WL R_ALG -10
describe personal whitelist

rule DOMAIN_IN_WL R_ALG -3
describe domain whitelisted

rule DOMAIN_IN_PERSONAL_WL R_ALG -5
describe domain whitelisted personally

Я держу вайтлисты в мускуле сразу на спамоборону и акли. Выглядит это так:
В роутерах
#проверяем на спам
spam_yandex_route:
  driver = manualroute
  transport = spamoborona
  domains = +local_domains
  condition = ${if and {{eq {$interface_port}{25}} \
              {!match {$h_X-WHITELISTED:}{$sender_address}} }}
  route_data = localhost
  self = send

Это при условии, что существуют вайтлисты в аклях и при попадании в вайтлист добавляется заголовок
X-WHITELISTED: $sender_address

Пробовал делать кондишен с выборкой из мускуля, но че-т не получилось, чтоб было два условия, при этом одно из мускуля. В аклях, кстати,тож не получилось. Поэтому вайтлистинг в аклях выглядит так:

  # пропускаем падонкав, не умеющих писать отправителя.
  accept set acl_m1   = ${lookup mysql{SELECT `white_senders` FROM `white_senders` \
                        WHERE  `active`='1' \
                         AND `white_senders`='$sender_address'}}
         condition    = ${if eq {$acl_m1} {$sender_address}{yes}{no}}
         hosts        =  ${lookup mysql{SELECT `hosts` FROM `white_senders` \ 
                         WHERE  `active`='1' \ 
                         AND `white_senders`='$sender_address'}}
         add_header   =  X-WHITELISTED: $sender_address
         logwrite     =  !message sended by $sender_address - \
                             [$sender_host_address] - white sender!

Качество работы устроило вполне. Пока из косяков - забраковал 2 daily, но это из-за неправильно настроенных белых листов. В общем, все довольны и счастливы. Процент ложного срабатывания - пока минимальный.
Но сразу опишусь, что штука эта комерческая и как она работает внутри - непонятно. Поэтой причине если есть возможность обойтись без нее, я бы посоветовал ее не ставить.



размещено: 2008-07-28,
последнее обновление: 2008-07-28,
автор: Al


fenidik, 2008-07-28 в 16:07:29

:о) Значит за 3 года ничего у них не поменялось. Читая статью вспомнил про все грабли на которые наступал при установке сего продукта. Правда работает она отменно, спору нет.

papich, 2008-07-28 в 17:12:18

А у гугла есть такая же?

ононим, 2008-08-05 в 14:47:06

есть бесплатная so1024 - проверяет в день до 1024 полезных писем. работает безо всяких ключей и тд. но это подойдет для тех, у кого относительно не много писем и для тех, кому не жалко трафег для сопоставления писем спаму, тк так проверка по-сути происходит на серверах яндекса

JaNet, 2008-11-20 в 14:07:13

фильтрует-то нормально? триал ради извращения ставить не очень охота..  и на сколько грузит проц и по памяти?

Al, 2008-11-20 в 15:02:31

субъективно на 100 сообщений где-то 3-7 ошибок. С учетом возможностей вайтлистинга я б оценил работу на 4,4+.

elib0z, 2008-11-24 в 15:51:20

ставил на уровне университета, где под сотню юзеров.
вполне можно использовать, очень рекомендую

Мозг, 2008-12-09 в 12:25:44

2 ононим: чтобы траффик не жрала, поставь перед ней блеклисты. Главное с ними не переборщить, чтобы не получать ложных срабатываний.
Вместе это сила :)

honuryk, 2009-12-05 в 16:13:16

Много не понятный вещей, даже очень много!!!
Словать сделать то, сделать то...
Мало очем говорит, как же так можно учится...

А за статью спасибо!
Жаль не получилось установить



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1341 секунд
Из них PHP: 30%; SQL: 70%; Число SQL-запросов: 77 шт.
Исходный размер: 43624; Сжатая: 9861