Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
CBPolicyD является универсальным инструментом для управления политиками в Postfix. Он входит в комплект поставки Zimbra OSE и ранее мы рассказывали о том, как настраивать CBPolicyD на своем почтовом сервере и создавать в нем различные политики, которые позволяют повысить уровень защищенности сервера от кибератак. Однако все данные ранее рекомендации были применимы к односерверной инфраструктуре Zimbra OSE, так как CBPolicyD по умолчанию использует автономную СУБД SQLite 3 для хранения и управления политиками, а это означает, что созданная на одном сервере политика не будет иметь силы на другом сервере и каждый раз для внедрения новой политики, администратору придется создавать ее на каждом сервере MTA. В случае с односерверной инфраструктурой это допустимо, однако когда речь идет о мультисерверной инфраструктуре Zimbra OSE, необходимо чтобы созданная политика применялась сразу на всех MTA. Это облегчает не только процесс создания политик, но и процесс управления ими. Для того, чтобы созданная политика автоматически применялась на всех MTA в инфраструктуре, необходимо подключить ее к глобальной СУБД MariaDB. Плюсом использования MariaDB является то, что эта СУБД более отказоустойчива, чем SQLite 3. То есть при больших нагрузках на MTA CBPolicyD гарантированно не будет пропускать письма, не соответствующие настроенным политикам. В данной статье мы расскажем о том, как это сделать.
Данная инструкция описывает настройку в инфраструктуре Zimbra OSE с несколькими серверами MTA. Для того, чтобы подключить CBPolicyD на всех MTA к единой СУБД MariaDB, мы добавим в инфраструктуру Zimbra OSE выделенный сервер, на котором установим копию MariaDB и настроим ее в качестве бэкенда ко всем CBPolicyD в инфраструктуре.
Для выделенного сервера сервера MariaDB, с учетом запущенной на нем Ubuntu Server, потребуются два ядра vCPU, 4 Гб оперативной памяти, а также около 20 Гб на диске. Для установки MariaDB выполните на сервере следующие команды:
sudo apt install mariadb-server
sudo /usr/bin/mysql_secure_installation
В файле /etc/mysql/mariadb.conf.d/50-server.cnf поменяйте значение строки port на 7306, а также закомментируйте строку bind-address
Изложенные ниже инструкции по подключению CBPolicyD к единой СУБД MariaDB необходимо выполнить на каждом сервере MTA. После того как все PolicyD в инфраструктуре будут подключены к единой СУБД, созданные на одном из серверов политики будут автоматически распространяться на всю инфраструктуру Zimbra OSE. Выделенный узел MariaDB в нашем случае имеет доменное имя mysql.example.ru и IP-адрес 192.168.0.104, а сервер MTA - mta.example.ru и 192.168.0.105.
Для подключения CBPolicyD к серверу с MariaDB, в первую очередь необходимо на выделенном сервере MariaDB привязать порт 7306/TCP к IP-адресу 0.0.0.0. Для этого отредактируйте файл /opt/zimbra/conf/my.cnf на сервере MTA и приведите соответствующую строку к виду: bind-address=0.0.0.0.
После этого необходимо создать на сервере MariaDB базу данных под названием “policyd_db” и пользователя “ad-policyd_db”. Делается это при помощи следующих команд:
mysql
MariaDB [(none)]> create database policyd_db CHARACTER SET 'UTF8';
MariaDB [(none)]> create user 'ad-policyd_db'@'127.0.0.1' identified by 'P@ssw0rD';
MariaDB [(none)]> grant all privileges on policyd_db.* to 'ad-policyd_db'@'192.168.0.105' identified by 'P@ssw0rD' with grant option;
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> quit;
Вместо адреса 192.168.0.105 подставьте адрес своего сервера MTA, на котором выполняется команда, а вместо P@ssw0rD укажите собственный пароль.
После этого сконвертируйте используемые CBPolicyD базы данных SQLite 3 в совместимый с MariaDB формат при помощи команд:
cd /opt/zimbra/common/share/database/
POLICYDTABLESSQL="$(mktemp /tmp/policyd-dbtables.XXXXXXXX.sql)"
for i in core.tsql access_control.tsql quotas.tsql amavis.tsql checkhelo.tsql checkspf.tsql greylisting.tsql accounting.tsql;
do
./convert-tsql mysql $i;
done > "${POLICYDTABLESSQL}"
В результате исполнения данного скрипта в папке /tmp появится файл с обфусцированным названием. В нашем случае это policyd-dbtables.QDyeA7WR.sql. Синхронизируйте полученный файл с почтовым сервером. Сделать это можно при помощи утилиты RSync: rsync /tmp/policyd-dbtables.QDyeA7WR.sql root@192.168.0.104:/tmp/.
После этого потребуется заполнить базу данных policy_db на сервере с MariaDB. Для этого импортируем в нее данные из скопированного ранее файла:
mysql policyd_db < /tmp/policyd-dbtables.QDyeA7WR.sql
mysql
MariaDB [(none)]> show databases;
MariaDB [(none)]> use policyd_db;
MariaDB [(none)]> show tables;
MariaDB [(none)]> quit;
Теперь настроим cbpolicyd так, чтобы он использовал Zimbra MySQL. Для этого введем на сервере MTA следующие команды:
echo "Setting username in /opt/zimbra/conf/cbpolicyd.conf.in"
grep -lZr -e ".*sername=.*$" "/opt/zimbra/conf/cbpolicyd.conf.in" | xargs -0 sed -i "s^.*sername=.*$^Username=ad-policyd_db^g"
echo "Setting password in /opt/zimbra/conf/cbpolicyd.conf.in"
grep -lZr -e ".*assword=.*$" "/opt/zimbra/conf/cbpolicyd.conf.in" | xargs -0 sed -i "s^.*assword=.*$^Password='P@ssw0rD^g"
echo "Setting database in /opt/zimbra/conf/cbpolicyd.conf.in"
grep -lZr -e "DSN=.*$" "/opt/zimbra/conf/cbpolicyd.conf.in" | xargs -0 sed -i "s^DSN=.*$^DSN=DBI:mysql:database=policyd_db;host=192.168.0.104;port=7306^g"
На сервере MariaDB настроим политики квотирования:
POLICYDPOLICYSQL="$(mktemp /tmp/policyd-dbtables.QDyeA7WR.sql)"
cat <<EOF > "${POLICYDPOLICYSQL}"
INSERT INTO policies (ID, Name,Priority,Description) VALUES(6, 'Zimbra CBPolicyd Policies', 0, 'Zimbra CBPolicyd Policies');
INSERT INTO policy_members (PolicyID,Source,Destination) VALUES(6, 'any', 'any');
INSERT INTO quotas (PolicyID,Name,Track,Period,Verdict,Data) VALUES (6, 'Sender:user@domain','Sender:user@domain', 60, 'DEFER', 'You are sending too many emails.');
INSERT INTO quotas (PolicyID,Name,Track,Period,Verdict) VALUES (6, 'Recipient:user@domain', 'Recipient:user@domain', 60, 'REJECT');
INSERT INTO quotas_limits (QuotasID,Type,CounterLimit) VALUES(3, 'MessageCount', 100);
INSERT INTO quotas_limits (QuotasID,Type,CounterLimit) VALUES(4, 'MessageCount', 125);
EOF
/opt/zimbra/bin/mysql policyd_db < "${POLICYDPOLICYSQL}"
Убедитесь, что на сервере MTA включен и работает CBPolicyD. Сделать это можно с помощью следующих команд:
sudo su - zimbra
zmprov ms `zmhostname` +zimbraServiceEnabled cbpolicyd
zmprov ms `zmhostname` zimbraCBPolicydQuotasEnabled TRUE
zmcontrol restart
Просмотреть логи работы CBPolicyD можно с помощью команды tail -f /opt/zimbra/log/cbpolicyd.log.
Еще один нюанс, связанный с выносом базы данных на отдельный сервер, связан с возможностью его отказа. По умолчанию в Zimbra, если CBPolicyD не может провести проверку письма на соответствие заданным политикам, в том числе и из-за недоступной по тем или иным причинам базы данных. Для того, чтобы в случае отказа сервера MariaDB письма продолжали приходить и отправляться, измените настройку zimbraCBPolicydBypassMode при помощи команды zmprov mcf zimbraCBPolicydBypassMode pass. Чтобы вернуть значение этой настройки к изначальному, введите zmprov mcf zimbraCBPolicydBypassMode tempfail.
Также для создания единой базы данных CBPolicyD можно использовать СУБД MariaDB на одном из почтовых серверов. В таком случае в качестве адреса сервера MariaDB следует указывать адрес почтового сервера, а все связанные с настройкой СУБД команды выполнять от имени пользователя Zimbra. Однако мы не рекомендуем такой подход, так как это создает для системы риски несопоставимые с экономией на выделенном виртуальном сервере.
Еще одним актуальным вопросом при использовании CBPolicyD в мультисерверном режиме является защита входа в веб-консоль. Напомним, что в случае односерверной установки этот вопрос решался ограничением входа только с IP-адреса сервера, чтобы исключить несанкционированный доступ к CBPolicyD. В случае же мультисерверной инфраструктуры наиболее разумным будет открыть доступ к веб-интерфейсу CBPolicyD из всей локальной сети, а вход в него защитить с помощью пароля.
Для того, чтобы установить пароль на вход в CBPolicyD, необходимо от имени root-пользователя отредактировать файл sudo nano /opt/zimbra/common/share/webui/.htaccess, добавив в него строки:
AuthUserFile /opt/zimbra/common/share/webui/.htpasswd
AuthGroupFile /dev/null
AuthName "User and Password"
AuthType Basic
require valid-user
Затем создаем файл с именем пользователя и паролем при помощи команд:
sudo touch /opt/zimbra/common/share/webui/.htpasswd
sudo /opt/zimbra/common/bin/htpasswd -cb .htpasswd cbpolicyd-admin P@ssw0rD
И редактируем файл конфигурации sudo nano /opt/zimbra/conf/httpd.conf, добавляя в него следующие строки:
alias /webui /opt/zimbra/common/share/webui/
<Directory /opt/zimbra/common/share/webui/>
AllowOverride AuthConfig
Order Deny,Allow
Allow from all
</Directory>
После того как файл с изменениями будет сохранен, перезапустите сервер Apache, выполнив от имени пользователя zimbra команду zmapachectl restart. После этого при входе в веб-интерфейс управления CBPolicyD будет появляться окно ввода логина и пароля.
По всем вопросам, связанными c Zextras Suite и Team Pro вы можете обратиться к Представителю компании «Zextras Technology» Екатерине Триандафилиди по электронной почте ekaterina.triandafilidi@zextras.com