Распечатать Страница

Настройка антивирусной и антиспамовой защиты на Linux Debian/Ubuntu c MTA Postfix

Установка почтовой системы Postfix на сервер Linux Debian была описана в предыдущей статье.

Здесь же хочу описать процесс установки фильтров спама, вирусов и исполняемых файлов с использованием наиболее распространенных решений:

  • в качестве спам-фильтра используется бесплатный пакет Spamassassin
  • в качестве антивируса используется бесплатный пакет Clamav
  • для передачи сообщения между MTA и фильтрами используется пакет Amavis

Итак, начнем установку пакетов. Набираем в консоли:

aptitude install clamav-daemon spamassassin amavisd-new

instpackets

Жмем Enter и наблюдаем процесс установки.

После установки начинаем конфигурацию пакетов. Здесь я приведу рабочие конфигурационные файлы со своей системы.

Первым делом нужно решить проблему совместного доступа к файлам между пакетами Amavis и Clamav, так как они запускаются под разными пользователями, по умолчанию у Amavisa нет доступа к карантину антивируса.

Проблема решается добавлением соответствующих пользователей в группы этих пакетов.

adduser clamav amavis
adduser amavis clamav

adduserclamav

Список групп можно проверить так:

cat /etc/group

должны присутствовать записи:

checkgroupamavis

Теперь приступим к конфигурации пакетов.

Настройка Clamav
Файл конфигурации находится по адресу /etc/clamav/clamd.conf
Clamav имеет оптимальные настройки по умолчанию, единственное изменение, которое следует сделать — установить значение AllowSupplementaryGroups true.

Вместе с основным сканером-демоном clamd также устанавливается файловый сканер clamscan, который amavis использует как резервный в случае отказа clamd.

Настройка Spamassassin
Файлы конфигурации хранятся в папке /etc/spamassassin
Обработку сообщений производит perl-скрипт spamd, работающий в качестве демона (постоянно «висит» в памяти).
Этот фильтр оценивает принятое сообщение на основе наборов правил, прибавляя баллы за каждое срабатывание очередного правила. При наборе определенного количества баллов сообщение помечается как спам и возвращается amavisу, который в нашем случае отправляет его на определенный адрес.
Набор правил от разработчиков скачивается командой sa-update и хранится в разделе /var/lib/spamassassin/3.xxx где 3.ххх-версия spamassassina. Дополнительно рекомендую скачать русскоязычные правила http://www.wentor.ru/articles/spamassassin/ и поместить их в ту же папку.

Далее открываем файл конфигурации /etc/spamassassin/local.cf и вносим следующие параметры:

#Добавляем русскоязычные наборы правил
include /var/lib/spamassassin/99_wentor.cf
include /var/lib/spamassassin/99_russian_common_re.cf

trusted_networks 192.168.

use_bayes 1
auto_learn 0

#Отключаем автообучение bayes, этой функцией часто пользуются спамеры
bayes_auto_learn 0

bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status

