ОПЫТ

Или опыт создания пакета почтовой фильтрации

Так сложилось, что уже много лет я сотрудничаю с радиостанцией "Маяк" в области информационных технологий. Началось все с построения системы безопасности для работы в Интернете. Затем сотрудничество продолжилось в ряде других проектов. Сотрудники технической дирекции "Маяка" - люди, преданные своему делу. Руководство радиокомпании в большинстве случаев не докучало техническому персоналу по мелочам, и жизнь текла своим чередом. Беда, как всегда, пришла нежданно.

Начало великой битвы

В середине лета 2004 г. главный ИТ-администратор "Маяка" Евгений Коршунов стал получать от пользователей жалобы на увеличивающийся объем спама в электронной почте. Надо сказать, что больших проблем с вирусными и спамовыми эпидемиями на "Маяке" обыкновенно не было. Использовался старый эффективный метод, заимствованный еще из Средних веков, - выжигать все, в чем есть сомнения. Функции основного почтового сервера здесь выполнял пакет sendmail, для построения почтовой статистики применялась программа sma, а в качестве кострового средства - пакет procmail. В нем есть простые, удобные и эффективные возможности для фильтрации контента почтовых сообщений. С 2000 г. эта троица успешно справлялась со всеми обязанностями, в том числе препятствовала распространению через почту всякой заразы, которая ликвидировалась буквально в начале эпидемии с помощью несложных фильтров в пару строк. И редкий вирус мог проскочить через эти фильтры.

Пару раз, правда, мы брали для тестирования на предмет возможного приобретения ряд антивирусных программ для почтового сервера sendmail. Однако в силу ряда причин остались не слишком довольны их качеством на тот момент. Поэтому антивирусного щита для почтовых систем до осени 2004 г. не было, но и особых катастроф тоже.

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

Фильтровать спам с помощью procmail стало намного труднее. Поэтому мы посмотрели несколько других интересных пакетов и остановились на milter-regex. Пакет умел делать все то же самое, что и procmail, но подключался как дополнительный модуль к sendmail - в отличие от procmail, который был всего лишь локальным агентом доставки. То есть у нас появилась возможность отсекать спам еще до приема всего сообщения. После краткого обучения работе с milter-regex Евгений Коршунов включился в борьбу со всей интернет-нечистью, неутомимо занося в "черные списки" несвободные от спама компьютеры, организации, домены и даже отдельные страны. Великая битва началась.

Первое стратегическое оружие

В великой битве нужны сильные люди и эффективные средства. С людьми и энтузиазмом все было хорошо, а вот программных средств не хватало. После первых недель борьбы пришло понимание: как можно вести борьбу с врагом, если нет строгого контроля и учета успехов! Попытка модифицировать с этой целью программу sma не удалась. Пришлось принять вызов, и первая версия sma_stat (аналог sma по функциональности) появилась на свет 28 августа. Однако, как выяснилось, она имела все недостатки sma. Неудача.

Между тем в ходе разработки появилась идея разбиения журнала sendmail на цепочки событий - принятые письма, отказы в приеме при помощи механизма Milter API (Mail Filter Application Programming Interface) для sendmail (milter-rejects) и т. д. Несмотря на довольно сложный синтаксис журнала для sendmail, эту идею удалось успешно реализовать. В отличие от sma программа sma_stat оказалась сравнительно легко расширяемой. В обновленном виде она была выпущена 4 сентября и в течение месяца доведена до первого стабильного варианта, после чего с успехом применялась администраторами "Маяка". По мере ее совершенствования почтовая статистика позволяла все лучше и лучше видеть состояние почтового трафика. С ее помощью можно было даже выявить некоторые характерные способы использования спамерами захваченных компьютеров. Воистину хорошая статистика - незаменимая вещь.

Второе стратегическое оружие

