Application: "Zimbra Collaboration Suite (ZCS) 8.8.15 Open Source Edition (OSE)".
Задача: развернуть почтовую систему на базе программного комплекса для организации совместной деятельности рабочих групп "Zimbra", воспользовавшисья лишь функционалом обработки электронной почты.
Учитывая то, что "Zimbra" полностью построена на базе программных продуктов с открытым программным кодом, за несущую систему и компоненты не требуется лицензионных отчислений и сервисом можно бесплатно воспользоваться, если не требуется отдельно приобретаемых возможностей вроде кластеризации или поддержки команды технического сопровождения. При этом, несмотря на практическую бесплатность, функционально "Zimbra" призвана обеспечить замену "Microsoft Exchange".
Последовательность дальнейших действий такова:
1. Подготовка системного окружения (отдельная инструкция).
2. Адаптирование системного окружения для "Zimbra".
3. Установка программного комплекса "Zimbra".
4. Поверхностная настройка "Zimbra" в web-интерфейсе.
5. Мелкие доработки CLI-напильником.
6. Простейшее резервное копирование корреспонденции.
7. Ограничение сетевых подключений извне.
2. Адаптирование системного окружения для "Zimbra".
3. Установка программного комплекса "Zimbra".
4. Поверхностная настройка "Zimbra" в web-интерфейсе.
5. Мелкие доработки CLI-напильником.
6. Простейшее резервное копирование корреспонденции.
7. Ограничение сетевых подключений извне.
Компоненты "Zimbra CS".
Серверная часть "Zimbra Server" написана на "Java", может работать SMTP/POP3/IMAP-серверами, и базируется на нескольких OpenSource-проектах, среди которых "Jetty", "Apache Lucene", "OpenLDAP", "MySQL", "Postfix", "Nginx", "ClamAV", "SpamAssassin", "Amavisd", "Aspell" и ряд компонентов на "Perl".
Условно комплекс "Zimbra" делится на следующие компоненты:
1. "Zimbra Core" - набор библиотек, утилит и базовых конфигурационных файлов.
2. "Zimbra Store" - собственно сам почтовый сервер ("Jetty" и "Java"), контроллер следующих подсистем передачи и хранения данных:
2.1. "Data store" - реляционная база данных ("MySQL"), хранящая все метаданные сообщений;
2.2. "Message store" - файловое хранилище, предназначенное для электронных писем (в формате MIME) и вложений в таковые;
2.3. "Index store" - индексные файлы для полнотекстового поиска в содержимом писем ("Apache Lucene").
3. "Zimbra LDAP" - каталог сведений о пользователях, а также инструмент их аутентификации ("OpenLDAP").
4. "Zimbra MTA" - SMTP-сервер ("Postfix") и локальный доставщик (LMTP), включая антивирусный ("ClamAV") и антиспам-обработчики ("SpamAssassin").
5. "Zimbra SNMP" - наблюдающая за выводом в "syslog" подсистема, отправляющая SNMP-уведомления сервисам мониторинга.
6. "Zimbra Logger" - подсистема аккумулирования журналов и создания статистических отчетов.
7. "Zimbra Spell" - дополнение для проверки правописания ("Aspell"), используемая в web-клиенте.
8. "Zimbra Proxy & Memcached" - подсистема проксирования ("Nginx"), позволяющая гибче управлять потоками запросов.
2. "Zimbra Store" - собственно сам почтовый сервер ("Jetty" и "Java"), контроллер следующих подсистем передачи и хранения данных:
2.1. "Data store" - реляционная база данных ("MySQL"), хранящая все метаданные сообщений;
2.2. "Message store" - файловое хранилище, предназначенное для электронных писем (в формате MIME) и вложений в таковые;
2.3. "Index store" - индексные файлы для полнотекстового поиска в содержимом писем ("Apache Lucene").
3. "Zimbra LDAP" - каталог сведений о пользователях, а также инструмент их аутентификации ("OpenLDAP").
4. "Zimbra MTA" - SMTP-сервер ("Postfix") и локальный доставщик (LMTP), включая антивирусный ("ClamAV") и антиспам-обработчики ("SpamAssassin").
5. "Zimbra SNMP" - наблюдающая за выводом в "syslog" подсистема, отправляющая SNMP-уведомления сервисам мониторинга.
6. "Zimbra Logger" - подсистема аккумулирования журналов и создания статистических отчетов.
7. "Zimbra Spell" - дополнение для проверки правописания ("Aspell"), используемая в web-клиенте.
8. "Zimbra Proxy & Memcached" - подсистема проксирования ("Nginx"), позволяющая гибче управлять потоками запросов.
Адаптирование системного окружения для "Zimbra".
Кроме общесистемных утилит и библиотек для работы "Zimbra" в обязательном порядке требуются утилиты "Netcat" и SUDO, а также библиотеки преобразований доменных имён, разбора регулярных выражений, разбора XML и вычислений с плавающей запятой:
# aptitude install --without-recommends netcat-openbsd sudo libidn11 libpcre3 libexpat1 libgmp3-dev
Компоненты "Zimbra" взаимодействуют между собой через сеть и для их корректной работы очень важна корректная адресация задействуемых сетевых узлов. Часть компонентов работает только через сетевую "локальную петлю", потому кроме регистрации FQDN нашего почтового сервера в глобальной системе DNS потребуется сопоставить выбранное имя сервиса (для унификации желательно, чтобы оно совпадало с FQDN, по которому к сервису будут обращаться клиенты) с адресом "локальной петли" в системной таблице:
# vi /etc/hosts
127.0.0.1 localhost
....
# Zimbra Instance
127.0.0.1 mail.example.net mail
....
# Zimbra Instance
127.0.0.1 mail.example.net mail
Программные компоненты "Zimbra" очень, ну очень часто, хоть и немного по объёму пишут в локальную файловую систему, и ещё чаще оттуда читают. Заранее полезно озаботиться вынесением директорий с постоянно используемыми пользовательскими и служебными данным в отдельную файловую систему, выдав её максимально скоростной физический носитель и смонтировав с опциями минимизации задержек IO-операций.
Заготавливаем оптимизируемую структуру данных в директории "Zimbra" (заранее известную):
# mkdir -p /opt/zimbra /opt/zimbra/data /opt/zimbra/db /opt/zimbra/index /opt/zimbra/logger /opt/zimbra/store
Заготавливаем директории, предназначенные для хранения данных на выделенном носителе:
# mkdir -p /mnt/zimbra /mnt/zimbra/data /mnt/zimbra/db /mnt/zimbra/index /mnt/zimbra/logger /mnt/zimbra/store
Монтируем в неё выделенный том, после чего связываем его "жёсткими" ссылками со структурой директорий "Zimbra":
# vi /etc/fstab
....
# Zimbra Data Volume
/dev/sdb1 /mnt/zimbra ext4 rw,noatime,nodiratime 0 2
# Zimbra Data Dirs
/mnt/zimbra/data /opt/zimbra/data none bind 0 0
/mnt/zimbra/db /opt/zimbra/db none bind 0 0
/mnt/zimbra/index /opt/zimbra/index none bind 0 0
/mnt/zimbra/logger /opt/zimbra/logger none bind 0 0
/mnt/zimbra/store /opt/zimbra/store none bind 0 0
# Zimbra Data Volume
/dev/sdb1 /mnt/zimbra ext4 rw,noatime,nodiratime 0 2
# Zimbra Data Dirs
/mnt/zimbra/data /opt/zimbra/data none bind 0 0
/mnt/zimbra/db /opt/zimbra/db none bind 0 0
/mnt/zimbra/index /opt/zimbra/index none bind 0 0
/mnt/zimbra/logger /opt/zimbra/logger none bind 0 0
/mnt/zimbra/store /opt/zimbra/store none bind 0 0
Монируем том и директории с данными:
# mount /mnt/zimbra
# mount /mnt/zimbra/data
# mount /mnt/zimbra/db
# mount /mnt/zimbra/index
# mount /mnt/zimbra/logger
# mount /mnt/zimbra/store
# mount /mnt/zimbra/data
# mount /mnt/zimbra/db
# mount /mnt/zimbra/index
# mount /mnt/zimbra/logger
# mount /mnt/zimbra/store
Установка программного комплекса "Zimbra".
"Zimbra CS" представляется в двух основных редакциях:
1. "Zimbra Collaboration Open Source" - бесплатаная, содержащая весь основной функционал.
2. "Zimbra Collaboration Network Edition" - платная (поддерживает кластеризацию).
2. "Zimbra Collaboration Network Edition" - платная (поддерживает кластеризацию).
Для нашей простой задачи запуска почтового сервера более чем достаточно бесплатного варианта, который можно загрузить с сайта разработчиков ( https://www.zimbra.com/downloads/ ) после ни к чему не обязывающей регистрации.
Далее речь о развёртывании из дистрибутива "Zimbra Collaboration OS 8.8.15 GA Release for Ubuntu 18.04 LTS".
Распаковываем загруженный на несущий сервер архив и запускаем инсталляцию:
# cd /usr/src
# tar -xf ./zcs-8...tgz -C ./
# cd /usr/src/zcs-8...
# ./install.sh
# tar -xf ./zcs-8...tgz -C ./
# cd /usr/src/zcs-8...
# ./install.sh
Скрипт инсталляции проверит несущую операционную систему на соответствие требованиям, задаст несколько вопросов и произведёт установку программного комплекса с последующим обязательным требованием установки пароля администратора сервиса. Процесс интерактивен, отмечаю лишь ключевые этапы:
....
Do you agree with the terms of the software license agreement? [N] Y
....
Use Zimbra's package repository [Y] Y
....
Would you like to delete /opt/zimbra before installing? [N] N
....
Select the packages to install:
Install zimbra-ldap [Y] Y
Install zimbra-logger [Y] Y
Install zimbra-mta [Y] Y
Install zimbra-dnscache [Y] N
Install zimbra-snmp [Y] N
Install zimbra-store [Y] Y
Install zimbra-apache [Y] Y
Install zimbra-spell [Y] N
Install zimbra-memcached [Y] Y
Install zimbra-proxy [Y] Y
Install zimbra-drive [Y] N
Install zimbra-imapd (BETA) [N] Y
Install zimbra-chat [Y] N
....
The system will be modified. Continue? [N] Y
Beginning Installation...
....
Initializing core config...
....
Starting servers...done.
....
Notify Zimbra of your installation? [Yes] No
Notification skipped
....
Configuration complete
Do you agree with the terms of the software license agreement? [N] Y
....
Use Zimbra's package repository [Y] Y
....
Would you like to delete /opt/zimbra before installing? [N] N
....
Select the packages to install:
Install zimbra-ldap [Y] Y
Install zimbra-logger [Y] Y
Install zimbra-mta [Y] Y
Install zimbra-dnscache [Y] N
Install zimbra-snmp [Y] N
Install zimbra-store [Y] Y
Install zimbra-apache [Y] Y
Install zimbra-spell [Y] N
Install zimbra-memcached [Y] Y
Install zimbra-proxy [Y] Y
Install zimbra-drive [Y] N
Install zimbra-imapd (BETA) [N] Y
Install zimbra-chat [Y] N
....
The system will be modified. Continue? [N] Y
Beginning Installation...
....
Initializing core config...
....
Starting servers...done.
....
Notify Zimbra of your installation? [Yes] No
Notification skipped
....
Configuration complete
После неспешного запуска гирлянды из СУБД "MySQL", "Memcached", LDAP, сервисов антивирусной проверки и защиты от "спама", тяжеловесных web-приложений на "Java", множества служебных perl-приложений и фронтального web/mail-прокси "Nginx" почтовая система "Zimbra" будет доступна для использования через web-интерфейс:
https://mail.example.net - интерфейс пользователя.
https://mail.example.net:7071 - интерфейс администратора.
https://mail.example.net:7071 - интерфейс администратора.
Поверхностная настройка "Zimbra" в web-интерфейсе.
Практически всё, что требуется для начала работы с почтовым сервисом "Zimbra" доступно через web-интерфейс.
Сразу отключаем функционал организации индивидуального и группового рабочего процесса "Briefcase", "Task" и "Calendar" - здесь мы запускаем только почтовый сервер, а все эти компоненты лишь будут зря расходовать ресурсы:
Admin -> Home -> Configure -> Class of Service -> default -> Features:
Major Features:
....
Calendar: off
Tasks: off
Briefcase: off
General Features:
Tagging: off
Sharing: off
External sharing: off
Public sharing: off
....
Manage Zimlets: off
....
Global Address List access: off
....
Import: off
Export: off
....
Mail Features:
....
External IMAP access: off
External POP access: off
....
Out of office reply: off
....
Persona: off
....
Major Features:
....
Calendar: off
Tasks: off
Briefcase: off
General Features:
Tagging: off
Sharing: off
External sharing: off
Public sharing: off
....
Manage Zimlets: off
....
Global Address List access: off
....
Import: off
Export: off
....
Mail Features:
....
External IMAP access: off
External POP access: off
....
Out of office reply: off
....
Persona: off
....
Отключаем ненужные абсолютному большинству пользователей плагины:
Admin -> Home -> Configure -> Zimlets:
....
Archive: off
Phone: off
....
WebEx: off
Yahoo! Emoticons: off
....
Archive: off
Phone: off
....
WebEx: off
Yahoo! Emoticons: off
Сразу после применения изменений в политике web-интерфейс пользователя приобретёт существенно более аскетичный вид, видимо поддерживающие только почтовые функции.
Переводим интерфейс на русский язык, попутно отключая загрузку внешних изображений в почтовых сообщениях:
Admin -> Home -> Configure -> Class of Service -> default -> Preferences:
General Options:
....
Language: Russian - Русский
Mail Options:
....
Display external images in HTML email: off
....
General Options:
....
Language: Russian - Русский
Mail Options:
....
Display external images in HTML email: off
....
Для каждого обслуживаемого почтового сервера запускается масса сопутствующих сервисов - отключаем ненужные:
Admin -> Home -> Configure -> Servers -> mail.example.net -> Services:
....
Policyd: off
SNMP: off
....
Spell Checker: off
....
....
Policyd: off
SNMP: off
....
Spell Checker: off
....
Полезно уточнить, в каком месте файловой системы "Zimbra" хранит файлы почтовых сообщений, а также поисковые индексы их содержимого (ранее мы приняли меры к выносу этих частей файловой системы на более быстрый диск):
Admin -> Home -> Configure -> Servers -> mail.example.net -> Volumes:
index1: /opt/zimbra/index
message1: /opt/zimbra/store
index1: /opt/zimbra/index
message1: /opt/zimbra/store
Увеличиваем до 25 Мегабайт максимальный размер принимаемого письма, а также включаем в настройках почтового сервиса строгое следование требованиям к адресации (в частности, указываем отвергать сообщения без полноценно рабочего доменного имени):
Admin -> Home -> Configure -> Global Setings - MTA:
....
Messages:
Maximum message size (KB, default: 10000): 25000
....
Protocol check:
Hostname in greeting violates RFC (reject_invalid_helo_hostname): on
....
Sender address must be fully qualified (reject_non_fqdn_sender): on
DNS check:
....
Sender`s domain (reject_unknown_sender_domain): on
....
....
Messages:
Maximum message size (KB, default: 10000): 25000
....
Protocol check:
Hostname in greeting violates RFC (reject_invalid_helo_hostname): on
....
Sender address must be fully qualified (reject_non_fqdn_sender): on
DNS check:
....
Sender`s domain (reject_unknown_sender_domain): on
....
Управление "Zimbra" CLI-утилитами.
Всё тоже, что и через web-интерфейс, и ещё много чего можно сделать с помощью CLI-утилит, поставляемых в дистрибутиве "Zimbra". Например, полная остановка и последующий запуск всех сервисов сразу:
# su - zimbra
$ zmcontrol stop
$ zmcontrol start
$ zmcontrol status
$ zmcontrol stop
$ zmcontrol start
$ zmcontrol status
Host mail.example.net
amavis Running
....
imapd Running
ldap Running
....
zmconfigd Running
amavis Running
....
imapd Running
ldap Running
....
zmconfigd Running
В результате останавливается действительно всё множество сервисов "Zimbra" - список процессов пустеет.
Мелкие доработки CLI-напильником.
Практически в любом сложном программном комплексе функционал административного интерфейса не поспевает за подкапотными изменениями. Так и у "Zimbra" случается, что в процессе настройки через web-интерфейс вполне могут сбиться параметры, которые исправить можно только через CLI. Например, TCP-порт в ссылке на web-консоль администрирования может измениться на "9071" и впоследствии исправить это проще всего принудительным указанием соответствующего действительности:
# su - zimbra
$ zmprov mcf zimbraWebClientAdminReference "https://mail.example.net:7071/zimbraAdmin/"
$ zmprov fc -a all
$ zmprov mcf zimbraWebClientAdminReference "https://mail.example.net:7071/zimbraAdmin/"
$ zmprov fc -a all
Примерно также, неведомым образом, в части ссылок на публичный пользовательский web-интерфейс TCP-порт устанавливается в значение "8443" и исправить это можно только установкой нужных параметров через CLI:
# su - zimbra
$ zmprov mcf zimbraPublicServiceHostname mail.example.net
$ zmprov mcf zimbraPublicServiceProtocol https
$ zmprov mcf zimbraPublicServicePort 443
$ zmcontrol restart
$ zmprov mcf zimbraPublicServiceHostname mail.example.net
$ zmprov mcf zimbraPublicServiceProtocol https
$ zmprov mcf zimbraPublicServicePort 443
$ zmcontrol restart
Простейшее резервное копирование корреспонденции.
Иногда пользователь письмо из почтового ящика удаляет, сознательно или случайно, а позже выясняется, что оно ему очень сильно нужно. Возня с восстановлением архива писем в "песочницу" и поиском там конкретного сообщения процесс длительный, да и "Zimbra" не в открытом виде письма хранит - но есть простой превентивный метод, заключающийся в скрытом дублировании всей входящей и исходящей корреспонденции с сохранением её в специально выделенном для этого почтовом ящике. При необходимости администратор может просмотреть содержимое архивного ящика и найти там копию потерянного письма. Разумеется, такое допустимо только в корпоративной среде, где каждый пользователь понимает, что его переписка не частная.
Включается режим тотального дублирования очень просто, заданием целевого ящика для применяемого принудительно всем заголовка ВСC ("blind carbon copy"):
# su - zimbra
$ postconf -e always_bcc=archive@example.net
$ zmmtactl restart
$ postconf -e always_bcc=archive@example.net
$ zmmtactl restart
Ограничение сетевых подключений извне.
Почтовый сервис "Zimbra" состоит из многих компонентов, обменивающихся данными через сеть, причём некоторые из них могут принимать подключения извне, даже когда этого не требуется. Для такой системы требуется настроить защитный экран, ограничивающий доступ по заданным правилам (документация от разработчиков).
Набросаем заготовку, формирующую таблицу правил "Iptables" для нашего почтового сервера:
# vi /usr/local/etc/iptables/set-mail-rules.sh && chmod u+x /usr/local/etc/iptables/set-mail-rules.sh
#!/bin/bash
# Зачищаем правила обработки трафика
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# Задаём правила "по умолчанию"
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Обрубаем все "ненормальные" соединения
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# Разрешаем прохождение пакетов в уже установленных соединениях
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Разрешаем входящие соединения от "локальной петли"
iptables -A INPUT -i lo -j ACCEPT
# Разрешаем входящие SSH-подключения только из локальных сетей
iptables -A INPUT -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -p TCP --dport 22 -j ACCEPT
# Разрешаем входящие соединения к web-сервису "Let`s Encrypt" отовсюду
iptables -A INPUT -p TCP --dport 80 -j ACCEPT
# Разрешаем входящие соединения к web-интерфейсу почтового сервера только из локальных сетей
iptables -A INPUT -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -p TCP --dport 443 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -p TCP --dport 7071 -j ACCEPT
# Разрешаем входящие соединения к SMTP, SMTP-SSL, SMTP-StartTLS, IMAP-SSL и POP3-SSL отовсюду
iptables -A INPUT -p TCP --match multiport --dport 25,465,587,993,995 -j ACCEPT
# Разрешаем входящие соединения к нешифрованному POP3 и IMAP только из локальных сетей
iptables -A INPUT -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -p TCP --match multiport --dport 110,143 -j ACCEPT
# Разрешаем входящие ICMP ping-запросы отовсюду
iptables -A INPUT -p ICMP --icmp-type echo-request -j ACCEPT
exit ${?}
# Зачищаем правила обработки трафика
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# Задаём правила "по умолчанию"
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Обрубаем все "ненормальные" соединения
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# Разрешаем прохождение пакетов в уже установленных соединениях
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Разрешаем входящие соединения от "локальной петли"
iptables -A INPUT -i lo -j ACCEPT
# Разрешаем входящие SSH-подключения только из локальных сетей
iptables -A INPUT -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -p TCP --dport 22 -j ACCEPT
# Разрешаем входящие соединения к web-сервису "Let`s Encrypt" отовсюду
iptables -A INPUT -p TCP --dport 80 -j ACCEPT
# Разрешаем входящие соединения к web-интерфейсу почтового сервера только из локальных сетей
iptables -A INPUT -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -p TCP --dport 443 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -p TCP --dport 7071 -j ACCEPT
# Разрешаем входящие соединения к SMTP, SMTP-SSL, SMTP-StartTLS, IMAP-SSL и POP3-SSL отовсюду
iptables -A INPUT -p TCP --match multiport --dport 25,465,587,993,995 -j ACCEPT
# Разрешаем входящие соединения к нешифрованному POP3 и IMAP только из локальных сетей
iptables -A INPUT -s 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -p TCP --match multiport --dport 110,143 -j ACCEPT
# Разрешаем входящие ICMP ping-запросы отовсюду
iptables -A INPUT -p ICMP --icmp-type echo-request -j ACCEPT
exit ${?}
Запускаем скрипт и проверяем результат:
# /usr/local/etc/iptables/set-mail-rules.sh
# iptables -L -n -v --line-numbers
# iptables -t nat -L -n -v --line-numbers
# iptables -t mangle -L -n -v --line-numbers
# iptables -L -n -v --line-numbers
# iptables -t nat -L -n -v --line-numbers
# iptables -t mangle -L -n -v --line-numbers
В "Linux Debian/Ubuntu" для сохранения и применения iptables-правил предназначается специальная утилита:
# aptitude install iptables-persistent
# /etc/init.d/netfilter-persistent save
# /etc/init.d/netfilter-persistent save
Удаление "Zimbra".
Довольно просто полностью удалить "Zimbra" со всеми настройками и пользовательскими данными.
Прежде всего, будучи в директории с дистрибутивом, отдаём соответствующую команду скрипту-установщику:
# ./install.sh --uninstall
Затем удаляем каталог, где по умолчанию расположено всё, что имеет отношение к установленной "Zimbra":
# rm -rf /opt/zimbra
Сервисы "Zimbra" много пишут в свои журналы в директориях "/opt/zimbra/log" и "/opt/zimbra/logger", отсылают сведения в системный "syslog", и сверх того оставляют ещё некоторые файлы журналов в общесистемной директории, довольно сильно разрастающиеся со временем:
# ls -l /var/log/zimbra*
... /var/log/zimbra.log
... /var/log/zimbra-stats.log
... /var/log/zimbra-stats.log