Zimbra 8.8.8

Ubuntu server 16.04
Вводные

Немного вводных: почтовик стоит за микротом, у которого 2 IP: внешний 5.xxx.xxx.xxx и внутренний 192.168.0.217. На микроте проброшены порты 80, 25, 110, 143, 443, 465, 587, 993, 995, 3443, 5222, 5223, 7143, 7993, 7025 и настроен Hairpin NAT.
Далее SSH к серваку и погнали. Все действия будем выполнять от рута.

1. Настройка Zimbra 8.8.8

# apt-get dist-upgrade -y
# reboot now
# apt-get install -y mc htop dnsmasq

Настраиваем сеть:

# mcedit /etc/network/interfaces

в файле прописываем

auto ens160
iface ens160 inet static
address 192.168.0.10
netmask 255.255.255.0
gateway 192.168.0.217
dns-nameservers 8.8.8.8

Где ens160 имя сетевого интерфейса, которое можно получить по команде:

# ifconfig -a

ens160    Link encap:Ethernet  HWaddr 00:00:00:00:00:8b
inet addr:192.168.0.10  Bcast:192.168.0.255  Mask:255.255.252.0
inet6 addr: ba80::20g:29gd:fe37:b78b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:21759 errors:0 dropped:161 overruns:0 frame:0
TX packets:2004 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2025889 (2.0 MB)  TX bytes:140027 (140.0 KB)

Настраиваем hosts (вместо ***** вписываем свой домен, зону при необходимости замените, у меня ru):

# mcedit /etc/hosts
127.0.0.1       localhost
192.168.0.10    mail.******.ru mail
5.xxx.xxx.xxx   mail.******.ru mail

Настраиваем hostname:

# mcedit /etc/hostname
mail.******.ru

Перезагружаем:

# reboot now

Настраиваем DNSMASQ и приводим к виду:

# mcedit /etc/dnsmasq.conf
server=8.8.8.8
domain=******.ru
mx-host=******.ru,mail.******.ru,0
listen-address=127.0.0.1
address=/mail.******.ru/5.xxx.xxx.xxx

Перезапускаем dnsmasq:

# service dnsmasq restart

Перед установкой Zimbra необходимо выполнить два простых теста на правильность настройки записей MX и A DNS. Правильные запросы и ответы должны выглядеть так:

# dig mx ******.ru

; <<>> DiG 9.10.3-P4-Ubuntu <<>> mx ******.ru
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28236
;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1280
;; QUESTION SECTION:
;******.ru.         IN      MX
;; ANSWER SECTION:
******.ru.  0       IN      MX      0 mail.******.ru.
;; ADDITIONAL SECTION:
mail.******.ru. 0   IN      A       192.168.0.10
mail.******.ru. 0   IN      A       5.xxx.xxx.xxx
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sat May 26 16:24:55 +04 2018 ;; MSG SIZE rcvd: 124
# dig mail.******.ru

; <<>> DiG 9.10.3-P4-Ubuntu <<>> mx mail.******.ru
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52392
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;mail.******.ru.    IN      MX
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat May 26 16:25:12 +04 2018
;; MSG SIZE  rcvd: 44

Проверьте правильность ответов и если тесты некорректны, то начинать устанавливать зимбру не стоит, разбирайтесь с правильностью настройки, но настройка DNS выходит за рамки этой статьи.

Если всё ок, то загружаем последний пакет зимбры с сайта.
Ссылка действительна на момент написания статьи. В вашем случае она может отличаться.

# wget https://files.zimbra.com/downloads/8.8.8_GA/zcs-8.8.8_GA_2009.UBUNTU16_64.20180322150747.tgz

Распаковываем

# tar xzvf zcs-8.8.8_GA_2009.UBUNTU16_64.20180322150747.tgz

переходим в каталог

# cd zcs-8.8.8_GA_2009.UBUNTU16_64.20180322150747

и запускаем установку

# ./install.sh

Очень важный момент. Вам нужно выбрать «Да», чтобы изменить домен и выбрать вместо hostname.domain.com свой собственный домен ********.ru

Я ставлю все кроме dnscache и IMAPD (все еще в бете), а zimbra-drive мне не нужен.
Набираем "Yes" для модификации системы.
Меняем пароль администратора, нажав цифру 6, а затем 4 в подменю и вводим новый пароль для пользователя admin.
Затем нажимаем "r" и "a" для применения изменений.
Наливаем себе чашечку кофе и ждём окончания установки.
Configuration complete - press return to exit