После создания sma_stat началась разработка следующего программного модуля - milter-agent. Он должен был расширить функциональные возможности sendmail за счет подключения дополнительных программ обработки. Когда в 2000 г. для sendmail был создан механизм milter, то казалось, что немедленно появятся и удобные и эффективные средства фильтрации или обработки почтового трафика. Просмотрев около сотни реализаций milter-модулей, я убедился, что болезнь под названием "много функций, пусть даже они все не нужны" беспощадно заражает ряды разработчиков Unix/ Linux. Функциональность большинства модулей можно было легко реализовать простыми сценариями (scripts) с использованием стандартных системных средств, что вполне соответствовало бы заветам отцов-основателей Unix, призывавших "не приумножать несчастий без надобности" и считать программу законченной лишь при невозможности что-либо убрать из нее.

После некоторых размышлений родилась простая и ясная идея: если трактовать сообщение как файл, то администратор TPmail мог бы подключать любые программы для работы с этим файлом, например антивирусное сканирование. Возвращаемые программами коды можно будет передавать обратно в sendmail для указания результатов обработки. Такой универсальный подход позволил воспроизвести функциональность более 80% известных автору milter-модулей. Причем в большинстве случаев это реализовывалось с помощью простейших shell-сценариев.

Первым делом были созданы сценарии-обертки для антивирусов (DrWeb, Clam, Kav). Наш собственный сценарий позволял избежать таких известных проблем, как необъяснимая остановка Unix-демонов антивирусного ПО или сбои на серверах обновлений баз данных для антивирусов. В качестве демонстрации успешности данной технологии был даже написан скромный shell-сценарий, который "вылечивал" зараженную почту (пусть не всю, для этого нужно написать несколько более сложное ПО, однако для нас интереснее были сами возможности).

Отсутствие хорошей статистики от изготовителей антивирусного ПО было компенсировано нашей собственной реализацией. При обнаружении вируса в письме отправителю направлялся отказ в приеме почты с объяснением причины и идентификацией вируса по результатам антивирусного сканирования. Конвейер по обработке сообщений был запущен. Так незаметно прошел октябрь и наступил ноябрь.

Третье стратегическое оружие, или На фронте борьбы со спамом без перемен

Через некоторое время после запуска модуля milter-agent я поинтересовался у Евгения, как складывается ход битвы со спамом и не требуется ли еще какая помощь. В ответ он показал файл конфигурации milter-regex размером в 60 Кб (это несколько тысяч строк), в котором враги были аккуратно разнесены по организациям, доменам и странам. Проблема заключалась в том, что milter-regex не мог фильтровать по диапазонам IP-адресов, а такое средство было крайне необходимо.

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

Ежедневно Евгений тратил уже в среднем один-два часа на изучение статистики и расширение черных списков. Однако надо сказать, что усилия противника были более успешны: объемы почты непрерывно росли и уже составляли более 15 тыс. сообщений в день (для сравнения: суточный объем почты в 2001-2003 гг. у радиостанции был не более тысячи сообщений).

Нужно было как-то переломить ситуацию, но серьезных идей не было. Может, хранить историческую статистику или списки доверенных серверов и что-то как-то вычислять? Несколько раз мы обсуждали такую возможность, но ни к чему не пришли. А может, использовать программу контентной фильтрации?

В контентной фильтрации всегда есть два главных вопроса: 1) кто заполняет базы; 2) кто проверяет работу этих баз. Вопрос об экспертном наполнении баз критичен для всех программ проверки содержимого. Но тем не менее данные программы часто вполне успешно работают.

Отдельно нужно сказать о серверах и центрах всевозможных черных списков. Если там нет четких и ясных формальных критериев формирования списков, то насколько им можно доверять? Тот же вопрос возникает и в отношении различных самодеятельных способов решения проблемы, основу которых, например, составляют отказ в приеме при отсутствии трансляции IP адреса узла-отправителя в доменное имя, произвольные правила фильтрации на стадии helo протокола SMTP (Simple Mail Transfer Protocol) и т. д.

