Нет спаму!
("procmail" - ориентированные решения с советами для "fetchmail" и "mutt")

  Автор: © Ben Okopnik
Перевод: © Дмитрий Попков.


 

"Спам - бич электронной почты и телеконференций в Internet. Он может серьезно угрожать операторам, предоставляющим услуги, не говоря уже об индивидуальных почтовых системах... Спамеры отбирают ресурсы у пользователей и провайдеров без компенсации и ответственности за это".
 -- Винт Серф, вице-президент MCI, известный как "Отец Internet"

Спам. Похоже на то, что в наши дни это стало расплатой за обладание электронным адресом: если вы пишете в телеконференции, оставляете записи в гостевой книге или еще каким-нибудь способом передаете в сеть свой email, рано или поздно вы спам вас найдет. Даже если вы того не желаете, спам_стоит_вам_денег: он задействует часть полосы пропускания, которая могла бы быть использована для передачи реальной информации, соответственно, это стоит денег вашим провайдерам и, следовательно, повышает стоимость обслуживания каждого. Эта стоимость, кстати, исчисляется десятками миллионов долларов в месяц (подробности http://www.techweb.com/se/directlink.cgi?INW19980504S0003)) и это около 2-х долларов к вашим ежемесячным счетам. Если же вы оплачиваете доступ "побайтно", это еще и дополнительная плата, плюс стоимость вашего потраченного впустую времени.

Можем ли мы что-нибудь сделать? Ответ - "да". Мы можем защититься от загрязнения спамом своих почтовых ящиков и сделать это еще у провайдера, если у нас есть доступ к командной оболочке учетной записи и она предоставляет несколько несложных сервисов (большинство провайдеров делают это). Я приглашаю тех из вас, которые хотели бы бороться со спамом в корне, посмотреть http://www.cauce.org - это люди, отстаивающие законодательные решения против спама, на сайте вы найдете информацию о том, как им помочь. Однако в этой статье я сконцентрирую ваше внимание на блокировании спама в местном масштабе - с помощью командного интерпретатора учетной записи или на вашей собственной машине.

Существует несколько способов сделать это, но наиболее общий, и чаще всего применяемый провайдерами, предоставляющими шелл - использование программы, называемой "procmail" авторства Stephen R. van den Berg - e-mail процессор, которому можно сказать, что сохранить, что отфильтровать, а что перенаправить в другой ящик. Итак, мы должны сделать две вещи: сначала сообщить системе, что нужно использовать "procmail", а затем сообщить ему, что именно мы хотим.

В моем случае, я забираю почту через "fetchmail", запускаемом как демон. Этот вариант я бы рекомендовал всем, даже если вы читаете почту с помощью Netscape: fetchmail занимается только одним делом (забирает почту) и делает его очень хорошо даже в самых плохих и сложных условиях, что непосильно и невозможно (например разные протоколы и разные ящики) для Netscape. А Netscape будет запросто читать локальный почтовый ящик.

Обычно мой "fetchmail" запускается каждые 5 минут, забирает почту с нескольких серверов, которые я использую, и отдает их "sendmail"-у, который раскладывает их в ящики. Вау. Я возможно услышу от вас подобные звуки, но я предполагаю, что этот путь используется для снижения нагрузки на MTA при обработке больших пакетов... Фактически, использование "procmail" устраняет последнее.

В моем "~/.fetchmailrc", конфигурационном файле "fetchmail", соответствующая строка содержит:

mda "procmail"

Это указывает "fetchmail" использовать "procmail" как почтового агента доставки вместо "sendmail" - помните, что это только для входящей почты и на исходящую не оказывает никакого воздействия.
 

Другой способ сделать это, и это вариант, который я рекомендую, если вы фильтруете почту на машине вашего провайдера - создать файл ".forward" в домашнем каталоге

Отредактируйте ".forward" введя одну из следующих строк:

"|exec /usr/bin/procmail"

если вы используете "sendmail" (кавычки необходимы в этом случае).

если вы используете "exim" используйте следующее:

|/usr/bin/procmail

[Обратите внимание: согласно Майку Орру, "exim" содержит свой собственный procmail-подобный язык фильтрации. Я не знаю подробностей, но они должны быть в документации.]

Вам необходимо уточнить путь к "procmail": это можно сделать так:

which procmail

из командной строки.

Теперь, когда мы перенаправили всю почту через procmail, общий эффект... нулевой. Вах! О да - мы же еще не определили правила! Давайте посмотрим на очень простой пример файла".procmailrc", содержащего правила:


PATH=$HOME/bin:/usr/local/bin:/usr/bin:/bin
MAILDIR=/var/spool/mail       # убедимся, что это так
DEFAULT=$MAILDIR/username     # совершенно необязательно
LOGFILE=/var/log/procmail.log #рекомендую

:0:
* ^Sender:.*owner-linux-kernel-announce@vger.rutgers.edu
linux-kernel-announce

:0:
* ^Resent-Sender.*debian-user-request@lists.debian.org
debian-user



Первые четыре строки, в которых вы проверили правильность переменных для вашей системы, должны быть обязательны для каждого ".procmailrc". Все что будет дальше, может быть сложно настолько, насколько вам нужно - вы можете сделать ОГРОМНЫЙ ".procmailrc", который будет сортировать больше, чем все Главное Почтовое Отделение Америки - но для фильтрации спама (а это наверное единственная цель, для чего большинство людей используют его) нужно немного. Вышеупомянутые правила просто сортируют письма по двум ящикам, "linux-kernel-announce" и "debian-user" и все остальное в $DEFAULT.

Правила составляют так:



:0:
* ^Subject:.*test
joe
 

Значение            Примечание
========            =======
:0                  Начало правила
  :                 использовать файл блокировки(настоятельно рекомендуется)
*                   Начало условия
  ^                 Соответствует началу строки, содержащей...
   Subject:         ``Subject:'' содержащий....
           .        любые символы (.) содержащие....
            *       0 или большее количество символов ( любые символы в
                      этом регистре) соответствующим....
             test   ``test''
joe                Если совпадение успешно, поместить в папку $MAILDIR/joe



Что мы здесь сделаем, так это рассмотрим несколько типичных решений, в соответствии с темой статьи. Я состою членом Answer Gang, и несколько наших наборов правил, наряду с их комментариями, смотрите далее.
 

Мой собственный набор правил был в работе достаточно долго. Сначала я создал базовый набор, и это немедленно сократило спам на 95%, позже я добавил "черный" и "белый" списки, чтобы разрешать/запрещать получение писем с некоторых адресов - первый полезен для спамеров, которые смогли проникнуть, второй для моих друзей, чью почту я не хочу фильтровать, вне зависимости от того, какие странности они могут поместить в заголоки ( у меня есть несколько таких странных друзей):)

