Установка и базовая настройка Rspamd на Debian 8

Я давно наблюдал за системой фильтрации спама 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 на Github

Установка Rspamd

Устанавливаем доп. утилиты:

apt-get install -y lsb-release wget

Добавляем официальный репозитарий:

CODENAME=`lsb_release -c -s`
wget -O- https://rspamd.com/apt-stable/gpg.key | apt-key add -
echo "deb http://rspamd.com/apt-stable/ $CODENAME main" > /etc/apt/sources.list.d/rspamd.list
echo "deb-src http://rspamd.com/apt-stable/ $CODENAME main" >> /etc/apt/sources.list.d/rspamd.list
apt-get update

ВНИМАНИЕ! Начиная с версии 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 = "postmaster@myorg.ru";
}

В секции 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. Ваш файл конфигурации может находится в другом месте и иметь другие настройки.

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:SSL: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_trusted_certificate /etc/nginx/ssl/letsencrypt-ca.pem;
        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 -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