Товарищ по... спаму

5 март, 2003 - 00:00Игорь Дериев
Читателям может показаться странным, что нынешняя статья фактически посвящена одной-единственной и отнюдь не самой популярной программе, тогда как всего около полугода назад мы публиковали полноценный обзор ("Компьютерное Обозрение", # 35, 2002) даже с попыткой некой классификации. Однако подобрать идеальное средство для борьбы со спамом очень непросто, а SpamPal не только наверняка придется по душе многим пользователям, не чурающимся технических подробностей, но и позволит приобщиться к последним достижениям "антиспамовой" мысли.
Спам, безусловно, проблема неоднозначная. Кто-то склонен ее вовсе не замечать, кто-то -- преувеличивать до размеров вселенского зла. Одни собственноручно выискивают деловые письма среди предложений осчастливить основательно, сразу и без ущерба для здоровья и кошелька, другие пытаются выстроить вокруг своего почтового ящика непреодолимый софтверный барьер. Встречаются, однако, и такие, что согласны (и даже настаивают на этом) отдать решение проблемы полностью на откуп провайдеру, даже не задумываясь, что это фактически означало бы введение цензуры (пусть и в рамках отдельно взятой подсети).

Товарищ по... спаму
Байесовский фильтр нелишне слегка подучить
При этом нередко именно неподготовленные и неграмотные пользователи по наивности становятся невольными пособниками "злоумышленников". Вот совсем недавний пример из жизни: некий "умник" догадался не просто отправить рекламное письмо по весьма емкому списку рассылки, но и прописать этот самый список в поле обратного адреса. Трудно сказать, какой процент реципиентов оказался достаточно наивным, чтобы дать гневную отповедь спамеру, однако через два-три дня ситуация уже не была такой забавной. Улеглась эта "буря" лишь после того, как кто-то более здравомыслящий взял на себя труд разъяснить остальным суть проблемы.


Еще одна программа?

Итак, поводом для написания статьи послужило знакомство с программой SpamPal. Созданная изначально энтузиастом-одиночкой Джеймсом Фармером (James Farmer), она постепенно обзавелась сообществом активных пользователей, не только добровольно выступающих в качестве бета-тестеров, но также обсуждающих и предлагающих новую функциональность и даже помогающих в ее реализации. Благодаря этому сегодня программа с размером инсталляционного модуля менее 400 KB обладает не только завидной устойчивостью, но и рядом интересных возможностей, выделяющих ее среди аналогичных разработок.

Прежде всего SpamPal относится к категории "посредников", функционирующих "между" почтовыми клиентом и сервером. Благодаря этому пользователь не ограничен в выборе программных средств и не должен менять привычный стиль работы (что представляется весьма важным). Поскольку фильтрация корреспонденции происходит непосредственно в процессе ее получения, трафик с почтовым сервером также остается неизменным. Впрочем, подобных решений немало. Принципиальным же в архитектуре SpamPal является лишь одно -- применение подключаемых модулей.

Действительно, сама по себе программа умеет не так уж много -- она поддерживает черные и белые списки и обеспечивает опрос различных RBL-служб. Зато все желающие (и имеющие, конечно, соответствующую квалификацию) могут реализовать любую дополнительную функциональность. И это не дань моде, поскольку средства борьбы со спамом не только развиваются, но и переходят на качественно новый уровень -- от простого вылавливания сомнительных слов до статистической обработки текста. Последним достижениям в этой области мы и посвятим следующее "лирическое отступление".


Научный подход

Отсеивать нежелательную корреспонденцию по формальным признакам становится все сложнее: Web-почта избавляет спамера от необходимости использования open relays; централизованные службы почтовых рассылок уже практически неотличимы от спама. Однако универсальным и адекватным индикатором нежелательной почты по-прежнему является само содержимое письма, бессмысленное и надоедливое именно с вашей точки зрения.

Потому-то давным-давно и применяются (как в обычных почтовых, так и в специализированных программах) фильтры по ключевым словам. Впрочем, эффективность их не слишком высока, особенно когда речь заходит о ложных срабатываниях. Многие разработчики пытаются строить какие-то интегральные показатели, зависящие, к примеру, от обнаружения нескольких сомнительных терминов и прочих косвенных признаков. Но принципиально это дело не меняет.

Однако около полугода назад под все подобные изыскания удалось подвести некую "теоретическую базу". Речь идет о работе "A Plan For Spam", в которой ее автор Пол Грэм (Paul Graham) предложил простую статистическую методику выявления спама. Вкратце суть ее заключается в следующем.

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

Далее, доля нежелательных писем среди всей корреспонденции, содержащей конкретное слово, принимается за вероятность, с какой оно характеризует произвольное сообщение как спам. Имея такую информацию для всех слов, можно пытаться оценивать любое письмо в целом, тем более что это -- относительно стандартная статистическая задача, имеющая приемлемое аналитическое решение. Собственно, по имени использованной методики и сам подход получил название Байесовского.

Более того, методом проб и ошибок Грэм выяснил, что на самом деле даже не нужно принимать в расчет все присутствующие в письме слова, достаточно ограничиться лишь 15 самыми "интересными", т. е. как можно дальше отстоящими от нейтрального показателя 0,5 (характерного для слов, которые одинаково часто встречаются и в спаме, и в обычной переписке). Впрочем, подобных эмпирических допущений в реализации метода от самого изобретателя немало, однако не исключено, что именно они и позволили добиться очень высокой точности. Экспериментальный фильтр пропускал буквально единицы сомнительных писем (0,5%) практически без ложных срабатываний (0,03%).

Кстати, по мере роста интереса к данной методике выяснилось (похоже, это оказалось новостью и для самого Грэма), что аналогичные подходы были описаны в общедоступных публикациях еще в 1998 г. -- причем занимался ими даже исследовательский центр Microsoft. Тем не менее признания и популярности они не завоевали. Вероятно, алгоритм Грэма действительно оказался лучше адаптированным к реальной жизни.

Естественно, нужно понимать, что Грэм настраивал свой фильтр исключительно "под себя". Взяв любую готовую разработку, вы наверняка не получите (во всяком случае -- сразу) столь же впечатляющих результатов. Поэтому все Байесовские фильтры, и дополнительный модуль для SpamPal не исключение, обеспечивают весьма гибкие возможности настройки и обучения. Пользователь может уточнять вероятность, достаточную для отнесения письма к спаму (традиционно -- 0,9), количество принимаемых к рассмотрению слов и пр., а также дополнительно подключать внешние списки.


От слов к делу

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

Нужно сразу предупредить читателей, что программа не предназначена для использования "out-of-box". В том смысле, что функционировать-то она будет, но вряд ли удовлетворительно. Всем, решившим познакомиться со SpamPal поближе, следует быть готовыми разбираться с многочисленными нюансами. Благо разработчики постарались предоставить для этого достаточно удобные средства: 1) всем письмам, классифицированным как спам, в поле темы добавляется маркер **SPAM**, по которому их затем можно дополнительно обрабатывать в почтовых клиентах, 2) в конце заголовка письма дописываются несколько специальных реквизитов вида
X-SpamPal: PASS A-WLIST FROM

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

