понедельник, 16 июля 2007 г.

Фильтрация спама для Qmail c помощью SpamAssassin

Все написанное производилось для Slackware 9.1. Описание установки и настройки Qmail, а также описание установки SpamAssassin не приводится. Почта пользователей сервера myserver.ru хранится в домашних каталогах пользователей в Maildir формате.

Спам — достал. Способов борьбы с ним тьма, но что-то же выбрать надо. Что мне понравилось в SpamAssassin, это отсутствие необходимости постоянно в ручную обучать его новому спаму, чтобы он работал эффективно. То есть, при желании это можно делать, но пользователей обучить нереально, а сисадмину и так есть чем занятся :-).

Для работы SpamAssassin использует огромную базу правил. Каждому правилу назначается определенный вес. При проверке письма веса всех «сработавших» правил суммируются. Если сумма превысила пороговое значение, письмо помечается как спам. База всех правил постоянно пополняется, весовые коэффициенты уточняются. SpamAssassin предоставляет утилиту для обновления базы правил, которую можно запускать в автоматическом режиме по расписанию.

Есть два способа обращаться к SpamAssasin:

  1. в режиме утилиты командной строки — spamassasin,
  2. в режиме клиента spamc для демона spamd.

Второй вариант работает быстрее, т.к. не тратится время на запуск и инициализацию программы. Однако расходует больше памяти, т.к. демон должен быть постоянно запущен. Как показала практика, SpamAssassin достаточно тяжел в работе, на принятие решения по одному письму уходит от 2-х до 7 секунд работы программы. А памяти на серверах обычно много и она дешева. Поэтому используем второй вариант. Для автоматического запуска демона spamd при загрузке сервера прописываем в файле /etc/rc.d/rc.M строчки:

# Start the SpamAssasin daemon:
if [ -x /etc/rc.d/rc.spamd ]; then
  /etc/rc.d/rc.spamd start
fi

Вики SpamAssasin предлагает три способа интеграции с qmail:

  1. Через программу Simscan глобально на этапе приема письма по smtp;
  2. Через программу qmail-scanner глобально на этапе пересылки/доставки письма;
  3. Через скрипт ifspamh и редактирование файла ~/.qmail для индивидуального почтового ящика на этапе локальной доставки письма;

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

cd /usr/local/bin
wget http://www.gbnet.net/~jrg/qmail/ifspamh/ifspamh
chmod +x ifspamh

Скрипт ifspamh «из коробки» не заработал, пришлось немного подпилить. Вместо оболочки ksh, которую я не устанавливал прописал запуск из bash. На работоспособность скрипта это не повлияло. Подправил пути поиска утилит spamc, forward (входит в qmail) и 822field. Утилита 822field входит в состав пакета mess822. Мне повезло, пакет mess822 для Slackware 9.1 был на linuxpackages.net. А если бы не было, так не беда — сам бы собрал, просто ленив я стал...

Для каждого пользователя, которому нужна фильтрация спама редактируем файл ~/.qmail:

|/usr/local/bin/ifspamh spam@myserver.ru
./Maildir/

Теперь весь обнаруженный спам будет пересылаться на ящик spam@myserver.ru, эдакий спамоотстойник сервера. Доставки в локальный ящик не будет. Письма не удаляются, администратор всегда сможет найти ложно отфильтрованное письмо в отстойнике. Теперь проверим работу обновления базы правил SpamAssassin, для этого используется утилита sa-update. Запустим её без параметров, если все пройдёт успешно, то в каталоге /var/lib/spamassassin/<version>/ появятся обновленные базы правил. Чтобы обновления вступили в силу, демон spamd необходимо перезапустить. Прописать запуск sa-update в автоматическом режиме по расписанию я пока не решился. Но тем не менее crontab изменить пришлось:

# 0 2 * * * sa-update && /etc/rc.d/rc.spamd restart
0 3 * * * find ~spam/Maildir -ctime +31 -type f -exec rm {} \;

Как вы заметили, я добавил очистку ящика spam@myserver.ru, чтобы этот отстойник не переполнился. Если письмо в течении месяца никому так и не понадобилось, то его можно спокойно удалить.

За прошедший (не очень продолжительный) период работы не было ни одного ложного срабатывания. Эффективность обнаружения спама около 97%. Всё.

Комментариев нет: