Обновление почтового сервера iRedMail с 0.9.2 до 0.9.5-1
В данном руководстве собраны шаги по обновлению почтового сервера iRedMail с версии 0.9.2 до актуальной на момент выхода статьи 0.9.5-1. Как оказалось соблюдать строгий порядок обновления не обязательно, и можно обновлять компоненты системы сразу перепрыгивая несколько промежуточных версий. В данной заметке, будем рассматривать версию сервера, где в качестве backend'а базы данных используется MySQL, а в качестве операционной системы Debian. Как показывает практика и уже более 4-х летний опыт использования данного сервера, данная связка (debian + mysql) требует наименьшего количества обновлений и соответственно отнимает гораздо меньше времени затрачиваемого админом на поддержание системы в актуальном состоянии. Поэтому, если вы собираетесь разворачивать сервер впервые, рекомендую использовать именно этот вариант.
На данный момент проект iRedMail продолжает активно развиваться, исправлены разные баги, в том числе и связанные с безопасностью, включена поддержка HSTS, вебсервера Nginx, баз данных MariaDB, опционально SOGo как cервера групповой работы (аналога Microsoft Exchange) с красивым веб-интерфейсом и др. плюшками. Одним словом, если вы ищите надежный и самое главное бесплатный вариант по организации почтовой системы и при этом не боитесь Linux, то данный вариант несомненно вам подойдет :)
Инструкции по обновлению предыдущей версии на новую обычно выкладываются по следующему адресу и довольно хорошо описаны, но на практике как это нередко случается, возникают нюансы. Вот об этом подробнее:
В самом начале откроем на редактирование текстовый файл где записан номер текущей версии сборки, меняем ее на последнюю.
nano /etc/iredmail-release
1) Обновление iRedAPD:
Выполняем последовательно шаги по обновлению iRedAPD:
cd /root wget http://www.iredmail.org/yum/misc/iRedAPD-1.9.1.tar.bz2 tar xjf iRedAPD*.bz2 cd iRedAPD*/tools/ bash upgrade_iredapd.sh
Начиная с версии 0.9.3 функции по борьбе со спамом на основе серых списков (greylisting), которые ранее были возложены на PolicyD v2 (кодовое имя "cluebringer") теперь выполняет iRedAPD. Поэтому нам необходимо выполнить ряд шагов по переносу конфигурации с cluebringer на iRedAPD. Подробнее о новом функционале грейлистинга читаем здесь. Авторизуемся в MySQL и добавим в таблицу greylisting, базы iredapd несколько новых значений.
mysql -uroot -p USE iredapd; INSERT INTO greylisting (priority, sender, sender_priority, active) VALUES (0, '@.', 0, 1); \q
Затем выполняем непосредственно шаги по миграции. Открываем последовательно следующие файлы скриптов (/opt/iredapd/tools/migrate_cluebringer_greylisting.py и /opt/iredapd/tools/migrate_cluebringer_throttle.py) на редактирование и задаем параметры подключения к mysql базе clubringer.
Параметры берем в /etc/cluebringer/cluebringer.conf
DB_Type=mysql DB_Host=127.0.0.1 DB_Port=3306 DB_Name=cluebringer Username=cluebringer Password=1V6e9PuiZoQJxXEаuG4BiExhqpOXnM
Затем переходим в /opt/iredapd/tools/ и последовательно запускаем скрипты на выполнение:
cd /opt/iredapd/tools/ python migrate_cluebringer_greylisting.py python migrate_cluebringer_throttle.py
Если видим, такую картинку:
root@mx:/opt/iredapd/tools# python migrate_cluebringer_greylisting.py * Backend: mysql * Migrate global greylisting setting. - Query enabled global greylisting setting. - Cluebringer has greylisting enabled globally. - iRedAPD already has global greylisting setting, not migrate Cluebringer global setting. * Migrate per-domain and per-user no-greylisting settings. - Query no-greylisting settings root@mx:/opt/iredapd/tools# python migrate_cluebringer_throttle.py * Backend: mysql No throttle settings found. Exit.
То все ОК, миграция прошла успешно.
Удаляем лишние и добавляем новые плагины внутри файла настроек /opt/iredapd/settings.py. Должно получится что то типа этого:
plugins = ['sql_alias_access_policy', 'reject_sender_login_mismatch', 'throttle' "greylisting"]
Отключаем Cluebringer в Postfix:
Открываем на редактирование фаил конфигурации postfix.
nano /etc/postfix/main.cf
и меняем значения триггеров: smtpd_recipient_restrictions и smtpd_end_of_data_restrictions на
check_policy_service inet:127.0.0.1:7777 т.е. по сути порт с 10031 на 7777 с добавлением permit_mynetworks. В результате приводим к следующему виду:
smtpd_recipient_restrictions = ... check_policy_service inet:127.0.0.1:7777, permit_mynetworks, ... smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:7777
Перезапускаем postfix:
service postfix restart
Останавливаем и удаляем пакеты Cluebringer:
service postfix-cluebringer stop && apt-get remove --purge postfix-cluebringer
Удаляем лишние каталоги:
rm -rf /usr/share/postfix-cluebringer-webui
Удаляем базу clubringer и пользователя cluebringer из mysql:
mysql -uroot -p DROP DATABASE cluebringer; DROP USER 'cluebringer'@'localhost'; \q
2) Обновление iRedAdmin:
cd /root/ wget http://www.iredmail.org/yum/misc/iRedAdmin-0.6.3.tar.bz2 tar xjf iRedAdmin*.tar.bz2 cd iRedAdmin*/tools/ bash upgrade_iredadmin.sh
3) Обновление Roundcube.
Обновляем существующую сборку с версии 1.1.1 до 1.2.2.
cd /root wget https://github.com/roundcube/roundcubemail/releases/download/1.2.2/roundcubemail-1.2.2-complete.tar.gz tar xf roundcubemail*.tar.gz cd roundcubemail* bin/installto.sh /usr/share/apache2/roundcubemail-1.1.1
Нажимаем Yes. Если видим что:
This instance of Roundcube is up-to-date. Have fun! All done.
То процесс обновления прошел успешно.
Поправим имя директории roundcubemail на актуальную с правкой ярлыка (smlinks):
cd /usr/share/apache2 rm -i /usr/share/apache2/roundcubemail mv /usr/share/apache2/roundcubemail-1.1.1 roundcubemail-1.2.2 ln -s roundcubemail-1.2.2 roundcubemail
Добавляем в cron скрипт очистки sql базы roundcubemail:
crontab -e -u root
# Cleanup Roundcube SQL database.
2 2 * * * php /usr/share/apache2/roundcubemail/bin/cleandb.sh >/dev/null
4) Включаем поддержку HSTS - HTTP Strict Transport Security в Apache.
Данный механизм включает форсированное защищённое соединение через протокол HTTPS.
Для начала активируем модуль "header" командой:
a2enmod headers
Затем, открываем на редактирование файл /etc/apache2/sites-enabled/default-ssl
Добавляем следующий код:
# Use HTTP Strict Transport Security to force client to use secure connections only. # Reference: # https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security # Module mod_headers is required. 15768000 seconds = 6 months. Header always set Strict-Transport-Security "max-age=15768000"
Перезапускаем Apache:
service apache2 restart
5) Вносим изменения в Dovecot:
Исправляем известные проблемы с неправильным оповещением локальных пользователей о превышением квоты. Открываем на редактирование файл /etc/dovecot/dovecot.conf и находим следующие строки:
quota_warning = storage=85%% quota-warning 85 %u quota_warning2 = storage=90%% quota-warning 90 %u quota_warning3 = storage=95%% quota-warning 95 %u
меняем их на:
quota_warning = storage=95%% quota-warning 95 %u quota_warning2 = storage=90%% quota-warning 90 %u quota_warning3 = storage=85%% quota-warning 85 %u
Перезапускаем dovecot.
service dovecot restart
6) Изменения в Posfix:
Невозможность доставить письмо до системной учетной записи. Если речь идет о postmaster то на текущей сборке лично я не сталкивался с таким, но поверим разработчикам и внесем следующие изменения. Открываем на редактирование /etc/postfix/main.cf. Находим и удаляем следующие строки:
home_mailbox = Maildir/ mailbox_command = /usr/lib/dovecot/deliver
Исправления в механизме образования имени почтовых ящиков. (Not preserve the case of ${extension} while delivering message to mailbox).
Открываем на редактирование /etc/postfix/master.cf Находим строки:
# Use dovecot deliver program as LDA. dovecot unix - n n - - pipe flags=DRhu ...
и убираем флаг "u". Получаем:
# Use dovecot deliver program as LDA. dovecot unix - n n - - pipe flags=DRh ...
7) Изменения в Amavis:
Исправляем неправильную настройку, которая рассматривает внешних отправителей как внутренних пользователей.
Открываем на редактирование файл /etc/amavis/conf.d/50-user
Приводим значения параметров к следующему виду:
$inet_socket_port = [10024, 10026, 9998]; $interface_policy{'10026'} = 'ORIGINATING';
Оставим значение как есть (У меня в файле это 278 строка):
$originating = 1;
Затем закоментим или полностью удалим блоки:
#$policy_blank{'MYUSERS'} = {
# ...
#}
и
#$policy_bank{'ORIGINATING'} = {
#
#
Перезапускаем Amavis:
service amavis restart
Теперь открываем конфиг Postfix /etc/postfix/master.cf Раскомментируем строку:
# -o content_filter=smtp-amavis:[127.0.0.1]:10026
Перезапустим сервис:
service postfix restart
8) Изменения в Fail2ban:
Обновление регулярных выражений для захвата postscreen лога. Помогает эффективнее бороться со спамом.
Приводим конфиг /etc/fail2ban/filter.d/postfix.iredmail.conf к следующему виду:
[Definition] failregex = \[<HOST>\]: SASL (PLAIN|LOGIN) authentication failed reject: RCPT from (.*)\[<HOST>\]: 550 5.1.1 reject: RCPT from (.*)\[<HOST>\]: 450 4.7.1 reject: RCPT from (.*)\[<HOST>\]: 554 5.7.1 reject: RCPT from (.*)\[<HOST>\]:([0-9]{4,5}:)? 550 ignoreregex =
Добавление ssh портов в конфиг Fail2ban.
Я просто скопировал кусок кода из последней сборки iRedMail на своем тестовом сервере и получилось что нужно привести начальную часть конфига /etc/fail2ban/jail.conf к следующему виду:
# Refer to /etc/fail2ban/jail.conf for more examples. [DEFAULT] # time is in seconds. 3600 = 1 hour, 86400 = 24 hours (1 day) findtime = 3600 bantime = 86400 maxretry = 5 ignoreip = 127.0.0.1 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 [sshd] enabled = true filter = sshd action = iptables-multiport[name=sshd, port="22", protocol=tcp] logpath = /var/log/auth.log [sshd-ddos] enabled = true filter = sshd-ddos action = iptables-multiport[name=sshd-ddos, port="22", protocol=tcp] logpath = /var/log/auth.log [roundcube-iredmail] ....
Перезапускаем демон командой:
/etc/init.d/fail2ban restart
9) MySQL:
Добавление новой колонки delete_date в SQL таблице vmail.deleted_mailboxes базы vmail;
mysql -uroot -p USE vmail; ALTER TABLE deleted_mailboxes ADD COLUMN delete_date DATE DEFAULT NULL; CREATE INDEX idx_delete_date ON deleted_mailboxes (delete_date); \q
10) Обновление phpmyadmin. (опционально):
Обновляем phpmyadmin, хотя делать это совсем не обязательно, к тому же последняя сборка 4.6.4 требует версии php 5.5. Если у вас до сих пор стоит Debian 7 Wheezy то придется отдельно обновлять и php до версии 5.5, иначе при входе через браузер получим следующую месагу:
PHP 5.5+ is required.
Currently installed version is: 5.4.45-0+deb7u5
Итак, для обновления последовательно выполняем следующие шаги. На всякий случай копируем старую сборку в /tmp, а так же отдельно файл конфигурации config.inc.php. Качаем последний релиз phpmyadmin. Извлекаем архив в /usr/share. Меняем имя на phpmyadmin. Подкладываем обратно файл конфигурации в новую сборку. Перезапускам apache. Если все хорошо, то при старте получим окошко авторизации "Добро пожаловать в phpMyAdmin"
cd /tmp cp -a /usr/share/phpmyadmin /tmp cp /usr/share/phpmyadmin/config.inc.php /tmp rm -rf /usr/share/phpmyadmin wget https://files.phpmyadmin.net/phpMyAdmin/4.6.4/phpMyAdmin-4.6.4-all-languages.tar.bz2 tar xjf /tmp/phpMyAdmin-4.6.4-all-languages.tar.bz2 -C /usr/share mv /usr/share/phpMyAdmin-4.6.4-all-languages /usr/share/phpmyadmin cp /tmp/config.inc.php /usr/share/phpmyadmin service apache2 restar
Обновление php до версии 5.5 (Debian 7 Wheezy);
Открываем на редактирование /etc/apt/sources.list и добавляем туда следующие строки:
deb wheezy-php55 all
Запускаем команду на обновление пакета php5:
apt-get update apt-get install php5
Либо обновляем всю систему целиком:
apt-get update && upgrade
Проверить версию php после установки:
php -v
После обновления, в php.ini желательно указать значение временной зоны для вашего региона, иначе, как это было у меня в Roundcube перестанет отображаться поле "дата". Открываем на редактирование /etc/php5/apache2/php.ini и в разделе [Date] параметру date.timezone пропишем значение часового пояса. В моем случае это: date.timezone = "Europe/Moscow"
Сохраняем, перезапускаем вебсервер:
service apache2 restart
11) Обновление антивируса clamav:
aptitude install clamav
Если возникает ошибка во время запуска freshclam, "ERROR: /var/log/clamav/freshclam.log is locked by another process" то делаем слудующее:
/etc/init.d/clamav-freshclam stop freshclam -v etc/init.d/clamav-freshclam start