DSPAM — избавляемся от спама.

На моем узле установлена FreeBSD и MTA Exim.
В один прекрасный момент количество получаемого спама увеличилось настолько, что просто не обращать на него внимание стало невозможно. Тут-то и начались поиски солюшенов.
Spamassassin меня не совсем устроил. Особенно процесс установки Perl пакетов :-)))
Зато DSPAM понравился целиком и полностью.
Итак. Устанавливаем DSPAM.

Скачиваем с оригинального сайта — Nuclear Elephant: The DSPAM Project

Распаковываем: tar xvzf dspam-3.8.0.tar.gz
Конфигуряем с использованием mySQL

./configure \
--enable-neural-networking \
--disable-bias \
--with-storage-driver=mysql_drv \
--with-mysql-includes=/usr/local/include \
--with-mysql-libraries=/usr/local/lib \
--enable-debug \
--with-dspam-home-owner=exim \
--with-dspam-group=mail \
--with-delivery-agent=/usr/local/sbin/exim \
--with-quarantine-agent=/usr/local/sbin/exim \
--enable-experimental \
--enable-domain-scale

Если вы используете «виртуальных пользователей», то необходимо добавить
—enable-virtual-users

Далее запускаем make && make install
Готово! DSPAM установлен!
Теперь приступим к конфигурированию Exim и DSPAM.

Для начала необходимо создать БД и пользователя в mySQL
Непременно используйте InnoDB сторидж во избежание отвала в корку mysql, либо повреждения базы данных!

admin@localhost#> mysqladmin -uroot -p create dspam
admin@localhost#> mysql -uroot -p dspam < tools.mysql.drv/mysql_objects-4.1.sql admin@localhost#> mysql -uroot -p dspam < tools.mysql.drv/virtual_users.sql admin@localhost#> mysql -uroot -p dspam
mysql> grant all on dspam.* to dspam@localhost identified by 'пароль';
mysql> exit

С БД на этом покончено.

Далее необходимо сконфигурить екзим. Я взял стандартные роутеры и транспорты из wiki дспама. Работает. Итак:

Запихиваем в конфиг экзима сразу после userforward router следующее:

dspam_router:
no_verify
check_local_user
# When to scan a message :
# - it isn't already flagged as spam from Spamassassin
# - it isn't already flagged as spam from DSPAM
# - it isn't already scanned
# - it isn't local
# - it isn't from one internal domain user to another
# - it is less than 512k in size
condition = "${if and { \
{!def:h_X-Spam-Flag:} \
{!def:h_X-FILTER-DSPAM:} \
{!eq {$received_protocol}{local}} \
{ <= {$message_size}{512k}} \
}\
{1}{0}}"
headers_add = "X-FILTER-DSPAM: by $primary_hostname on $tod_full"
driver = accept
transport = dspam_spamcheck
# Which users to run dspam for.
#local_parts = /usr/local/etc/exim/dspam-testers
dspam_addspam_router:
driver = accept
local_part_prefix = spam-
transport = dspam_addspam
dspam_falsepositive_router:
driver = accept
local_part_prefix = nospam-
transport = dspam_falsepositive

В транспорты пихаем этот текст

dspam_spamcheck:
driver = pipe
command = "/usr/local/bin/dspam --deliver=innocent --user ${lc:$local_part} -f \
'$sender_address' -- %u"
home_directory = "/tmp"
current_directory = "/tmp"
user = exim
group = mail
log_output = true
return_fail_output = true
return_path_add = false
message_prefix =
message_suffix =

dspam_addspam:
driver = pipe
command = "/usr/local/bin/dspam --class=spam --source=error --user \
${lc:$local_part} -f '$sender_address' -- %u"
home_directory = "/tmp"
current_directory = "/tmp"
user = exim
group = mail
log_output = true
return_fail_output = true
return_path_add = false
message_prefix =
message_suffix =

dspam_falsepositive:
driver = pipe
command = "/usr/local/bin/dspam --class=innocent --source=error \
--deliver=innocent,spam --user ${lc:$local_part}\
-f '$sender_address' -- %u"
home_directory = "/tmp"
current_directory = "/tmp"
user = exim
group = mail
log_output = true
return_fail_output = true
return_path_add = false
message_prefix =
message_suffix =

Естественно, не забываем исправить user и group под реальное положение дел :-)

Запускаем, проверяем.
Если при доставке почты получаем что-то, вроде

Child process of address_pipe transport returned 127 (could mean unable to exec or command does not exist) from command: /usr/local/bin/dspam

значит exim не может запустить /usr/local/bin/dspam, поскольку пермишн a+x у запускаемого отсутствует. Ставим, проверяем снова.

Затем проводим обучение системы, пересылая спамовые письма на адрес spam-ваш_ящик@ваш.домен и неспамовые на nospam-ваш_ящик@ваш.домен.
Поскольку юзеры зело ленивы, можно сделать спам-фильтр не индивидульным для каждого ящика, а общим, для всей системы. Возможно это съэкономит вам несколько миллионов нераных клеток, и несколько миллиардов байт на жестком диске :-)

И в любом юзерском почтаре выцепляем хидеры, по которым решаем, что делать с данным письмом — сразу в корзину, или похранить немного. Хотя, в принципе, dspam может сам удалять спамовые письма, но я ему не доверяю :-D

X-Spam-Score: 5.8 (+++++)
X-Spam-Report: Spam detection software, running on the system "mx.myhost.com", has
identified this incoming email as possible spam. The original message
has been attached to this so you can view it (if it isn't spam) or label
similar future email. If you have any questions, see
postmaster@myhost.com for details.
Content preview: XXXXXXXXXXX XXXXXXXX   X X X X X X X X
XXXXXX!
              XXXXXXXXXX!
XXXXXXX! XXXXXX XXXXXXX
XXXXXX.        XXXXXXXX XX
XXXXXXX. XXX (495) 6 4 . 8 4 . 4 3 2 [...]
Content analysis details: (5.8 points, 5.0 required)
pts rule name description
---- ---------------------- --------------------------------------------------
0.4 SPF_HELO_FAIL SPF: HELO does not match SPF record (fail)
[SPF failed: Please see http://www.openspf.org/why.html?sender=ocn.ne.jp&ip=221.189.3.135&receiver=sunrise.sgpi.kz]
0.8 HTML_FONT_FACE_CAPS BODY: HTML font face has excess capital characters
0.0 HTML_MESSAGE BODY: HTML included in message
0.2 HTML_FONT_BIG BODY: HTML tag for a big font size
1.8 RCVD_IN_BL_SPAMCOP_NET RBL: Received via a relay in bl.spamcop.net
[Blocked - see ]
2.5 RCVD_IN_XBL RBL: Received via a relay in Spamhaus XBL
[221.189.3.135 listed in sbl-xbl.spamhaus.org]
X-Spam-Flag: YES

На этом заканчиваю. Будут вопросы — пишите.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Анти-спам: выполните заданиеWordPress CAPTCHA