Я давно наблюдал за системой фильтрации спама Rspamd, но внедрить её на продакшн сервера все не доходили руки. И вот в один прекрасный вечер, пару серверов захлестнула спам-рассылка и стоящие там Postfix + Amavis-new + SpamAssassin прилично нагрузили сервер, да так, что начали страдать пользователи. Поэтому было принято решение перейти на Rspamd.
Расскажу немного о самом Rspamd — это система фильтрации спама, предоставляющая средства для оценки сообщений по различным критериям, включая правила, статистические методы и чёрные списки, на основе которых формируется итоговый вес сообщения, используемый для принятия решения о необходимости блокировки. Rspamd поддерживает практически все возможности, реализованные в SpamAssassin, и имеет ряд особенностей, позволяющих фильтровать почту в среднем в 10 раз быстрее, чем SpamAssassin, а также обеспечивать лучшее качество фильтрации. Код системы написан на языке Си и распространяется под лицензией BSD.
Rspamd построен с использованием событийно-ориентированной архитектуры (Event-driven) и изначально рассчитан на применение в высоконагруженных системах, позволяя обрабатывать сотни сообщений в секунду. Правила для выявления признаков спама отличаются высокой гибкостью и в простейшем виде могут содержать регулярные выражения, а в более сложных ситуациях могут оформляться на языке Lua. Расширение функциональности и добавление новых типов проверок реализуется через модули, которые могут создаваться на языках Си и Lua. Например, доступны модули для проверки отправителя с использованием SPF, подтверждения домена отправителя через DKIM, формирования запросов в списки DNSBL. Для упрощения настройки, создания правил и отслеживания статистики предоставляется административный web-интерфейс.
Исходные данные: Debian 8.9 Jessie (amd64)
Почтовый сервер: Postfix 2.11.3 + Dovecot 2.2.13 + Amavis-new (будет удален) + SpamAssassin (будет удален)
Задача: Установить и настроить Rspamd версии 1.6.x (на конец 2017 года)
ВНИМАНИЕ! Статья описывает настройку rspamd версии 1.6.x, в настоящий момент (2019 год) уже доступна версия 1.9 и для нее должны быть сделаны исправления в соответствии с документацией. Если Вы просто не глядя в документацию скопируете мои настройки, то rspamd версии 1.7 может не запуститься или работать некорректно.
Полезные ресурсы:
Презентация автора
Репозитарий rspamd на Github
Установка Rspamd
Устанавливаем доп. утилиты:
apt-get install -y lsb-release wget
Добавляем официальный репозитарий (для архитектуры x64):
CODENAME=`lsb_release -c -s` wget -O- https://rspamd.com/apt-stable/gpg.key | apt-key add - echo "deb [arch=amd64] http://rspamd.com/apt-stable/ $CODENAME main" > /etc/apt/sources.list.d/rspamd.list echo "deb-src [arch=amd64] http://rspamd.com/apt-stable/ $CODENAME main" >> /etc/apt/sources.list.d/rspamd.list apt-get update
Для других Linux-дистрибутивов процедуры добавления репозитария описана в документации.
ВНИМАНИЕ! Начиная с версии Rspamd 1.6 отдельный модуль rmilter для связи с MTA стал не нужен, в Rspamd уже встроен модуль для работы с MTA — rspamd_proxy
Встроенный Milter может использоваться в двух режимах — Proxy для крупных систем и Self-scan для небольших конфигураций (данный режим отличается существенным упрощением настройки). Режим Proxy требует отдельного сканирующего слоя, в то время как в
режиме «Self-scan» обработчик rspamd_proxy сканирует сообщение собственными силами и взаимодействует с MTA, такими как Postfix и Sendmail, напрямую при помощи протокола Milter.
Устанавливаем только rspamd:
apt-get --no-install-recommends install rspamd
Для хранения данных в Rspamd можно использовать базу Sqlite или Redis. Я настоятельно рекомендую установить и использовать Redis для получения максимального быстродействия.
Установка и настройка Redis описана в другой моей статье.
Проверим, установлен ли пароль для подключения к Redis:
cat /etc/redis/redis.conf | grep requirepass # If the master is password protected (using the "requirepass" configuration requirepass XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Как видим, пароль есть, поэтому он нам понадобится для дальнейшей настройки Rspamd.
Настраиваем rspamd
Первым делом хочется обратить внимание на то, что все стандартные файлы конфигурации Rspamd ни в коем случае трогать не нужно, т.к. при очередном обновлении Rspamd Вы можете потерять свои настройки. Вместо этого все свои настройки нужно вносить в пользовательские файлы конфигурации, которые не будут затронуты при обновлении.
Все настройки Rspamd в Debian хранятся в каталоге /etc/rspamd/
Для начала рассмотрим основной файл /etc/rspamd/rspamd.conf:
# Подключается доп. файл настроек /etc/rspamd/common.conf .include "$CONFDIR/common.conf" # Секция options описывает основные настройки Rspamd, например # pidfile - это опция, указывающая расположение PID файла # .include - это подключение доп. файлов конфигурации # Обратите внимание на строку # .include(try=true; priority=1,duplicate=merge) "$LOCAL_CONFDIR/local.d/options.inc" # в данном случае если мы хотим добавить новые директивы в секцию options, то мы # должны написать их в нашем пользовательском файле /etc/rspamd/local.d/options.inc # priority=1 - указывает приоритет файла # duplicate=merge - указывает режим слияния # Если же мы хотим заменить некоторые стандартные настройки, в частности те, что # устанавливаются их файла /etc/rspamd/options.inc, то мы должны описать их в # файле /etc/rspamd/override.d/options.inc # Итак, важно запомнить, что файлы пользовательских настроек, лежащие # в папке /etc/rspamd/local.d добавляют новые настройки к существующей конфигурации, # а файлы из папки /etc/rspamd/override.d заменяют стандартные настройки. # Но для полного понимания того, какие файлы должны быть нужно смотреть основные # файлы конфигурации. options { pidfile = "$RUNDIR/rspamd.pid"; .include "$CONFDIR/options.inc" .include(try=true; priority=1,duplicate=merge) "$LOCAL_CONFDIR/local.d/options.inc" .include(try=true; priority=10) "$LOCAL_CONFDIR/override.d/options.inc" } # Настройки логгирования событий # Пользовательский файл конфигурации будет /etc/rspamd/local.d/logging.inc и # файл /etc/rspamd/override.d/logging.inc logging { type = "file"; filename = "$LOGDIR/rspamd.log"; .include "$CONFDIR/logging.inc" .include(try=true; priority=1,duplicate=merge) "$LOCAL_CONFDIR/local.d/logging.inc" .include(try=true; priority=10) "$LOCAL_CONFDIR/override.d/logging.inc" } # Настройки воркеров # Основной воркер # Пользовательский файл конфигурации будет /etc/rspamd/local.d/worker-normal.inc и # файл /etc/rspamd/override.d/worker-normal.inc worker { bind_socket = "*:11333"; .include "$CONFDIR/worker-normal.inc" .include(try=true; priority=1,duplicate=merge) "$LOCAL_CONFDIR/local.d/worker-normal.inc" .include(try=true; priority=10) "$LOCAL_CONFDIR/override.d/worker-normal.inc" } # Воркер для управления Rspamd через Web-интерфейс worker { bind_socket = "localhost:11334"; .include "$CONFDIR/worker-controller.inc" .include(try=true; priority=1,duplicate=merge) "$LOCAL_CONFDIR/local.d/worker-controller.inc" .include(try=true; priority=10) "$LOCAL_CONFDIR/override.d/worker-controller.inc" } # Воркер для связи с MTA worker "rspamd_proxy" { bind_socket = "*:11332"; .include "$CONFDIR/worker-proxy.inc" .include(try=true; priority=1,duplicate=merge) "$LOCAL_CONFDIR/local.d/worker-proxy.inc" .include(try=true; priority=10) "$LOCAL_CONFDIR/override.d/worker-proxy.inc" } # Воркер для локального fuzzy хранилища, по умолчанию отключен # Local fuzzy storage is disabled by default #worker { # bind_socket = "*:11335"; # .include "$CONFDIR/worker-fuzzy.inc" # .include(try=true; priority=1,duplicate=merge) "$LOCAL_CONFDIR/local.d/worker-fuzzy.inc" # .include(try=true; priority=10) "$LOCAL_CONFDIR/override.d/worker-fuzzy.inc" #}
У Rspamd есть интерфейс cli для управления — rspamc
С помощью rspamc можно получать статистику работы Rspamd, обучать спам-фильтр, управлять fuzzy хранилищем, управлять символами.
Получение времени работы Rspamd и версии:
# rspamc uptime Results for command: uptime (0.000 seconds) Rspamd version: 1.6.3 Uptime: 7 days 1 hour 25 minutes
Получение статистики работы Rspamd:
# rspamc stat Results for command: stat (0.068 seconds) Messages scanned: 1364659 Messages with action reject: 257956, 18.90% Messages with action soft reject: 94077, 6.89% Messages with action rewrite subject: 0, 0.00% Messages with action add header: 49332, 3.61% Messages with action greylist: 63717, 4.67% Messages with action no action: 899577, 65.92% Messages treated as spam: 401365, 29.41% Messages treated as ham: 963294, 70.59% Messages learned: 51036 Connections count: 41917 Control connections count: 1012 Pools allocated: 554654 Pools freed: 554744 Bytes allocated: 3.99G Memory chunks allocated: 4294965510 Shared chunks allocated: 49 Chunks freed: 0 Oversized chunks: 23947 Fuzzy hashes in storage "local": 0 Fuzzy hashes stored: 0 Statfile: BAYES_SPAM type: redis; length: 106.08M; free blocks: 0; total blocks: 2.79M; free: 0.00%; learned: 34960; users: 324; languages: 0 Statfile: BAYES_HAM type: redis; length: 100.52M; free blocks: 0; total blocks: 2.65M; free: 0.00%; learned: 15417; users: 4078; languages: 0 Total learns: 50377
По умолчанию для работы с rspamc используется стандартный пароль q1 и q2, прописанный в файле /etc/rspamd/worker-controller.inc
Для безопасности мы сменим эти пароли, для этого выполним 2 раза команду:
rspamadm pw
В результате у нас будет 2 хэша новых паролей, которые мы добавим в пользовательский файл /etc/rspamd/local.d/worker-controller.inc
password = "HASH_PASSWD1"; enable_password = "HASH_PASSWD2";
По-умолчанию Rspamd принимает соединения на всех интерфейсах, в нашем случае нам это не нужно, т.к. MTA работает на этом же сервере, поэтому мы пишем:
echo 'bind_socket = "localhost:11333";'>/etc/rspamd/override.d/worker-normal.inc
И настраиваем порт rspam_proxy, этот порт потом укажем в настройках Postfix
echo 'bind_socket = "localhost:11332";'>/etc/rspamd/override.d/worker-proxy.inc
Проверим конфигурацию Rspamd:
rspamadm configtest syntax OK
И перезапустим Rspamd:
/etc/init.d/rspamd restart
Проверяем открытые порты:
netstat -ltupn |grep rspamd tcp 0 0 127.0.0.1:11332 0.0.0.0:* LISTEN 27344/rspamd: main tcp 0 0 127.0.0.1:11333 0.0.0.0:* LISTEN 27344/rspamd: main tcp 0 0 127.0.0.1:11334 0.0.0.0:* LISTEN 27344/rspamd: main
Теперь приступим к настройке метрик, по умолчанию стандартные
настройки находятся в файле /etc/rspamd/metrics.conf
В разделе actions есть параметр reject = 15, он означает, что
все письма получившие 15 баллов будут отклонены (reject) как спам.
Если мы хотим понизить порог, то в пользовательском файле /etc/rspamd/local.d/metrics.conf пишем:
actions { reject = 12; }
Таким образом все письма получившие 12 баллов будут откланяться как спам.
Теперь настроим хранение данных в Redis.
Стандартные настройки из файла /etc/rspamd/statistic.conf подразумевают, что данные будут храниться в Sqlite.
Проверим, установлен ли пароль для подключения к Redis:
cat /etc/redis/redis.conf | grep requirepass
Теперь в пользовательском файле /etc/rspamd/local.d/statistic.conf пишем:
REDIS-PASSWORD — меняем на свой пароль к Redis.
classifier "bayes" { backend = "redis"; servers = "localhost:6379"; password = "REDIS-PASSWORD"; min_learns = 200; statfile { symbol = "BAYES_HAM"; spam = false; } statfile { symbol = "BAYES_SPAM"; spam = true; } autolearn = true per_user = true; }
Настраиваем модуль redis.
В файле /etc/rspamd/local.d/redis.conf пишем:
servers = "localhost:6379"; password = "REDIS-PASSWORD";
Более детально о настройке написано в официальной документации тут.
Настраиваем модуль dmarc для отправки отчетов.
В файле /etc/rspamd/local.d/dmarc.conf пишем:
reporting = true; servers = "localhost:6379"; password = "REDIS-PASSWORD"; key_prefix = "dmarc_"; actions = { quarantine = "add_header"; reject = "reject"; } report_settings { org_name = "MyORG LLC."; domain = "myorg.ru"; email = "[email protected]"; }
В секции report_settings указываем Ваши данные организации, с этими данными будут уходить отчеты DMARC.
Более детально о настройке написано в официальной документации тут.
Настраиваем модуль multimap для ограничения файлов вложений.
Любой уважающий себя администратор почтового сервера, никогда не разрешит принимать или отправлять во вложениях исполняемые и некоторые другие типы файлов из соображений безопасности.
В файле /etc/rspamd/local.d/multimap.conf пишем:
filename_blacklist { type = "filename"; filter = "extension"; map = "${LOCAL_CONFDIR}/filename.map"; symbol = "FILENAME_BLACKLISTED"; action = "reject"; }
Создаем файл с запрещенными расширениями:
cat > /etc/rspamd/filename.map << EOF exe com dll scr lnk EOF
Настраиваем модуль нейронной сети FANN
В файле /etc/rspamd/local.d/fann_redis.conf пишем:
servers = "localhost:6379"; password = "REDIS-PASSWORD";
В файле /etc/rspamd/rspamd.conf.local пишем:
worker "log_helper" { count = 1; }
Более подробно о модуле FANN можно почитать тут.
Устанавливаем владельца и права на файлы конфигурации rspamd
chown root:_rspamd /etc/rspamd/rspamd.conf.local chown root:_rspamd /etc/rspamd/local.d/* chown root:_rspamd /etc/rspamd/override.d/* chmod 640 /etc/rspamd/rspamd.conf.local chmod 640 /etc/rspamd/local.d/* chmod 640 /etc/rspamd/override.d/*
Теперь проверяем конфигурацию и перезапускаем rspamd:
rspamadm configtest /etc/init.d/rspamd restart
Настраиваем Postfix
У меня на сервере использовался Amavis-new для связи Postfix c SpamAssassin, нам нужно отключить эту связку. Так же у меня все виртуальные пользователи Postfix хранятся в БД MySQL.
Если у Вас не используется Amavis-new + SpamAssassin, то для подключения фильтрации через Rspamd Вам будет достаточно выполнить только пункт 3.
1. Отключаем Amavis-new, для этого в файле /etc/postfix/main.cf
в секции
smtpd_data_restrictions =
убираем строку
check_client_access regexp:/etc/postfix/filter-catchall.regexp,
далее
в секции
smtpd_sender_restrictions =
меняем
check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf regexp:/etc/postfix/tag_as_originating.re,
на
check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf,
и убираем строку
check_sender_access regexp:/etc/postfix/tag_as_foreign.re,
далее убираем строку
content_filter = amavis:[127.0.0.1]:10024
и
receive_override_options = no_address_mappings
Кому непонятна опция receive_override_options читаем тут
2. Отключаем Amavis-new из /etc/postfix/master.cf
убираем строки
amavis unix - - - - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes
и
127.0.0.1:10025 inet n - - - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
3. Добавляем наш rspamd_proxy в конфигурацию Postfix, для этого файл /etc/postfix/main.cf приводим к виду:
smtpd_milters = inet:localhost:11332 non_smtpd_milters = inet:localhost:11332 milter_protocol = 6 milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}
Проверяем конфигурацию Postfix:
postfix check
И перезапускаем:
/etc/init.d/postfix restart
Далее останавливаем Amavis-new:
/etc/init.d/amavis-mc stop systemctl stop amavisd-new
И убираем Amavis-new из автозапуска:
insserv -v -r /etc/init.d/amavis-mc systemctl disable amavisd-new
Настройка отображения статистики Rspamd через nginx с авторизацией
Web-интерфейс Rspamd имеет слабую защиту — только одним паролем, тем самым, что мы указали в опции password в файле /etc/rspamd/local.d/worker-controller.inc
Для более лучшей защиты мы организуем защиту логином/паролем на уровне nginx с проксированием на localhost:11334
Создаем файл /etc/nginx/conf.d/rspamd.conf
P.S. Ваш файл конфигурации может находится в другом месте и иметь другие настройки. Предполагается, что у вас уже есть сертификат Letsencrypt для домена, он будет указан в конфигурации nginx.
server { listen XX.XX.XX.XX:8082 http2 ssl; server_name myorg.ru; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_certificate /etc/letsencrypt/live/myorg.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/myorg.ru/privkey.pem; ssl_session_cache shared:RSPAMD:50m; ssl_session_timeout 5m; ssl_dhparam /etc/nginx/ssl/dhparams.pem; ssl_ciphers 'kEECDH+AESGCM+AES128:kEECDH+AES128:kRSA+AESGCM+AES128:kRSA+AES128:kRSA+3DES:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2'; ssl_ecdh_curve secp384r1; ssl_prefer_server_ciphers on; ssl_session_tickets off; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; ssl_stapling on; ssl_stapling_verify on; ssl_stapling_responder http://ocsp.int-x3.letsencrypt.org access_log /var/log/nginx/access_rspamd.log main; error_log /var/log/nginx/error_rspamd.log; location / { proxy_pass http://localhost:11334/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; auth_basic "Rspamd Stat"; auth_basic_user_file /etc/nginx/common/.htpasswd; } }
Создаем файл с паролем (используем для этого утилиту htpasswd из пакета apache2-utils):
apt-get install apache2-utils -y mkdir -p /etc/nginx/common htpasswd -c /etc/nginx/common/.htpasswd admin chown root:www-data /etc/nginx/common/.htpasswd chmod 640 /etc/nginx/common/.htpasswd
Перезапускаем nginx:
nginx -t && nginx -s reload
Проверяем Web-интерфейс через браузер зайдя на https://myorg.ru:8082
На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.
Профессионально занимаюсь системным администрированием Linux -серверов и баз данных (MySQL, POstgreSQL) на протяжении последних 24 лет.
htpasswd — апачевская тулза. А п оконтексту понятно, будьто у автора только nginx.
Утилита htpasswd в Debian входит в пакет apache2-utils и ее наличие никак не означает наличие самого apache2. У меня так и есть, установлен только этот пакет.
Добавлю в статью установку этого пакета, спасибо за внимательность.
В настройке FANN вы снова указываете параметры подключения к Redis. А разве не достаточно того, что было прописано ранее, в redis.conf ?
Достаточно глобального указания сервера redis, но раньше были какие-то ошибки в 1.6.x и пришлось указать конкретно для FANN, сейчас для версии 1.7.x отдельно не нужно, но в версии новее 1.7 нужно указывать:
т.к. модуль FANN по умолчанию отключен, см. документацию.
rspamd_config_read: failed to load config: ucl parser error: cannot open file /etc/rspamd/common.conf: No such file or directory — почему то не видит конфиг в докер. сам файл есть