Заметка на тему Maia Mailguard

Уверен в том, что вопрос спама всегда актуален в любой конторе, рано или поздно на ящик пользователя начнёт падать нежелательная почта. И как результат головная боль админа, недовольные пользователи и т.д. и т.п. Соответственно нужен софт (подразумеваю комплекс ПО) который будет резать спам. При выборе такого софта я руководствовался следующими критериями:

  • бесплатно
  • веб-интерфейс для пользователя
  • должно работать на FreeBSD
  • должно интегрироваться в существующую схему почтового сервера
  • обучаемая

Недолгие поиски привели к dspam’у. Установил, настроил. Система работала успешно года четыре, и работала бы еще если бы не было принято решение перейти на Maia Mailguard. Почему переходил? Да в основном потому что dspam прекратил своё развитие и кроме того по сравнению с Maia, dspam обладает меньшими возможностями. Привожу сравнительную таблицу только основных возможностей:

возможность dspam Maia Mailguard
веб-интерфейс пользователя + +
работа с виртуальными почтовыми ящиками + +
проверка на вирусы (clamd) + +
перевод веб-интерфейса на русский + +
статистика по пользователю/системе в целом + +
информация о задержаных вирусах +
сообщение пользователю на почту если он давно не заходил +
распознавание спама в картинках +
управление несколькими почтовыми ящиками из одной учётной записи +
язык на которым написан веб-интерфейс perl php
работа с белыми/чёрными списками только вкл/откл возможность задание конкретных адресов
развитие продукта исходники у community. с 2009 года новых версий не выходило +

Полный список возможностей Maia

Только не нужно думать, что всё так сладко с Maia. Для русского перевода веб-интерефейс корректно работает только с UTF-8, и только в Опере или IE. Шаблоны сообщений пользователю на почту требуют перевода

Нюансы или что показывает вскрытие

  • После всех инсталяций открываем таблицу policy. Видим политику по умолчанию Default. Названия полей интуитивно понятны, потому выставляем Y/N на своё усмотрение. Интересны три последних поля spam_tag_level/spam_tag2_level/spam_kill_level. Наблюдая за работой системы несколько дней для правила Default были выставлены значения 2/2.4/2.4 соответственно
  • Теперь открываем config.php и ищем строку $protection = array значения которой будут помещены в таблицу policy при первом входе пользователя. В качестве логин/пароля выступает почтовый адрес/пароль пользователя. В качестве дифолтного уровня защиты я выбрал medium. А раз так, то значения из таблицы policy и значения уровня medium должны совпадать. Таким образом каждый новый пользователь заходя впервые в панель управления, по умолчанию получает уровень защиты medium. Уровни high/low правим на своё усмотрение давая пользователю возможность самому выставить нужный уровень защиты средствами интерфейса. В настройках учётной записи на конкретный почтовый адрес пользователь сам может установить значения spam_tag_level, spam_tag2_level, spam_kill_level. При этом слайдер уровня защиты в интерфейсе будет Off, хотя реально всё будет работать
  • Все письма отображающиеся в интерфейсе  Maia Mailguard помещаются в базу. Есть кнопка rediliver которая позволяет получить сообщение на ящик нужное количество раз. Однако если пользователь не зарегистрировался через веб-интерфейс, в таком случае правило Default для него всё равно работает, но если вдруг нужное послание было ошибочно признано за спам, вытащить его будет затруднительно
  • В процессе работы maiad в /tmp создаёт папки вида .spamassassin106580DrMpKtmp и не удаляет их за собой. Крон в руки
  • Если у вас postfix и вы использовали clamsmtpd то нужно удалить параметр receive_override_options иначе postfix не смотрит в таблицу с алиасами
  • Русификация интерфейса проводится путём добавления языка супер-администратором средствами веб-интерфейса с последующим переключением в настройках учётной записи. Либо в таблице maia_users для пользователя @ (пользователь по умолчанию) в поле language пишем значение ru. Там же можно изменить тему по умолчанию theme_id=2. Каждый новый пользователь возьмёт эти значения по умолчанию. Удобно один раз настроить дифолтные значения.
  • Инструкция по настройке Maia Mailguard на FreeBSD eng и её перевод рус

TL;DR

В итоге была получена весьма функциональная система борьбы со спамом с приятным, дружественным к пользователю интерфейсом. Эффективность работы системы 89.87%, ложное срабатывание 1.08%, пропущенный спам 9.05% на 12644 письмах от начала эксплуатации, что сравнимо по эффективности с dspam’ом

А теперь об ошибках Maia Mailguard

Ошибка №1 (maia-1.0.3.r1575_3)

Для установки maia необходимо наличине какой-нибудь БД. Я использую MariaDB и в /etc/make.conf у меня есть запись WITH_MYSQL_VER=55m наличине которой достадочно, чтобы любое устанавливаемое ПО смотрело на mariadb-client в качестве клиентской библиотеки. Однако нет, в процессе инсталяции maiad вывалилась ошибка