Начать настройку, естественно, стоит с базовых возможностей. Не секрет, что в списки большинства RBL-служб, кроме open relays, нередко попадают и вполне благонадежные серверы, организующие электронные рассылки. Как говорилось выше, чтобы разобраться, кто именно демонстрирует избыточный волюнтаризм в отношении конкретного письма, достаточно изучить его заголовок
X-SpamPal: SPAM OSIRU 216.73.90.57

и отключить зарвавшуюся службу (в данном случае OSIRU).

Нелишне также потратить время на организацию белого и черного списков. Основу первого составит адресная книга, содержимое которой (собственно, нужны только электронные адреса) чаще всего конвертируется в обычный текст штатными средствами. Чтобы не выискивать вручную реквизиты подписок, в SpamPal можно активизировать на некоторое время функцию Auto-Whitelists (при этом в белый список автоматически будет занесен каждый, кто успеет прислать за время "амнистии" указанное число писем).

С черным списком дело обстоит несколько сложнее, поскольку разные программы организуют его по-своему. Outlook, к примеру, хранит свой в уже готовом к употреблению виде -- файл Junk Senders.txt достаточно просто отыскать в системном профиле пользователя. Outlook Express, напротив, все данные складирует в реестре. Один раз выбрать нужные адреса можно и вручную, однако если делать это регулярно (например, вести общий список для нескольких пользователей), то лучше воспользоваться скриптом (и при необходимости адаптировать его), доступным на сайте SpamPal в разделе подключаемых модулей.

Там же, кстати, находится и самое интересное. В первую очередь -- упоминавшийся выше Байесовский фильтр. Сразу после его инсталляции стоит повысить порог принятия решения (к примеру, до 0,95) и включить все доступные опции обучения. Имеется возможность подключения внешних списков слов, и было бы вполне разумно подготовить их по мотивам собственного почтового ящика (с национальным лексиконом), однако разработчики соответствующего инструментария не предоставляют -- остается уповать на эффективность обучения.

Для отсева писем по конкретным признакам пригодится модуль RegExFilter, реализующий обработку регулярных выражений. В отличие от правил, доступных в почтовых клиентах, обеспечивает полный доступ и к телу, и к заголовку письма. Используется довольно замысловатый для непосвященного синтаксис Perl, однако разобраться с основами помогут довольно толковое руководство (доступное на сайте разработчиков) и файл настроек по умолчанию, в котором сразу же стоит отключить (как минимум) все фильтры с комментариями "non ASCII characters in subject" -- кириллица у заморских авторов не в чести. Вот так, к примеру, можно отсеять все письма, "вылеченные" Norton Antivirus:

%=Line: \b(name="Norton AntiVirus Deleted1\.txt")

Имеются и другие подключаемые модули (в основном вспомогательного характера) -- для протоколирования, резервирования и пр. Однако главное, что их ассортимент постоянно расширяется за счет новых идей и подходов. Соответственно, даже если основной разработчик забросит свой проект, пользователь вряд ли останется один на один со спамом и по-прежнему будет во всеоружии.