Жмём Enter и ребутаем:

# reboot now
2. Настраиваем DKIM
# su zimbra
$ /opt/zimbra/libexec/zmdkimkeyutil -a -d *******.ru

Извлекаем данные для txt-записи на провайдере

$ /opt/zimbra/libexec/zmdkimkeyutil -q -d ******.ru

Публичный ключ нужно добавить как TXT-запись в домен и здесь тоже есть свои моменты. Начиная с ZCS 8.7.x зимбра генерирует 2048-битный ключ. Прописать его полностью не всегда получается вследствие ограничений в 255 символов в каждой TXT записи. На самом деле достаточно перенести часть ключа на новую строку клавишей Enter и все будет ОК.

TXT-запись прописываем в следующем виде:

C34F4586-58AF-23E8-C6FF-42365V532256._domainkey
TXT
v=DKIM1; k=rsa; p=............. (здесь публичная часть ключа)

Проверяем корректность на странице http://dkimcore.org/tools/keycheck.html или https://mxtoolbox.com/DKIM.aspx.

Domain Name - ******.ru
Selector - C34F4586-58AF-23E8-C6FF-42365V532256

Обновите DNS, и проверьте результат выполнения команды:

# host -t txt SELECTOR._domainkey.******.ru

Если ключ извлекается то следующую команду дабы убедиться, что открытый ключ соответствует закрытому:

$ opendkim-testkey -d ******.ru -s C34F4586-58AF-23E8-C6FF-42365V532256 -x /opt/zimbra/conf/opendkim.conf

По настройке SPF и DMARC полно мануалов в сети, поэтому останавливаться на этом не буду.

3. Настраиваем Let`s Encrypt

# su zimbra
$ zmproxyctl stop
$ zmmailboxdctl stop
$ exit
# git clone https://github.com/letsencrypt/letsencrypt
# cd letsencrypt
# ./letsencrypt-auto certonly --standalone

при запросе домена вводим


mail.******.ru

Если все будет хорошо с проверкой, то сертификат (сертификат + открытый ключ + цепочка) будет выпущен в формате «/etc/letsencrypt/live/address/».
Далее в терминале:


# mkdir /opt/zimbra/ssl/letsencrypt/
# cp /etc/letsencrypt/live/mail.******.ru/* /opt/zimbra/ssl/letsencrypt
# chown zimbra:zimbra /opt/zimbra/ssl/letsencrypt/
# chown zimbra:zimbra /opt/zimbra/ssl/letsencrypt/*
# cd /opt/zimbra/ssl/letsencrypt/

В конец файла chain.pem добавляем промежуточный корневой сертификат Let`s Encrypt (представлен ниже):


-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----

Далее в терминале:

# su zimbra
$ cp /opt/zimbra/ssl/letsencrypt/privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
$  /opt/zimbra/bin/zmcertmgr verifycrt comm privkey.pem cert.pem chain.pem
$ /opt/zimbra/bin/zmcertmgr deploycrt comm cert.pem chain.pem
$ zmcontrol restart
4. Перевыпуск сертификата Let`s Encrypt

Останавливаем зимбру

# /etc/init.d/zimbra stop
# certbot certonly --standalone -d mail.******.ru
# cp /etc/letsencrypt/live/mail.**********.ru/* /opt/zimbra/ssl/letsencrypt/
# cd /opt/zimbra/ssl/letsencrypt/
# mcedit chain.pem

Добавляем в конец файла


-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----

Сохраняем, закрываем и обратно в командную строку

# chown zimbra:zimbra /opt/zimbra/ssl/letsencrypt/
# chown zimbra:zimbra /opt/zimbra/ssl/zimbra/commercial/*
# su zimbra
$ cp /opt/zimbra/ssl/letsencrypt/privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
$ /opt/zimbra/bin/zmcertmgr verifycrt comm privkey.pem cert.pem chain.pem
$ /opt/zimbra/bin/zmcertmgr deploycrt comm cert.pem chain.pem
$ exit
# /etc/init.d/zimbra restart
# su zimbra
$ zmcontrol status

Убеждаемся, что все запущено, радуемся ))

5. Перенос учетных записей

На старом сервере зимбры:


# su zimbra
$ mkdir /tmp/zimbra
$ cd /tmp/zimbra

создаем список пользователей в файл users.txt


$ zmprov -l gaa ******.ru | grep -v galsync@******.ru > users.txt
$ mcedit pass.sh

#!/bin/bash
cat users.txt | while read line
do
array[i]="$line"
zmprov -l ga ${array[i]} userPassword | sed s/#\ name/zmprov\ ma/ | tr '\n' ' ' | sed s/:\ /\ \'/ | sed s/\ \ /\',/ | tr ',' '\n' >> /tmp/zimbra/restore_pass.sh
let i++
done

$ chmod +x pass.sh
$ ./pass.sh

После выполнения получаем скрипт restore_pass.sh, в котором содержатся команды смены пароля пользователям на новом сервере.

На новом сервере:

Средства и миграция -> Перенос учетной записи. Кликаем на шестеренку в правом верхнем углу и запускаем мастер. Тип почтового сервера "Zimbra Collaboration Suite". Импортировать только учетки или вместе с почтой выбираем по необходимости. Далее. Выбираем "Импортировать из другого каталога Zimbra LDAP". Далее. На следующей снимаем галку с пункта "Требовать смены пароля при первом входе в систему". Далее. URL LDAP - Указываем IP старого сервера.

Пароль привязки мы можем получить со старого сервера командой:

# su zimbra
$ zmlocalconfig -s zimbra_ldap_password

Поисковая база dc=ru. Остальные настройки по вкусу.

Тащим на новый сервер restore_pass.sh, полученный ранее. Кладем куда-нибудь. При необходимости даем права на него. Далее:


# su zimbra
$ chmod +x restore_pass.sh
$ ./restore_pass.sh

Дожидаемся окончания. Теперь у нас на новом сервере созданы учетки (и содержимое почтовых ящиков если выбрали при миграции) и у всех пользователей старые пароли.

6. Fail2ban
apt-get install fail2ban -y

Бэкапим файлики:


# cp /etc/fail2ban/action.d/iptables-allports.conf /etc/fail2ban/action.d/iptables-allports.conf.backup
# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.backup

Создаем zimbra.conf


# vi /etc/fail2ban/filter.d/zimbra.conf

следующего содержания


[Definition]

# Option: failregex
# Notes.: regex to match the password failures messages in the logfile. The
# host must be matched by a group named "host". The tag "" can
# be used for standard IP/hostname matching and is only an alias for
# (?:::f{4,6}:)?(?P[\w\-.^_]+)
# Values: TEXT
#
failregex = \[ip=;\] account - authentication failed for .* \(no such account\)$
\[ip=;\] security - cmd=Auth; .* error=authentication failed for .*, invalid password;$
;oip=;.* security - cmd=Auth; .* protocol=soap; error=authentication failed for .* invalid password;$
\[oip=;.* SoapEngine - handler exception: authentication failed for .*, account not found$
WARN .*;ip=;ua=ZimbraWebClient .* security - cmd=AdminAuth; .* error=authentication failed for .*;$
NOQUEUE: reject: RCPT from .*\[\]: 550 5.1.1 .*: Recipient address rejected:

# .*\[ip=;\] .* - authentication failed for .* \(invalid password\)
#
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =

Создаем Zimbra jail.conf


vi /etc/fail2ban/jail.conf

следующего содержания (не забудьте заменить *****.ru на ваш домен и 5.xxx.xxx.xxx/32 на ip-адрес почтовика)


# Fail2Ban configuration file
[DEFAULT]
# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space separator.
#ignoreip = 127.0.0.1/8 
ignoreip = 127.0.0.1/8 5.xxx.xxx.xxx/32
# "bantime" is the number of seconds that a host is banned.
bantime = 600
# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 600

# "maxretry" is the number of failures before a host get banned.
maxretry = 3

# "backend" specifies the backend used to get files modification. Available
# options are "gamin", "polling" and "auto". This option can be overridden in
# each jail too (use "gamin" for a jail and "polling" for another).
#
# gamin: requires Gamin (a file alteration monitor) to be installed. If Gamin
# is not installed, Fail2ban will use polling.
# polling: uses a polling algorithm which does not require external libraries.
# auto: will choose Gamin if available and polling otherwise.
backend = auto

# This jail corresponds to the standard configuration in Fail2ban 0.6.
# The mail-whois action send a notification e-mail with a whois request
# in the body.

[ssh-iptables]

enabled = false
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=admin@*****.ru;it@*****.ru]
logpath = /var/log/messages
maxretry = 5

# This jail forces the backend to "polling".

[sasl-iptables]

enabled = false
filter = sasl
backend = polling
action = iptables[name=sasl, port=smtp, protocol=tcp]
sendmail-whois[name=sasl, dest=admin@*****.ru;it@*****.ru]
logpath = /var/log/zimbra.log

# Here we use TCP-Wrappers instead of Netfilter/Iptables. "ignoreregex" is
# used to avoid banning the user "myuser".

[ssh-tcpwrapper]

enabled = false
filter = sshd
action = hostsdeny
sendmail-whois[name=SSH, dest=admin@*****.ru;it@*****.ru]
ignoreregex = for myuser from
logpath = /var/log/messages

# This jail uses ipfw, the standard firewall on FreeBSD. The "ignoreip"
# option is overridden in this jail. Moreover, the action "mail-whois" defines
# the variable "name" which contains a comma using "". The characters '' are
# valid too.

[zimbra-account]
enabled = true
filter = zimbra
action = iptables-allports[name=zimbra-account]
sendmail[name=zimbra-account, dest=dest=admin@*****.ru;it@*****.ru]
logpath = /opt/zimbra/log/mailbox.log
bantime = 600
maxretry = 5

[zimbra-audit]
enabled = true
filter = zimbra
action = iptables-allports[name=zimbra-audit]
sendmail[name=Zimbra-audit, dest=admin@*****.ru;it@*****.ru]
logpath = /opt/zimbra/log/audit.log
bantime = 600
maxretry = 5

[zimbra-recipient]
enabled = true
filter = zimbra
action = iptables-allports[name=zimbra-recipient]
sendmail[name=Zimbra-recipient, dest=admin@*****.ru;it@*****.ru]
logpath = /var/log/zimbra.log
#findtime = 604800
bantime = 172800
maxretry = 5

[postfix]
enabled = true
filter = postfix
action = iptables-multiport[name=postfix, port=smtp, protocol=tcp]
sendmail-buffered[name=Postfix, dest=admin@*****.ru;it@*****.ru]
logpath = /var/log/zimbra.log
bantime = -1
maxretry = 5

#[sasl]
#enabled = true
#port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s
#filter = sasl
# You might consider monitoring /var/log/warn.log instead
# if you are running postfix. See http://bugs.debian.org/507990
#logpath = /var/log/zimbra.log

Редактируем /etc/fail2ban/action.d/sendmail.conf и заменяем в нем строку


Fail2Ban” | /usr/sbin/sendmail -f  

на


Fail2Ban" | /opt/zimbra/postfix/sbin/sendmail -f  

Запускаем и добавляем в автозагрузку Fail2ban


# systemctl start fail2ban
# systemctl enable fail2ban

Проверяем состояние


# fail2ban-client status
7. Включаем zmauditswatch

Обратите внимание на 8-ую строку, где необходимо вписать почтовый адрес суперпользователя Zimbra.


# cd /tmp
# wget http://bugzilla-attach.zimbra.com/attachment.cgi?id=66723
# mv attachment.cgi\?id\=66723 auditswatch
# mv auditswatch /opt/zimbra/libexec/auditswatch
# chown root:root /opt/zimbra/libexec/auditswatch
# chmod 0755 /opt/zimbra/libexec/auditswatch
# su - zimbra
$ zmlocalconfig -e zimbra_swatch_notice_user=zimbra-super-admin @ your-company-domain.com
$ zmlocalconfig -e zimbra_swatch_ipacct_threshold=10
$ zmlocalconfig -e zimbra_swatch_acct_threshold=15
$ zmlocalconfig -e zimbra_swatch_ip_threshold=20
$ zmlocalconfig -e zimbra_swatch_total_threshold=60
$ zmlocalconfig -e zimbra_swatch_threshold_seconds=3600
$ touch /opt/zimbra/conf/auditswatchrc
$ touch /opt/zimbra/conf/auditswatchrc.in
$ zmauditswatchctl start

8. Включаем redirect с http на https в web-интерфейсе


# su zimbra
$ zmprov ms mail.*******.ru zimbraReverseProxyMailMode redirect

Fuse

Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.