===> Found saved configuration for maia-1.0.3.r1575_3
===> Fetching all distfiles required by maia-1.0.3.r1575_3 for building
===> Extracting for maia-1.0.3.r1575_3
=> SHA256 Checksum OK for maia-1.0.3-r1575.tar.gz.
===> Patching for maia-1.0.3.r1575_3
===> maia-1.0.3.r1575_3 depends on shared library: mysqlclient.18 — not found
===> Verifying install for mysqlclient.18 in /usr/ports/databases/mariadb55-client
===> Found saved configuration for mariadb55-client-5.5.33a_1
===> Fetching all distfiles required by mariadb55-client-5.5.33a_1 for building
===> Extracting for mariadb55-client-5.5.33a_1
=> SHA256 Checksum OK for mariadb-5.5.33a.tar.gz.

при всем том, что libmysqlclient.so.18 лежала в своей папке  /usr/local/lib/mysql, maia упорно отказывалась её видеть. Снос MariaDB и установка MySQL также не помогла. Решение нашлось простое и против всякой логики. При выборе опций инсталяции, опцию RAR выбирать не нужно. Позитивный результат на консоли

===> maia-1.0.3.r1575_3 depends on shared library: mysqlclient.18 — found
===> Configuring for maia-1.0.3.r1575_3

Непонятно только, какая связь между RAR’ом и клиентом БД

Ошибка №2 (maia-1.0.3.r1575_3)

Почему-то при enable_db = 1 из maiad.conf в maillog полетели ошибки, хотя на аналогичном серваке с FreeBSD x32 таких проблем не было

Oct 20 13:06:51 mx maiad[56633]: TROUBLE in child_init_hook: BDB bad db env. at /var/maiad/db: No such file or directory, No such file or directory. at (eval 80) line 260.

Решилось отключением данного параметра, он не сильно-то и нужен

enable_db = 0

Ошибка №3 (maia-1.0.3.r1575_3)

Чтобы запуск задач по cron’у не приводил к ошибкам

config: cannot create user preferences file /nonexistent/.spamassassin/user_prefs: No such file or directory config: failed to create default user preference file /nonexistent/.spamassassin/user_prefs

нужно дописать в начало пользовательского crontab’а от имени которого работает maia (у меня vscan) переменную HOME с указанием на «домашнюю папку» maiad

HOME=/var/maiad

Ошибка №4 (maia-1.0.3.r1575)

Периодически нужно править Makefile. Ищем строку

RUN_DEPENDS+=   p5-DBD-mysql>=0:${PORTSDIR}/databases/p5-DBD-mysql

мегяем на

RUN_DEPENDS+=   p5-DBD-mysql55>=0:${PORTSDIR}/databases/p5-DBD-mysql55

Ошибка №5 (maia-1.0.3.r1575_4)

После инсталяции, при попытке запуска получаем

ERROR: MISSING REQUIRED ADDITIONAL MODULES:
DBD::mysql

Решается добавлением в Makefile строки

WANT_MYSQL_VER=55m

Ошибка №6 (maia-1.0.3.r1575_4)

После запуска maiad через короткое время отваливается. В логах появляется запись

maiad[2028]: TROUBLE in pre_loop_hook: BDB no dbN: __fop_file_setup:  Retry limit (100) exceeded, File exists. at (eval 80) line 247

и всё это сопровождается невозможностью сервера принимать и отсылать почту

postfix/smtp[2159]: 0DCF417142: to=<user@domain.tld>, relay=none, delay=0.23, delays=0.2/0.02/0/0, dsn=4.4.1, status=deferred (connect to 127.0.0.1[127.0.0.1]:10024: Connection refused)

решение вопроса

rm /var/maiad/db/*
service maiad restart
postsuper -r ALL

Ошибка №7 (maia-1.0.3.r1575_4)

В логах появилась ругань при попытке пользователя выслать два rtf-файла в аттаче

Sep 5 15:44:44 mx postfix/smtp[18829]: 5865118CC3A: to=<******@i.ua>, relay=127.0.0.1[127.0.0.1]:10024, delay=530, delays=529/0/0/0.51, dsn=4.5.0, status=deferred (host 127.0.0.1[127.0.0.1] said: 451 4.5.0 Error in processing, id=18935-03, spam_scan FAILED: DBD::mysql::st execute failed: MySQL server has gone away at /usr/local/sbin/maiad line 3827, <GEN13> line 31442. (in reply to end of DATA command))

Проблема решилась добавлением в my.cnf параметра max_allowed_packet

[mysqld] 
max_allowed_packet=8M

перегружаем mysql и проталкиваем застрявшие сообщения командой

postsuper -r ALL

Ошибка №8 (maia-1.0.4_3)

После перехода с mariadb101 на mariadb102 и обновления схемы в почтовых логах появилась ошибка

TROUBLE in check_mail: Take Action! FAILED: DBD::mysql::st execute failed: Column ‘autolearn_status’ cannot be null at /usr/local/sbin/maiad line 4408

В результате вся почта застряла в очереди

Для решения необходимо разрешить NULL поля maia_mail.autolearn_status

alter table maia_mail modify autolearn_status varchar(15);

FAILED: DBD::mysql::st execute failed: Column 'autolearn_status' cannot be null

service maiad restart 
postsuper -r ALL