В этом посте будет заключительная серия по настройке почтового сервера с хранением сообщений в базе данных. В ней будет рассмотрены настройка антиспам фильтра на базе Spamassassin, утилиты RKhunter, предназначенной для поиска вредоносов путем проверки MD5 сумм, контроля неверных прав доступа и сигнатур закладок в модулях ядра, а также затронута настройка подсистемы аудита Auditd.
6 Антиспам фильтр на базе Spamassassin
6.1 Установка и настройка Spamassassin
Куда уж теперь без него? Иногда несусветно одолевают окоянные своими предложениями, просьбами, увещеваниями и прочей фигнёй. В качестве средства борьбы с этой напастью взят распространённый и уже проверенный временем Spamassassin.
Установка пакета Spamassassin:
yum install spamassassin
На совете в Филях было принято решение спам-фильтру работать с хранением информации по аналогии с почтовой программой, в смысле хранить данные в СУБД, поэтому с сайта были скачаны исходники таблиц awl_pg.sql, bayes_pg.sql, userpref_pg.sql для работы с PostgreSQL.
Для возможности работы с СУБД необходимо установить дополнительный модуль на Перл perl-DBD-Pg со всеми вытекающими по зависимостям, а так же модуль для нормальной работы Perl скриптов с UserAgent — perl-libwww-perl:
yum install -y perl-DBD-Pg perl-libwww-perl
Теперь можно создать пользователя, базы данных антиспама, саму базу данных и заполнить таблицы:
su postgres
psql -U postgres
CREATE USER zigzag WITH ENCRYPTED PASSWORD 'utiputi';
CREATE DATABASE paprica WITH OWNER zigzag;
GRANT ALL ON DATABASE paprica TO zigzag;
q
psql -U zigzag -h localhost paprica < /opt/spamassassin/awl_pg.sql
psql -U zigzag -h localhost paprica < /opt/spamassassin/bayes_pg.sql
psql -U zigzag -h localhost paprica < /opt/spamassassin/userpref_pg.sql
Основной конфигурационный файл Spamassassin приводится к следующему виду:
# These values can be overridden by editing ~/.spamassassin/user_prefs.cf
# (see spamassassin(1) for details)
# These should be safe assumptions and allow for simple visual sifting
# without risking lost emails.
required_hits 5
report_safe 0
rewrite_header Subject [SPAM]
ok_locales en ru
internal_networks 192.168.0.0/24
trusted_networks 192.168.0.
trusted_networks 192.168.17.
required_score 9.0
# Enable Bayes system
use_bayes 1
use_bayes_rules 1
# Autowhitelist
use_auto_whitelist 1
# Enable auto-learn Bayes system
bayes_auto_learn 1
# Enable and bisable checks network
skip_rbl_checks 1
bayes_auto_expire 1
# Connect to data base PostgreSQL
bayes_store_module Mail::SpamAssassin::BayesStore::SQL
auto_whitelist_factory Mail::SpamAssassin::SQLBasedAddrList
user_awl_dsn DBI:Pg:dbname=paprica;host=localhost
user_awl_sql_username zigzag
user_awl_sql_password utiputi
user_awl_sql_table awl
bayes_store_module Mail::SpamAssassin::BayesStore::PgSQL
bayes_sql_dsn DBI:Pg:dbname=paprica;host=localhost
bayes_sql_username zigzag
bayes_sql_override_username zigzag
bayes_sql_password utiputi
user_scores_dsn DBI:Pg:dbname=paprica;host=localhost
user_scores_sql_username zigzag
user_scores_sql_password utiputi
## Optional Score Increases
score SPF_FAIL 10.000
score SPF_HELO_FAIL 10.000
score BAYES_99 6.000
score BAYES_95 4.500
score BAYES_80 4.000
# White list from
whitelist_from localhost
whitelist_from *@kremlin.ru
whitelist_from *@test.com
whitelist_from *@fbi.cn
# Black list to
blacklist_to designer@test.com
blacklist_to postmaster@test.com
blacklist_to webmaster@test.com
blacklist_to mdaemon@test.com
blacklist_to root@test.com
blacklist_to info@test.com
blacklist_to secretar@test.com
blacklist_to Mailer-Daemon@test.com
blacklist_to system@test.com
blacklist_to support@test.com
blacklist_to director@test.com
# Black list from
blacklist_from designer@test.com
blacklist_from postmaster@test.com
blacklist_from webmaster@test.com
blacklist_from mdaemon@test.com
blacklist_from info@test.com
blacklist_from secretar@test.com
blacklist_from Mailer-Daemon@test.com
blacklist_from *@domosedam.net
blacklist_from *@trade.su
blacklist_from *@qip.ru
blacklist_from *@email.ru
blacklist_from *@subcribe.ru
# DCC - perform DCC message checks.
#
# DCC is disabled here because it is not open source. See the DCC
# license for more details.
#
#loadplugin Mail::SpamAssassin::Plugin::DCC
# Pyzor - perform Pyzor message checks.
#
###loadplugin Mail::SpamAssassin::Plugin::Pyzor
# Razor2 - perform Razor2 message checks.
#
###loadplugin Mail::SpamAssassin::Plugin::Razor2
# SpamCop - perform SpamCop message reporting
#
loadplugin Mail::SpamAssassin::Plugin::SpamCop
# AntiVirus - some simple anti-virus checks, this is not a replacement
# for an anti-virus filter like Clam AntiVirus
#
#loadplugin Mail::SpamAssassin::Plugin::AntiVirus
# AWL - do auto-whitelist checks
#
loadplugin Mail::SpamAssassin::Plugin::AWL
# AutoLearnThreshold - threshold-based discriminator for Bayes auto-learning
#
loadplugin Mail::SpamAssassin::Plugin::AutoLearnThreshold
# TextCat - language guesser
#
loadplugin Mail::SpamAssassin::Plugin::TextCat
# AccessDB - lookup from-addresses in access database
#
loadplugin Mail::SpamAssassin::Plugin::AccessDB
# WhitelistSubject - Whitelist/Blacklist certain subject regular expressions
#
loadplugin Mail::SpamAssassin::Plugin::WhiteListSubject
####################################################################
# experimental plugins
# DomainKeys - perform DomainKeys verification
#
# This plugin has been removed as of v3.3.0. Use the DKIM plugin instead,
# which supports both Domain Keys and DKIM.
# MIMEHeader - apply regexp rules against MIME headers in the message
#
loadplugin Mail::SpamAssassin::Plugin::MIMEHeader
# ReplaceTags
#
loadplugin Mail::SpamAssassin::Plugin::ReplaceTags
Файл /etc/sysconfig/spamassassin приводится к следущему виду:
## Options to spamd (default)
SPAMDOPTIONS="-d -c -m5 -H -l -q -Q -x -s /var/log/spamassassin.log --round-robin --socketpath=/var/run/spamassassin/spamd.sock"
Остальные конфигурационные файлы Spamassassin без изменений.
6.2 Настройки SELinux для Spamassassin
Поскольку Spamassassin будет использовать подключение к сети для соединения с СУБД и с МТА, в правилах SELinux разрешаем использовать сеть:
setsebool -P spamassassin_can_network on
Т. к. использование дополнительных приложений к Spamassassin таких как Razor и Pazor не предполагается, то доступ к файловой системе (пользовательским папкам этих приложений) будет лишним:
setsebool -P spamd_enable_home_dirs off
Запуск и, если всё прошло нормально:
/etc/init.d/spamassassin start
Где-то под руками имелась небольшая коллекция спама, который сразу же пошёл в дело на обучение:
sa-learn --spam -u zigzag /opt/spamassassin/spam/
Learned tokens from 1467 message(s) (1532 message(s) examined)
И небольшая горстка нормальных (не спам) писем:
sa-learn --ham -u zigzag /opt/spamassassin/ham/
Learned tokens from 743 message(s) (743 message(s) examined)
Если никаких нареканий не выскакивало, можно добавить спам-фильтр в автозагрузку:
chkconfig --level 35 spamassassin on
7 Rkhunter
Казалось бы, имеется сервер на базе ОС Linux (CentOS), имеются небольшие вкрапления настроечек SELinux и даже есть антиспам… И теперь можно спать (за рабочим столом) спокойно. Но увы. Разбойники со злодеями всех компьютерных мастей так и норовят преподнести неприятный сюрприз. Чтобы сей подарок не был таким уж внезапным, а так же не было скучно, решено установить специализированную утилиту rootkit детектор Rkhunter:
yum install rkhunter
В конфигурационном файле следует указать почтовый адрес, на который должны сыпаться предупреждения. То есть исправить строку в файле /etc/rkhunter.conf:
MAIL-ON-WARNING="<п/я>"
Для пущего счастья в том же файле можно раскомментировать строки:
TMPDIR=/var/lib/rkhunter/tmp
DBDIR=/var/lib/rkhunter/db
LANGUAGE=en
LOGFILE=/var/log/rkhunter.log
SSH_CONFIG_DIR=/etc/ssh
Создать директорию /var/lib/rkhunter/tmp с красивым контекстом:
mkdir /var/lib/rkhunter/tmp
chcon -u system_u /var/lib/rkhunter/tmp
restorecon -v /var/lib/rkhunter/tmp
Обновить базу утилиты:
rkhunter --update
Выполнить проверку системы:
rkhunter -c --update --noappend-log --vl
Во время проверки будут появляться приглашения нажать Enter. Смотрим на вывод в консоли и делаем выводы в голове.
Можно добавить в cron обновление базы утилиты rkhunter и проверку системы:
0 23 * * 1 /usr/bin/sudo rkhunter --update --cronjob
30 23 * * * /usr/bin/sudo rkhunter --check --cronjob
8 Настройка системы аудита
Как бы не было много утилит для обеспечения безопасности, всё равно требуется вести учёт изменений в системе. Аудит производится на уровне системных вызовов. Простая настройка системы аудита осуществляется в файле /etc/audit/audit.rules:
# This file contains the auditctl rules that are loaded
# whenever the audit daemon is started via the initscripts.
# The rules are simply the parameters that would be passed
# to auditctl.
# First rule - delete all
-D
# Increase the buffers to survive stress events.
# Make this bigger for busy systems
-b 8192
# Feel free to add below this line. See auditctl man page
# Что делать в чрезвычайной ситуации, например, если все буферы будут заполнены
# (1 – поместить сообщение в dmesg)
-f 1
# System files
-w /etc/audit/
-w /etc/audit/auditd.conf -p wa
-w /etc/audit/audit.rules -p wa
-w /etc/passwd -p wa
-w /etc/group -p wa
-w /etc/shadow -p wa
-w /etc/libaudit.conf -p wa
-w /etc/localtime -p wa
-w /etc/sysctl.conf -p wa
-w /etc/modprobe.d/
-w /etc/sysconfig/
-w /etc/pam.d/
-w /etc/pki/
-w /etc/exim/
-w /etc/exim/exim.conf -p wa
-w /etc/exim/trusted-configs
-w /etc/crontab -p wa
-w /etc/dbmail.conf -p wa
-w /etc/mdadm.conf -p wa
-w /etc/rkhunter.conf -p wa
-w /etc/sestatus.conf -p wa
# Services
-w /etc/rc.d/init.d/
-w /etc/rc.d/init.d/auditd -p wa
-w /etc/ssh/sshd_config -p wa
# Network
-w /etc/rc.d/init.d/iptables -p wax
-w /etc/hosts -p wa
# Logs files
-w /var/log/audit/
-w /var/log/audit/audit.log -p wa
-w /var/log/secure -p wa
-w /var/log/rkhunter/rkhunter.log -p wa
-w /var/log/maillog -p wa
-w /var/log/messages -p wa
Запустить сервис и добавить в автозагрузку:
/etc/init.d/auditd start
chkconfig auditd on
Если есть какие-то свои представления, то можно добавить своих правил и ещё подкрутить настройки в файле /etc/audit/audit.conf.
Теперь можно использовать для анализа зловредстования SELinux данные из файла аудита. Например, посмотреть какие в системе есть блокировки и чем они вызваны:
audit2allow -w -a -r -v
Если вывод довольно большой и имеется множество блокировок от различных процессов, то для рассмотрения блокировки какого-то из процессов применить команду grep:
grep exim /var/log/audit/audit.log | audit2allow -w -a -r -v
Чтобы посмотреть правило Type Enforcement разрешающее блокированный доступ:
audit2allow -a
Для применения правила, показанного командой audit2allow -a, выполнить команду:
audit2allow -a -M <имя модуля>
Опцией -М будет создан файл типа Type Enforcement (.te) в текущем каталоге с указанным именем модуля. Помимо этого audit2allow скомпилирует правила Type Enforcement в пакет политики (.pp). Теперь для инсталляции модуля следует выполнить команду:
semodule -i <имя модуля>
Проверка работы после инсталляции модуля выполняется с помощью утилиты из пакета setools-libs-tcl:
seaudit-report /var/log/audit/audit.log
Если требуется создать индивидуальную политику для определённого процесса, для сужения вывода от выполнения команды audit2allow можно использовать команду grep:
grep exim /var/log/audit/audit.log | audit2allow -M exim
Здесь следует обратить внимание на тот момент, что модули созданные с помощью утилиты audit2allow могут предоставлять больше доступа чем требуется и даже иногда носить совершенно инопланетный характер. Поэтому лучше её работу дополнять утилитой ausearch. Например, посмотреть те же блокировки exim за последние 10 минут:
ausearch -m avc -ts recent -c exim
Для перезагрузки политик SELinux, чтобы не перезапускать компьютер следует выполнить:
semodule -R
Автор: