Немного вводных: почтовик стоит за микротом, у которого 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 к серваку и погнали. Все действия будем выполнять от рута.
# 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
# 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 полно мануалов в сети, поэтому останавливаться на этом не буду.
# 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
Останавливаем зимбру
# /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
Убеждаемся, что все запущено, радуемся ))
На старом сервере зимбры:
# 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
Дожидаемся окончания. Теперь у нас на новом сервере созданы учетки (и содержимое почтовых ящиков если выбрали при миграции) и у всех пользователей старые пароли.
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
Обратите внимание на 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
# su zimbra
$ zmprov ms mail.*******.ru zimbraReverseProxyMailMode redirect