#Снижаем рейтинг некоторых, по моему мнению, слишком «жестких» правил, кроме того некоторые правила wentora срабатывают ошибочно, рейтинг для них 0-0.1
score ADVANCE_FEE_4_NEW_FRM_MNY 1.0
score ADVANCE_FEE_4_NEW_MONEY 1.0
score ANY_BOUNCE_MESSAGE 0.5
score FUZZY_XPILL 1.0
score BAYES_60 3.5
score BAYES_95 5.5
score BAYES_99 6.0
score BAYES_999 3.0
score CRBOUNCE_MESSAGE 0.5
score FSL_HELO_BARE_IP_2 0.1
score FREEMAIL_ENVFROM_END_DIGIT 0.5
score HK_RANDOM_FROM 2.0
score HTML_IMAGE_ONLY_08 2.0
score HTML_IMAGE_ONLY_12 2.0
score HTML_IMAGE_ONLY_20 2.0
score HTML_IMAGE_ONLY_24 2.0
score HTML_IMAGE_ONLY_28 2.0
score HTML_IMAGE_ONLY_32 2.0
score HTML_IMAGE_RATIO_02 1.5
score HTML_IMAGE_RATIO_04 1.8
score HTML_IMAGE_RATIO_06 2.0
score HTML_MESSAGE 0.0
score MIME_HTML_ONLY 1.723
score MANY_SPAN_IN_TEXT 0.5
score RCVD_IN_BL_SPAMCOP_NET 3.0
score RCVD_IN_BRBL_LASTEXT 1.0
score RCVD_IN_PSBL 3.7
score RCVD_IN_SBL_CSS 2.3
score SPF_FAIL 4.0
score SPF_SOFTFAIL 2.5
score SUBJ_ALL_CAPS 0.1
score TVD_SPACE_ENCODED 1.0
score TVD_SPACE_ENC_FM_MIME 1.0
score URI_OBFU_WWW 1.5
score URIBL_BLOCKED 0.1
score URIBL_JP_SURBL 2.25
score WEIRD_PORT 2.0
score RU_WENTOR_3GT 2.0
score RU_WENTOR_ADV 4.0
score RU_WENTOR_AUTO 2.0
score RU_WENTOR_BANKRUPT 3.5
score RU_WENTOR_BATH 4.0
score RU_WENTOR_BEG 5.0
score RU_WENTOR_BUILDING 2.5
score RU_WENTOR_BRAND 3.0
score RU_WENTOR_BUSINESS 2.0
score RU_WENTOR_BEAUTY 1.5
score RU_WENTOR_CLOCK 6.0
score RU_WENTOR_GOODS 3.0
score RU_WENTOR_GOD 7.0
score RU_WENTOR_HIDEPHONE 0.5
score RU_WENTOR_INFOINFILE 5.0
score RU_WENTOR_INVITE 2.0
score RU_WENTOR_LOTTERY 6.0
score RU_WENTOR_MOVE1 4.0
score RU_WENTOR_MOVE 1.0
score RU_WENTOR_MONEY 1.0
score RU_WENTOR_MONEY1 2.0
score RU_WENTOR_PRINT 4.0
score RU_WENTOR_RASSILKA 1.0
score RU_WENTOR_PHONE 1.5
score RU_WENTOR_RCPTS_3 0.1
score RU_WENTOR_RCPTS_4 0.1
score RU_WENTOR_RCPTS_5 0.1
score RU_WENTOR_RCPTS_6 1.0
score RU_WENTOR_RCPTS_7_10 0.0
score RU_WENTOR_RCPTS_10 1.0
score RU_WENTOR_SEO 4.0
score RU_WENTOR_SEX 0.1
score RU_WENTOR_SPAM_R 5.0
score RU_WENTOR_SPAM 4.0
score RU_WENTOR_SPAM1 1.0
score RU_WENTOR_SPAM2 3.0
score RU_WENTOR_TAX 3.0
score RU_WENTOR_TRAIN 2.5
score RU_WENTOR_URL 2.0
score RU_WENTOR_WORK 2.0

ifplugin Mail::SpamAssassin::Plugin::Shortcircuit

endif # Mail::SpamAssassin::Plugin::Shortcircuit

Что такое bayes-фильтр?
Это фильтр для поиска спама в сообщении. Он использует базы, полученные путем «обучения». Существуют 2 базы — spam (хранятся слова и фразы, полученные из спам-сообщений) и ham (тут слова и фразы, полученные из «нужных» сообщений). Сообщения для обучения выбираются самим администратором, таким образом формируется специфичные для вашей компании базы «нужных» и «ненужных» сообщений.
Обучение фильтра производится командами:

sa-learn —spam —mbox /var/mail/prospam
sa-learn —ham —mbox /var/mail/ham

где prospam и ham — почтовые ящики в формате mbox с «ненужными» и «нужными» сообщениями соответственно.
Фильтр «включается», набрав по 200 spam и ham сообщений. Понятно, что для поддержания актуальности баз фильтр нужно обучать постоянно.

Теперь приступим к самой сложной части:

Настройка Amavis

Конфигурационные файлы можно найти по адресу /etc/amavis/conf.d

В основном изменения коснутся файла 20-debian_defaults

$sa_tag2_level_deflt = 6.3; # Балл, при котором сообщение: -помечается как спам
$sa_kill_level_deflt = 6.3; # -блокируется

$final_virus_destiny = D_DISCARD; #Удалять сообщения с вирусом
$final_banned_destiny = D_REJECT; #Отбрасывать забаненные (см. ниже$banned_filename)
$final_spam_destiny = D_BOUNCE; #Откладывать спам
$final_bad_header_destiny = D_PASS; # С неправильным заголовком — лучше пропускать, бывают ложные срабатывания
$spam_quarantine_to = «spam\@domain.com»; #Отсылать спам в этот ящик

В разделе ниже занижаем спам-рейтинг для сайтов нужных нам рассылок, сюда добавляем общеизвестные домены, которые спамеры любят подставлять в качестве обратного адреса. Для корпоративных клиентов есть отдельная функция whitelist в другом разделе.