Признаю, что иногда мы тоже неоправданно ужесточали некоторые правила. Однако внимательное изучение документов RFC (Request for Comments) позволило найти верный путь. В данных документах (в частности, в RFC 2505 "Anti-Spam Recommendations for SMTP MTAs") рекомендуется быть крайне осторожными в своих методах и решениях для борьбы со спамом, чтобы обычные пользователи могли работать с почтой без особых проблем.

К сожалению, в сегодняшнем мире нарастают опасные тенденции неуважительного отношения к интересам и проблемам пользователей, и опаснее всего распространение данного явления в среде администраторов и разработчиков серверного ПО.

Коренной перелом, или Декабрьское контрнаступление

В декабре 2004 г. события стали развиваться более чем стремительно. В пятницу 3 декабря я заехал на радиостанцию, чтобы посмотреть "фронтовую" сводку. Размер файла конфигурации milter-regex достиг 90 Кб, и конца этому не было видно. Казалось, что битву мы уже проиграли. В какой-то момент появилась мысль о возможности найти некоторую зависимость между IP-адресом узла-отправителя и адресом отправителя в конверте письма. Проговорив пару часов, мы ушли с радиостанции.

На следующий день (4 декабря) в голову пришла идея, как построить некий алгоритм для нахождения указанной зависимости. За один день удалось написать первую реализацию этого алгоритма. Затем в модуль milter-connect была встроена возможность получения входных параметров для работы алгоритма, получившего название LMTA (Legacy Mail Testing Algorithm). С 6 декабря в течение двух недель проверялись результаты действия алгоритма для суточного объема писем "Маяка". Алгоритм постепенно улучшался. С 22 декабря модуль milter-connect уже функционировал с включенной опцией запуска алгоритма, но пока еще в тестовом режиме. Алгоритм показывал хорошую эффективность: в среднем на 10 тыс. сообщений он пропускал порядка 600 писем (т. е. его эффективность составила более 90%).

В феврале 2005 г. модуль milter-regex был отключен, статические листы более не использовались, а алгоритму LMTA было разрешено отказывать в приеме сообщений. Любопытно, но после этого у многих пользователей почтовой системы проявился своеобразный эффект "спам-ломки". Действительно, все привыкли начинать утро с очистки почтового ящика от спама, и вдруг - ни одного сообщения! Как будто тебя забыли, как будто тебя в мире больше нет... Обеспокоенные пользователи звонили администраторам с вопросами относительно возможных проблем с почтой. Некоторым пользователям по гуманным соображениям пришлось вновь включить доставку всей почты (как знать, вдруг существует и спамомания).

Безусловно, работа с живыми людьми необыкновенно улучшает свойства программных продуктов. Так и пакет TPmail (созданные модули были объединены в один пакет) постепенно совершенствовался в ходе реальной эксплуатации. Заметим, что алгоритм LMTA для своей работы требует только IP-адрес узла-отправителя, адрес отправителя из конверта письма, адрес из стадии helo протокола SMTP. Решение о дальнейшей обработке сообщения принимается еще до начала приема письма. Это позволяет снизить нагрузку на почтовые серверы и уменьшить объем трафика. Сегодня LMTA является одним из немногих успешных алгоритмов неконтентной фильтрации почты. Но сразу подчеркнем, что его нельзя назвать универсальным решением.

Четвертое стратегическое оружие

В марте 2005 г. был выпущен последний модуль milter-quota. Его главной целью была возможность выборочного квотирования почтового трафика по тем или иным параметрам. Одной из интересных функций данного модуля была защита sendmail от перегрузки (атаки с отказом от обслуживания). Начиная с весны 2005 г. такие атаки все чаще применялись против почтовых серверов радиостанции. Часто они предпринимались с территории Израиля. Один из внешних почтовых серверов вышел из строя после того, как в течение 6 c было открыто более 4000 соединений. Но после включения в работу модуля milter-quota таких проблем больше не возникало. Атаки по отказу от обслуживания продолжались еще 2-3 мес, а затем совсем прекратились.

Окончание

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

С автором, главным системным архитектором ЗАО "ЛайтиГуард", можно связаться по электронному адресу: 5817@ostrov.net.

Версия для печати