Для тех из Вас, кто использует "mutt", здесь показано, как я добавляю людей к тем спискам. В моем "/etc/Muttrc" есть следующие строки:

macro index \ew '| formail -x From: | addysort >> ~/Mail/white.lst'
macro pager \ew '| formail -x From: | addysort >> ~/Mail/white.lst'
macro index \eb '| formail -x From: | addysort >> ~/Mail/black.lst'
macro pager \eb '| formail -x From: | addysort >> ~/Mail/black.lst'

и в "/usr/local/bin" я поместил скрипт "addysort" :



#!/usr/bin/perl -wn
# Выборка адреса из поля "From:" line

unless (/\</) { print; } else { print /<([^>]+)/, "\n"; }


Итак, все, что мне надо сделать с полученным спамом - это нажать 'Esc-b' - и я никогда его больше не увижу, соответстенно персоны, которые должны попасть в "белый"список, получают 'Esc-w', и они всегда желанные гости. :)
 

Итак, это мой "~/.procmailrc":



PATH=/usr/local/bin:/usr/bin:/bin
MAILDIR=/var/spool/mail
DEFAULT=/var/spool/mail/ben
LOGFILE=/var/log/procmail
SPAMFILE=/var/spool/mail/spam
 

# Проверяем, состоит ли отправитель в "белом" листе, если да, то дальше в
# $DEFAULT. Обратите внимание, это делается перед любой другой фильтрацией .
:0:
* ? formail -x"From" -x"From:" -x"Sender:" \
    -x"Reply-To:" -x"Return-Path:" -x"To:" \
    | egrep -is -f $MAILDIR/white.lst
$DEFAULT

# Проверяем письмо на наличие отправителя в "черном списке", если да,то отправляем его в "/dev/null"
:0
* ? formail -x"From" -x"From:" -x"Sender:" \
    -x"Reply-To:" -x"Return-Path:" -x"To:" \
    | egrep -is -f $MAILDIR/black.lst
/dev/null

# Это реальный spam-killer, значительно улучшенный в следующем примере Дена: если
# это не адресовано мне,
# содержит одно из двух: "fuzzybear" или "ulysses" - это спам. Знак
# '!' в начале условия инвертирует его
# Смысл в том , что если строка не_соответствует_условию , то отправляем в
# $SPAMFILE. "^TO" - пременная procmail, соответствующая полям "To:", "Cc:"
# "Bcc:", и другим типам "To:" (смотри 'man procmailrc')
:0:
* !^TO .*(fuzzybear|ulysses).*
$SPAMFILE

# X-Advertisement заголовки = спам!
:0:
* ^X-Advertisement:.*
$SPAMFILE

# Ни для кого!
:0:
* To:[ ]*$
$SPAMFILE

# Пустое поле "To:"!
:0:
* !^To: .*
$SPAMFILE


Для большинства людей действительно необходимы только последние четыре абзаца (и конечно переменные в начале), вместе с первым абзацем они делают 95% работы. Последние три я заимствовал у Дена :), но могу заметить, они пришлись очень кстати.

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

send-hook (~s\ Spammer) 'set signature="~/.mutt/spammer"'

