Почтовый спам от пользователей и борьба с ним

Настройка milter-greylist

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

Почтовые системы, такие как Sendmail и Postfix умеют работать с milter-greylist. Вполне возможно, что вы знакомы с ним. Данная программа позволяет фильтровать исходящую и входящую почту, задерживать письма, тем самым сокращая спам.

На самом деле, функционал данной программы позволяет решать и другие задачи. Например, ограничивать количество адресов получателей, фильтровать письма, используя GeoIP и даже отпечатки операционных систем (ОС). Эти возможности кажутся избыточными (по крайне мере, мне еще не понадобились), а вот опция ограничения по количеству отправляемых писем в единицу времени оказывается очень полезной.

Допустим, нам необходимо ограничивать количество отправляемых писем от авторизованных пользователей в сутки. Для этого достаточно добавить в конфигурационный файл /etc/mail/greylist.conf следующие строчки:

# Ratelimit blacklist for authorized only users
ratelimit "internal users" rcpt 1000 / 1d key "%M{auth_authen}"
sm_macro "authorized" "{auth_authen}" /.*/
racl blacklist sm_macro "authorized" ratelimit "internal users" \
    autowhite 1d flushaddr \ # cleanup database each day
    msg "too many messages, try later"

В первой строчке мы определяем правило ratelimit с именем “internal users”, которое сработает только тогда, когда пользователь отправит более 1000 писем в день. Опция key указывает, что база будет строиться по ключю auth_authen макроса Sendmail. Он задает имя авторизованного пользователя.

Вторая строчка задает макрос с именем “authorized” по ключу “{auth_authen}” и регекспсом равным любому значению. Оно понадобится нам далее.

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

  • ключ макроса auth_authen имеет какое-то значение (только авторизованные пользователи)
  • ограничитель скорости (ratelimit) выдает положительный результат о превышение отправленных писем

Строчка autowhite 1d flushaddr указывает, что базу черного списка надо “чистить” раз в день и автоматически.

Поле msg указывает какой текст отдавать клиенту, когда он попал в черный список. Также можно еще указать коды ошибок с помощью флагов code и ecode. Пример из мануала:

racl greylist default code "451" ecode "4.7.1"

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

sm_macro "unauthorized users" "{auth_authen}" unset

И далее использовать как обычно:

racl greylist sm_macro "unauthorized users" \
    delay 5m \
    autowhite 1h

Проверка конфигурации

Мне не хотелось все проверять на боевой системе и две минуты поиска в Интернет выдали сайт специализированного milter-прокси сервера milter-manager.

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

Утилита тестирования серверов называется milter-test-server. У нее немного опций, подробное описание и примеры имеются на сайте разработчика.

Я лишь дам готовые примеры для тестирования на локальной машине. Итак, тестирование от не авторизованного пользователя делается следующим образом:

$ sudo /usr/bin/milter-test-server \
-s unix:/run/milter-greylist/milter-greylist.sock \
-r test@while.cc \
--envelope-from-macro if_addr:10.0.0.1
status: pass
elapsed-time: 0.001507 seconds

Примечание. Повышение прав через sudo требуется только для доступа к unix domain socket /run/milter-greylist/milter-greylist.sock. Я не стал заморачиваться с перезаданием прав, так что не ругайте :)

В конфигурации по умолчанию заданы определенные правила. Для чистоты экспериментов мы перезадем некоторые параметры. Флаг -r задает почтовый адрес получателя, а с помощью –envelope-from-macro IP адрес клиента.

Вот как выглядит отправка от авторизованного пользователя:

$ sudo /usr/bin/milter-test-server \
-s unix:/run/milter-greylist/milter-greylist.sock \
-r test@while.cc \
--envelope-from-macro if_addr:172.20.0.1 \
--authenticated-name=testuser
status: pass
elapsed-time: 0.001819 seconds

Как видно, я добавил лишь флаг –authenticated-name, чтобы указать milter-greylist, что письмо отправляется от авторизованного пользователя с именем testuser.

После нескольких попыток (я уменьшил значения для ratelimit) мы получим ошибку:

$ sudo /usr/bin/milter-test-server -s unix:/run/milter-greylist/milter-greylist.sock -r test@loc.co --envelope-from-macro if_addr:10.0.0.1 --authenticated-name=limituser
status: reject [551]<5.7.1>(too many messages, try later)
elapsed-time: 0.000884 seconds

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

Заключение

Вот так, тремя строчками мы решили важную проблему :-) Помимо milter-greylist существует множество различных серверов, которые работают по протоколу milter, позволяя делать некую дополнительную полезную работу:

  • вести статистику и строить графики
  • проверять содержимое писем (на вирусы и не только)
  • производить архивирование
  • ограничивать объемы почтового трафика (Traffic Shaping)
  • и другое

Информацию по известным milter-серверам можно найти на сайте milter.org. И еще, различные примеры конфигураций milter-greylist можно найти на странице wiki проекта.