Почтовый сервер с хранением данных в PostgreSQL (окончание)
В этом посте будет заключительная серия по настройке почтового сервера с хранением сообщений в базе данных. В ней будет рассмотрены настройка антиспам фильтра на базе Spamassassin, утилиты RKhunter, предназначенной для поиска вредоносов путем проверки MD5 сумм, контроля неверных прав доступа и сигнатур закладок в модулях ядра, а также затронута настройка подсистемы аудита Auditd.6 Антиспам фильтр на базе Spamassassin6.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