# ENVELOPE SENDER SOFT-WHITELISTING / SOFT-BLACKLISTING
@score_sender_maps = ({ # a by-recipient hash lookup table,

‘rabota.ru’ => -5.0,
‘spam@domain.com’ => -20.0,

Также в этом конфиге есть список $banned_filename, в котором перечислены расширения фалов, подлежащие блокировке. Если вы не хотите блокировать исполняемые файлы — либо отредактируйте этот список, либо измените параметр

$final_banned_destiny = D_REJECT; на $final_banned_destiny = D_PASS;

В файле /etc/amavis/conf.d/15-content_filter_mode убираем знак комментария # перед всеми строчками @bypass… и \%bypass…, чтобы включить проверки на вирусы и спам.

Для некоторых клиентов можно отключить проверку на спам и вирусы, таких пользователей заносим в «белый» список (whitelist). Также можно блокировать некоторые адреса без проверки (blacklist). Эти списки можно настроить, добавив следующие строчки в файл 50-user:

read_hash(\%whitelist_sender, ‘/etc/postfix/whitelist’);
read_hash(\%blacklist_sender, ‘/etc/postfix/blacklist’);

Пример файла /etc/postfix/whitelist:

client1@skynet.com
client2@umbrella.com
client3@doomsday.com

Если вы хотите задать более «мягкие» правила спам-фильтра для локальных клиентов, можно создать отдельную политику для локальных сетей.

Для этого добавляем локальные сети в файле /etc/amavis/conf.d/05-domain_d:

$mydomain = ‘domain.com’;
@local_domains_acl = ( «.$mydomain» );
@mynetworks = qw( 127.0.0.0/8 192.168.0.0/16);

а в файл /etc/amavis/conf.d/25-amavis_helpers добавляем политику «MYNETS»:

$policy_bank{‘MYNETS’} = { # mail originating from @mynetworks
originating => 1,
spam_tag_level_maps => -10.0,
spam_tag2_level_maps => 10.0,
spam_kill_level_maps => 10.0,
spam_dsn_cutoff_level_maps => 16.0,
};

В эту политику можно добавить и другие параметры, например список блокируемых расширений.

После внесения всех изменений перезагружаем сервисы:

/etc/init.d/clamav-daemon restart
/etc/init.d/spamassassin restart
/etc/init.d/amavis restart

и убеждаемся, что amavis подключил нашел и подключил фильтры:

cat /var/log/mail.log|grep amavis

Нас интересуют строчки:

spamassassinloaded

spamassassin найден,

amavisloadstate

антивирусный и антиспам фильтры активированы,

amavisclamavfound

основной и запасной антивирус подключены.

Если в логах не обнаружены ошибки — подключаем amavis к почтовому сервису postfix.

Подключение Amavis к Postfix

Коротко, как это работает: amavis при запуске открывает порт 10024 для приема сообщения от postfix. После приема и проверки сообщения amavis передает его (либо блокирует исходное сообщение и генерирует ответ) отдельному smtpd-серверу postfix, запущенному на порту 10025, далее Postfix пересылает сообщение адресату.

В файле /etc/postfix/main.cf указываем фильтр amavis:

content_filter = smtp-amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings

а в файле /etc/postfix/master.cf создаем дополнительный smtpd-сервер для приема сообщений от amavis:

smtp-amavis unix — — y — 6 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20

127.0.0.1:10025 inet n — y — — 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 strict_rfc821_envelopes=yes
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o receive_override_options=no_header_body_checks

Не забывайте пробелы перед -o, иначе postfix выдаст ошибку » bad field count»

Перезапускаем Postfix

/etc/init.d/postfix restart

и пробуем «прогнать» через него сообщение, например так:

echo ‘Test message’ > test
mail admin@mail.ru < test

и проверяем логи:

cat /var/log/mail.log

testamavislog

Записи говорят, что сообщение было отправлено фильтру 127.0.0.1:10024, а затем postfix попытался доставить его на mail.ru.

Теперь можно указать сервер как сервер пересылки и внимательно следить за ошибками в логах, например командой tail -f /var/log/mail.log

Если в карантин попало «нужное» письмо, его можно извлечь командой amavisd-release IDписьма. Оно будет извлечено из карантина и отправлено адресату мимо фильтров.

 

Немного добавлю про такую функцию amavis, как блокировка файлов по расширению.

В файле конфигурации 20-debian_defaults присутствуют строки:

$banned_filename_re = new_RE(
# qr’^UNDECIPHERABLE$’, # is or contains any undecipherable components

# block certain double extensions anywhere in the base name
qr’\.[^./]*\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)\.?$’i,

qr’\{[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}\}?$’i, # Windows Class ID CLSID, strict

qr’^application/x-msdownload$’i, # block these MIME types
qr’^application/x-msdos-program$’i,
qr’^application/hta$’i,

# qr’^application/x-msmetafile$’i, # Windows Metafile MIME type
# qr’^\.wmf$’, # Windows Metafile file(1) type

# qr’^message/partial$’i, qr’^message/external-body$’i, # rfc2046 MIME types

# [ qr’^\.(Z|gz|bz2)$’ => 0 ], # allow any in Unix-compressed
# [ qr’^\.(rpm|cpio|tar)$’ => 0 ], # allow any in Unix-type archives
# [ qr’^\.(zip|rar|arc|arj|zoo)$’=> 0 ], # allow any within such archives
# [ qr’^application/x-zip-compressed$’i => 0], # allow any within such archives

qr’.\.(Z|gz|bz2|tar|rpm|cpio|arc|zoo)$’i, # banned Unix-compressed
qr’.\.(ade|ace|adp|app|bas|bat|cab|chm|cmd|com|cpl|crt|emf|exe|fxp|grp|hlp|hta|
inf|ins|isp|jar|js|jse|lnk|lha|mda|mdb|mde|mdw|mdt|mdz|msc|msi|msp|mst|
ops|pcd|pif|prg|reg|scr|sct|shb|shs|tnef|vb|vbe|vbs|
wmf|wsc|wsf|wsh)$’ix, # banned ext — long

# qr’.\.(mim|b64|bhx|hqx|xxe|uu|uue)$’i, # banned extension — WinZip vulnerab.

qr’^\.(exe-ms)$’, # banned file(1) types
# qr’^\.(exe|lha|tnef|cab|dll)$’, # banned file(1) types
);

Это настройки, отвечающие за блокировку файлов с определенными расширениями, по умолчанию некоторые строки закомментированы. В этом примере приведены настройки с моего работающего сервера.

Что делать с такими файлами задается параметром $final_banned_destiny     = D_DISCARD; в начале конфига. Тут возможны варианты (D_DISCARD — блокировка без уведомления, D_REJECT — блокировка с уведомлением отправителя, D_PASS — пропуск файла).

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

Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .Z at /bin/uncompress
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .gz at /bin/gzip -d
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .bz2 at /bin/bzip2 -d
Oct 14 12:37:20 mx2 amavis[26910]: No ext program for .xz, tried: xzdec, xz -dc, unxz -c, xzcat
Oct 14 12:37:20 mx2 amavis[26910]: No ext program for .lzma, tried: lzmadec, xz -dc —format=lzma, lzma -dc, unlzma -c, lzcat, lzmadec
Oct 14 12:37:20 mx2 amavis[26910]: No ext program for .lrz, tried: lrzip -q -k -d -o -, lrzcat -q -k
Oct 14 12:37:20 mx2 amavis[26910]: No ext program for .lzo, tried: lzop -d
Oct 14 12:37:20 mx2 amavis[26910]: No ext program for .lz4, tried: lz4c -d
Oct 14 12:37:20 mx2 amavis[26910]: No ext program for .rpm, tried: rpm2cpio.pl, rpm2cpio
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .cpio at /bin/pax
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .tar at /bin/pax
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .deb at /usr/bin/ar
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .rar at /usr/bin/unrar-free
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .arj at /usr/bin/arj
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .arc at /usr/bin/arc
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .zoo at /usr/bin/zoo
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .doc at /usr/bin/ripole
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .cab at /usr/bin/cabextract
Oct 14 12:37:20 mx2 amavis[26910]: Internal decoder for .tnef
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .zip at /usr/bin/7za
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .kmz at /usr/bin/7za
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .7z at /usr/bin/7zr
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .xz at /usr/bin/7z
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .lzma at /usr/bin/7z
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .jar at /usr/bin/7z
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .swf at /usr/bin/7z
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .lha at /usr/bin/7z
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .iso at /usr/bin/7z
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .rpm at /usr/bin/7z
Oct 14 12:37:20 mx2 amavis[26910]: Found decoder for .exe at /usr/bin/unrar-free; /usr/bin/arj
Oct 14 12:37:20 mx2 amavis[26910]: No decoder for .F
Oct 14 12:37:20 mx2 amavis[26910]: No decoder for .lrz
Oct 14 12:37:20 mx2 amavis[26910]: No decoder for .lz4
Oct 14 12:37:20 mx2 amavis[26910]: No decoder for .lzo

Тут же перечислены утилиты, поиск которых производился (tried: lzop -d).

 

Всем удачного дня!

Поделиться ссылкой ...

Постоянная ссылка на это сообщение: http://ucblog.ru/%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0-%d0%b0%d0%bd%d1%82%d0%b8%d0%b2%d0%b8%d1%80%d1%83%d1%81%d0%bd%d0%be%d0%b9-%d0%b8-%d0%b0%d0%bd%d1%82%d0%b8%d1%81%d0%bf%d0%b0%d0%bc%d0%be%d0%b2/

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>