Почтовый сервер с хранением данных в PostgreSQL (окончание)

в 18:36, , рубрики: linux, администрирование linux-систем, Серверное администрирование

В этом посте будет заключительная серия по настройке почтового сервера с хранением сообщений в базе данных. В ней будет рассмотрены настройка антиспам фильтра на базе 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 приводится к следующему виду:

Содержимое файла /etc/mail/spamassassin/local.cf

# 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

Содержимое файла v310.pre

# 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:

Содержимое файла 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

Автор:

Источник

Поделиться

* - обязательные к заполнению поля