Защита почтового сервера от спама во FreeBSD


В настоящее время, когда работу наверное любой организации, имеющей выход в интернет, трудно представить без использования электронной почты, проблема ее защиты от спама и вирусов стоит очень актуально.В данной заметке хочется поделиться опытом внедрения некоторых средств защиты на наших серверах.
Уже достаточно давно, с первых серверов, мы выбрали в роли smtp-сервера postfix. Данный выбор по настоящее время считаем оправданным, т.к. по производительности, относительной простоте и гибкости настройки, количеству документации (родной и всевозможных FAQ-ов в интернете), возможности надстройки дополнительных инструментов postfix не уступает, а порой и превосходит альтернативные решения.
Не будем описывать как установить из порта (/usr/ports/mail/postfix), много раз об этом написано. Родные средства postfix-а, при правильной комбинации параметров в конфигурационном файле, довольно хорошо фильтруют спам.
Вот некоторые ключевые части конфигурационного файла

smtpd_client_restrictions = permit_mynetworks, check_client_access hash:/usr/local/etc/postfix/access,
reject_unknown_recipient_domain,
reject_unknown_client_hostname,
reject_rbl_client list.dsbl.org,
..............

и далее еще немаленький список rbl-серверов, который спасал нас долгое время от спама. ;-)

smtpd_sender_restrictions = permit_mynetworks,
check_sender_access hash:/etc/postfix/access,
reject_non_fqdn_sender,
reject_unlisted_recipient,
reject_unknown_sender_domain,
reject_invalid_helo_hostname,
reject_unknown_address,
reject_rhsbl_sender dul.ru,
.......

smtpd_recipient_restrictions = permit_mynetworks,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unlisted_recipient,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service inet:127.0.0.1:2525
А здесь стоит обратить внимание на последний параметр. Относительно недавно решили использовать технологию greylisting
Сначала попробовали использовать postgrey (/usr/ports/mail/postgrey), но потом выбор пал на gld (/usr/ports/mail/gld). Второй в отличии от первого написан на си (а не perl), использует базу mysql или pgsql (а не berkleyDB).
Установка из порта стандартная
cd /usr/ports/mail/gld;make install clean
Далее создание и настройка базы данных. Эти действия нужно проводить на том сервере, где крутится mysql-сервер (может быть тот-же, где postfix, а может быть другой - от этого зависит какой сервер укажите в конфиге gld.conf)

mysqladmin create greylistd
mysql greylistd
mysql mysql < greypriv

Содержимое greypriv

CREATE USER 'greylistd'@'localhost' IDENTIFIED BY 'superpupersecretpassword';
GRANT USAGE ON * . * TO 'greylistd'@'localhost' IDENTIFIED BY 'superpupersecretpassword' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
CREATE DATABASE IF NOT EXISTS `greylistd` ;
GRANT ALL PRIVILEGES ON `greylistd` . * TO 'greylistd'@'localhost';

Файл /usr/local/etc/gld.conf (слегка изменённый от “дефаултного”)

PORT=2525
LOOPBACKONLY=1
CLIENTS=127.0.0.1/32
USER=nobody
GROUP=nobody
MAXCON=100
MINTIME=60
LIGHTGREY=0
MXGREY=1
WHITELIST=1
ERRACCEPT=1
SYSLOG=1
FACILITY=mail
MESSAGE=Greylisting in action, please try later
TRAINING=0
SQLHOST=localhost
SQLUSER=greylistd
SQLPASSWD=superpupersecretpassword
SQLDB=greylistd

Все. После добавления ‘gld_enable=”YES”‘ в /etc/rc.conf и старта демона можно считать, что greylists мы подключили к postfix-у.

На следующих графиках виден результат работы postfix’a с greylist’-ами

Теперь пришло время “прикрутить” к почтовому серверу антивирусную защиту. Выбор антивирусного пакета для проверки почты дело вкуса. За время эксплуатации наших почтовых серверов мы использовали и drweb, и kaspersky (”платные” решения). Но в настоящее время можно пристально взглянуть в сторону opensource-решений. По-моему мнению такой антивирус данного класса как Сlamav дорос до того состояния, когда его можно использовать в серьёзных решениях.

Установка и настройка довольно простая.

cd /usr/ports/security/clamsmtp;make install clean
Разрешить исполнение демонов в /etc/rc.conf

clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
clamsmtpd_enable="YES"

Конфигурационный файл редактировать под себя нужно совсем немного. Hапример мы поменяли лишь параметры

Listen: 127.0.0.1:10025
Header: X-Virus-Scanned: %d ClamAV using ClamSMTP
VirusAction: /usr/local/bin/virus_action.sh
В последнем из них Вы можете указать путь к скрипту “заточенному” под Ваши нужды (запись событий в лог-файл, сохранение в карантин, пойманных “жучков”, и т.д. )

Чтобы postfix начал взаимодействовать с антивирусом достаточно добавить в конфигурационный файл master.cf следующий блок

# AV scan filter (used by content_filter)
scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes
-o smtp_enforce_tls=no
# For injecting mail back into postfix from the filter
127.0.0.1:10026 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8

Далее старт всех демонов (clamsmtpd clamd freshclam), рестарт postfix и вуа-ля… Попробуйте послать тестовое письмо. Если что-то сделано не так или оно содержит вирус - оно не дойдёт. Если все нормально, то в заголовке письма будет присутствовать тег X-Virus-Scanned: ClamAV using ClamSMTP

Вот вроде и все. Это все описано в документации по упомянутым продуктам, но это же english ;) и мало кто ее не читает. А жаль)
Да пребудет с тобой крыша!

Обновлено: 12.03.2015