и файл "signature" в "~/.mutt/spammer" содержащий:



Dear sirs:

I've just received mail from a spammer who seems to be coming from your
domain. Please fall upon this creature and rend him to bits. His garbage,
with headers, is appended.

Sincerely,
Ben Okopnik
-=-=-=-=-=-


<Усмешка> Нет, я не люблю спамеров.

В добавление к отосланному, я просматриваю заголовки с ключом 'h', запускаю 'whois' на полученный адрес, нажимаю 'm', чтобы отправить письмо и печатаю следующее:

To:         abuse@<domain.com>
Subject:    Spammer

Получив ключевое слово,"mutt" добавляет "spammer" сигнатуру. Я сохраняю это, добавляю оригинальный спам клавишей 'A' и отправляю. Около 15 секунд работы, и мне не придется больше заниматься этим :)
 

Но посмотрим на другие примеры.

LG находится в довольно уязвимой позиции в отношении спама. Так как на адреса пишут тысячи (возмоно уже миллионы), это постоянно привлекает спамеров. "Тяжелые" фильтры сортировки, которые я описал ранее, неприменимы. Обсудим, каким должен быть безопасный фильтр от спама, который также не будет отсеивать некоторый процент нужных писем? Люди шлют письма со всех концов света, разными способами, с помощью разных почтовых клиентов (включая тех, которые формируют неправильные заголовки). Уровень спама для LG, согласно Майку Орру, примерно 28% в месяц. Удаление по принципу большого размера, который может быть хорошим для легкого фильтра, не выход: большинство посланий из "News Bytes"(содержащих релизы новостей) пропадут. Даже запрос, который вел к публикации картинок (рубрика LG - HelpDesk), ушел туда же.

Что делать?

Ответ - быть внимательным, фильтровать осторожно, и проверять подобный почтовый ящик более часто, чем обычно. Для примера LG, это только другой способ ведения дел. Хотелось бы надеться, что их "мягкие" фильтры снимают хотя бы часть нагрузки. Дэн Вилдер, их сисадмин, использует следующий "spam killer" в "~/.procmailrc"



:0:
* !^(To:|From:|Cc:|Resent-From:|Resent-To:).*(eskimo\.com\
|ssc\.com\
|linuxjournal\.com\
)
$SPAMFILE

Довольно очевидно, что все, что не соответствует тем трем доменам в заголовках, было послано не ему. Ден проверяет его "spamfile" также часто, как и я, потому что реальная почта подвержена ошибкам, и это уменьшает возможный процент потерь.



Перед этим стоит правило, которое описывает исключения, например списки рассылки:

:0:
* ^(From:|To:|Cc:) .*(-list\
|debian\
|networksolutions\
|ciac\

...

|bugs\
)
$DEFAULT


Это аналогично моему "белому" списку, но жестко прописано в ".procmailrc". Не намного труднее добавить новых адресатов туда, поэтому это тоже неплохое решение, хотя менее автоматизированное.
 

Редактор LG Майк Орр добавляет еще несколько пунктов сортировки (которые я пропустил), известные как "spam-killing" в его правилах (разработано Деном Видлером):



LOG=$HOME/log
#LOGFILE=$LOG/procmail-log
VERBOSE=no
SPAMFILE=$LOG/spam
UMASK=077
LOGABSTRACT=on
COMSAT=no
DEFAULT=$HOME/Mail/Maildir/new

# Реальный пример.
# Поддельный получатель.. To: или From: или Cc: не ssc.com
# и содержит "@" в поле To: (не локальная почта)

:0:
* !^(To:|From:|Cc:) .*(\
ssc\.com\
|linuxjournal\.com\
|linuxgazette\.com\
)
* ^To: .*@
$SPAMFILE

Хмм, похоже "черный список" здесь...

:0:
* From: .*john@songpeople.com
$SPAMFILE

# Если они содержат X-Advertisement заголовки - это спам!

:0:
* ^X-Advertisement:.*
$SPAMFILE

# Ни для кого!

:0:
* To:[         ]*$
$SPAMFILE

# Пустое поле To:
:0:
* !^To: .*
$SPAMFILE

# В других случаях действовать по умолчанию.


Вау, я завалил вас информацией, не правда ли? На самом деле все просто:

1) 1) Пропустить все входящую почту через "procmail".
2) Создать набор правил.

Это все. Я привел большое количество примеров ограничения спама, но вышеупомянутые два шага - это все, что нужно сделать в вашей системе. О, просмотр - это уже другое дело! :)

Если ваш почтовый ящик уже наполнен спамом, вы выполняете те два шага и дальше все одним махом:

cat mbox | formail -s procmail
 

Итак, отныне ваш ящик свободен от спама. Благодаря мощи Linux и "procmail", вы можете отвечать людям, жалующимся на спам, фразой "А, да... я помню, когда-то была подобная проблема." <Смех>

Удачной охоты за спамерами!

 


Copyright © 2000, Ben Okopnik.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 62 of Linux Gazette, February 2001

Вернуться на главную страницу