iRedAdmin / SoGo

Debian 11

Подготовка OS
apt update && apt dist-upgrade -y && apt install mc vim curl htop -y && apt autoremove -y && timedatectl set-timezone Europe/Moscow
hostnamectl set-hostname mail.example.ru

FQDN должно стоять первым в файле, это важно.

nano /etc/hosts
127.0.0.1       mail.example.ru

Проверяем, что в системе отсутствует Apache и останавливаем его при наличии

systemctl stop apache2 && systemctl disable apache2

Добавляю отдельный диск для почты /dev/sdb

wipefs /dev/sdb -a

Разбиваю и форматирую

fdisk /dev/sdb
mkfs.ext4 /dev/sdb

Создаю каталог для монтирования

mkdir /var/vmail

Дописываю строку в конце файла /etc/fstab для автоматического монтирования

nano /etc/fstab
/dev/sdb /var/vmail ext4 defaults 1 2

Лучше подключать по UUID.
Проверяю, что ошибок нет

mount -a
Установка iRedMail
wget https://github.com/iredmail/iRedMail/archive/refs/tags/1.7.1.tar.gz && \
tar -xzvf 1.7.1.tar.gz && cd iRedMail-1.7.1 && chmod +x iRedMail.sh && ./iRedMail.sh

Указываю для почты папку /var/vmail
Веб-сервер - NginX
БД - MariaDB
Вводим сложный пароль пользователя root для MariaDB, например 2REQoS2mm5S49cwuK
Имя домена example.ru
Пароль для пользователя Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. (пароль со спецсимволами не используем), например KWAq8z3m5S49cwu

Далее в списке устанавливаемого я исключил RoundCube, можно выбрать всё )

На вопрос о FireWall отвечаем Y

Далее ребут и заходим по адресу https://IP-адрес_сервера/iredadmin/

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

Отключаю Greylisting

Отключаю Graylisting:

chmod u+w /opt/iredapd/settings.py && nano /opt/iredapd/settings.py

Нахожу строку plugins = ["reject_null_sender", "reject_sender_login_mismatch", "greylisting", "throttle", "amavisd_wblist", "sql_alias_access_policy"] и вырезаю "greylisting"

chmod u-w /opt/iredapd/settings.py	
Настройка Clamav
nano /etc/clamav/freshclam.conf

Комментируем строки, которые начинаются на DatabaseMirror

#DatabaseMirror ...
#DatabaseMirror ...

Добавляем следующую строку:

PrivateMirror https://packages.microsoft.com/clamav/

Далее

systemctl stop clamav-freshclam && rm -f /var/lib/clamav/freshclam.dat && freshclam

Ждем окончания обновления, а затем запускаем службу clamav-freshclam и перезапускаем clamav-daemon, amavis:

systemctl start clamav-freshclam && systemctl restart clamav-daemon amavis
Настройка DNS-записей

При установке скрипт генерирует DKIM 2048, но я бы рекомендовал перевыпуск в 1024, т.к. могут возникнуть проблемы у некоторых DNS-провайдеров.
Перевыпуск:

amavisd genrsa /var/lib/dkim/example.ru.pem 1024

Этой же командой можно выпустить для дополнительных доменов если у вас их на одном почтовике несколько, т.е.

amavisd genrsa /var/lib/dkim/example2.ru.pem 1024
amavisd genrsa /var/lib/dkim/example3.ru.pem 1024
.....

Присваиваем переменной DOMAIN значение имени вашего домена и назначаем права:

DOMAIN=example.ru && chown amavis:amavis /var/lib/dkim/$DOMAIN.pem && chmod 0400 /var/lib/dkim/$DOMAIN.pem

Далее открываем конфигурационный файл amavisd

nano /etc/amavis/conf.d/50-user

Находим строчку:

dkim_key('example.ru', "dkim", "/var/lib/dkim/example.ru.pem");

И добавляем радом с ней новые, если несколько доменов. Получится так:

....
dkim_key('example.ru', "dkim", "/var/lib/dkim/example.ru.pem");
dkim_key('example2.ru', "dkim", "/var/lib/dkim/example2.ru.pem");
....

Теперь находим строчку:

@dkim_signature_options_bysender_maps = ( {
   ...
   "example.ru" => { d => "example.ru", a => 'rsa-sha256', ttl => 10*24*3600 },

И также после нее добавляем новые. Должно получиться:

"example.ru" => { d => "example.ru", a => 'rsa-sha256', ttl => 10*24*3600 },	
"example.ru" => { d => "example2.ru", a => 'rsa-sha256', ttl => 10*24*3600 },
"example.ru" => { d => "example3.ru", a => 'rsa-sha256', ttl => 10*24*3600 },
....

Далее

amavisd restart

Посмотреть новый ключ можно командой:

amavisd showkeys $DOMAIN

Следующим пунктом нам необходимо сделать записи на стороне регистратора домена:

MX 10 mail.example.ru.
mail.example.ru   A   ВНЕШНИЙ_IP-адрес
example.ru     text = "v=spf1 a mx -all"
_dmarc.example.ru. 3600 IN TXT "v=DMARC1; p=quarantine; sp=none; pct=100; fo=0; rua=mailto:Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript."
dkim._domainkey.example.ru     text = "v=DKIM1; p=MIGfMA0GCSqGSIb3GNADCBiQKBgQDHNu0ZlYkq.....paUwQIDAQAB"

Значение DKIM можно посмотреть командой:

amavisd showkeys

Когда обновятся DNS-записи необходимо проверить правильность DKIM командой:

amavisd testkeys

Вывод должен быть примерно таким:

dkim._domainkey.example.ru => pass
dkim._domainkey.example2.ru => pass
NginX

Удаляю всё из папки /etc/nginx/sites-enabled/ и создаю там файл для нашего почтовика:

nano /etc/nginx/sites-enabled/example.ru.conf
server {
    listen 80;
    listen [::]:80;
    server_name mail.example.ru;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name mail.example.ru;

    root /var/www/html;
    index index.php index.html;

    location ~ /.well-known {
        root /usr/share/nginx/html;
        allow all;
    }
    include /etc/nginx/templates/misc.tmpl;
    include /etc/nginx/templates/ssl.tmpl;
    include /etc/nginx/templates/iredadmin.tmpl;
    include /etc/nginx/templates/roundcube.tmpl;
    include /etc/nginx/templates/sogo.tmpl;
    include /etc/nginx/templates/netdata.tmpl;
    include /etc/nginx/templates/php-catchall.tmpl;
    include /etc/nginx/templates/stub_status.tmpl;
}

Проверка корректности кофигурации NginX:

nginx -t

И если ошибок нет, то:

nginx -s reload
Let`s Encrypt
apt install -y certbot
DOMAIN=example.ru
certbot certonly --webroot --agree-tos --email postmaster@$DOMAIN --cert-name mail.$DOMAIN --webroot-path /usr/share/nginx/html/ -d mail.$DOMAIN

При успешном завершении команды удаляем старые сертификаты iRedAdmin:

rm -f /etc/ssl/private/iRedMail.key && rm -f /etc/ssl/certs/iRedMail.crt

И создаем симлинки на полученные:

ln -s /etc/letsencrypt/live/mail.$DOMAIN/fullchain.pem /etc/ssl/certs/iRedMail.crt && \
ln -s /etc/letsencrypt/live/mail.$DOMAIN/privkey.pem /etc/ssl/private/iRedMail.key

Перезапускаем службы nginx, postfix и dovecot:

systemctl reload nginx postfix dovecot

Для автоматического продления сертификата создаем в cron задачу:

crontab -e

Добавляем строку:

0 0 * * 1,4 /usr/bin/certbot renew --noninteractive	

Также добавляем настройку для перезапуска сервисов после обновления сертификатов:

nano /etc/letsencrypt/cli.ini
deploy-hook = systemctl reload nginx postfix dovecot
Обновление iRedAdmin 1.6.8 -> 1.7.1
apt update && apt dist-upgrade -y && apt autoremove -y

После апгрейда нужно добавить необходимый параметр в конфигурацию SoGo:

Найти параметр OCSAclURL в конфиге SOGo:

nano /etc/sogo/sogo.conf

Например будет выглядеть так:

OCSAclURL = "mysql://sogo:SOVtHQXsnYOb3CqnYe5sH52fiYTva@127.0.0.1:3306/sogo/sogo_acl";

Добавить новый параметр OCSAdminURL сразу после OCSAclURL с тем же значением, но заменив имя SQL-таблицы sogo_acl на sogo_admin:

OCSAclURL = "mysql://sogo:SOVtHQXsnYOb3CqnYe5sH52fiYTva@127.0.0.1:3306/sogo/sogo_acl";
OCSAdminURL = "mysql://sogo:SOVtHQXsnYOb3CqnYe5sH52fiYTva@127.0.0.1:3306/sogo/sogo_admin";

Сохраняем и рестартим SOGO:

systemctl restart sogo

Апгрейд mlmmjadmin до последней стабильной версии (3.3.0)

cd /root/ && wget https://github.com/iredmail/mlmmjadmin/archive/3.3.0.tar.gz && \
tar zxf 3.3.0.tar.gz && cd mlmmjadmin-3.3.0/tools/ && bash upgrade_mlmmjadmin.sh

Апгрейд iRedAPD (Postfix policy server) до последней стабильной версии (5.6.0)

cd /root && wget -O iRedAPD-5.6.0.tar.gz https://github.com/iredmail/iRedAPD/archive/5.6.0.tar.gz && \
tar zxf iRedAPD-5.6.0.tar.gz && cd iRedAPD-5.6.0/tools/ && bash upgrade_iredapd.sh

Апгрейд iRedAdmin (open source edition) до последней стабильной версии (2.6)

cd /usr/local/src/ && wget https://github.com/iredmail/iRedAdmin/archive/refs/tags/2.6.tar.gz && \
tar -zxf 2.6.tar.gz && cd iRedAdmin-2.6/tools/ && bash upgrade_iredadmin.sh	

Отключаем многопоточную базу данных в ClamAV

echo 'ConcurrentDatabaseReload no' >> /etc/clamav/clamd.conf

Апгрейд netdata до последней стабильной версии (1.46.2)

wget https://github.com/netdata/netdata/releases/download/v1.47.1/netdata-latest.gz.run && \
chmod +x netdata-latest.gz.run && ./netdata-latest.gz.run --accept

Запрет отправки анонимной статистики.

Просто создаём пустой файл opt-out-from-anonymous-statistics в Debian/Ubuntu

touch /opt/netdata/etc/netdata/.opt-out-from-anonymous-statistics

Апдейт /etc/iredmail-release версии iRedMail

sed -i 's/1.6.8/1.7.1/' /etc/iredmail-release
Меняем размер письма и вложения до 100М

Postfix:

postconf -e message_size_limit=104857600 && \
postconf -e mailbox_size_limit=104857600 && \
/etc/init.d/postfix restart

PHP

nano /etc/php/8.2/fpm/php.ini
memory_limit = 200M;
upload_max_filesize = 100M;
post_max_size = 100M;

Roundcube webmail

nano /opt/www/roundcubemail/config/config.inc.php
$config['max_message_size'] = '100M';

Nginx

nano /etc/nginx/conf-enabled/client_max_body_size.conf
client_max_body_size 100m;
nginx -t && nginx -s reload

SOGo

nano /etc/sogo/sogo.conf
WOMaxUploadSize = 102400;
SOGoMaximumMessageSizeLimit = 102400;
Ограничение доступа к Админке и панели состояния

iRedAdmin

nano /etc/nginx/templates/iredadmin.tmpl

Здесь раскомментируем следующие строки

    allow 127.0.0.1;
    allow 192.168.1.10;
    allow 192.168.1.0/24;
    deny all;

сети после allow меняем на разрешенные или отдельные IP-адреса.
Например, это может выглядеть так

    allow 127.0.0.1;
    allow 192.168.0.0/16;
    allow 10.0.0.0/8;
    allow 172.16.0.0/12;
    deny all;

Аналогично с netdata

nano /etc/nginx/templates/netdata.tmpl

добавляем в раздел location ~ /netdata/, но перед auth_basic "Authentication Required";

    allow 127.0.0.1;
    allow 192.168.0.0/16;
    allow 10.0.0.0/8;
    allow 172.16.0.0/12;
    deny all;
nginx -t && nginx -s reload
Дополнительные настройки:

Настройка workers в Sogo при проблемах с ActiveSync Outlook 2016+

nano /etc/sogo/sogo.conf
WOWorkersCount = 200;
WOWatchDogRequestTimeout = 20;
SxVMemLimit = 1024;	
SOGoMaximumSyncWindowSize = 100;
SOGoMaximumSyncResponseSize = 4096;
SOGoInternalSyncInterval = 60;
SOGoLanguage = Russian;
SOGoTimeZone = "Europe/Moscow";

Эта настройка оверрайдит кол-во воркеров:

nano /etc/default/sogo
PREFORK=200

В процессе функционирования почтового сервера iRedMail, можно использовать белые и чёрные списки. В списки могут быть добавлены домены, поддомены, ip-адреса, либо отдельные почтовые аккаунты.
Просмотр содержимого белого и чёрного списков:

python3 /opt/iredapd/tools/wblist_admin.py --list --whitelist
python3 /opt/iredapd/tools/wblist_admin.py --list --blacklist

Команды добавления в белый и чёрный список:

python3 /opt/iredapd/tools/wblist_admin.py --add --whitelist @example.ru
python3 /opt/iredapd/tools/wblist_admin.py --add --blacklist @example.ru

Удаление из белого и чёрного списка:

python3 /opt/iredapd/tools/wblist_admin.py --delete --whitelist @example.ru
python3 /opt/iredapd/tools/wblist_admin.py --delete --blacklist @example.ru

Формат для блокировки/разблокировки доменов:

  • отдельный пользователь: Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.
  • отдельный домен: @domain.com, @sub.domain.com
  • отдельный домен и все его поддомены: @.domain.com (обратите внимание на точку после @)
  • все: @. (точка на конце обязательна)
  • верхний уровень домена: @.com
  • отдельный IP-адрес: 192.168.1.2
  • подсеть: 192.168.1.0/24

Не забудьте протестировать почтовый сервер после окончания настройки и устранить ошибки, при их наличии.
Тест можно провести на сайте https://www.mail-tester.com/

Если вы в процессе установки не снимали галочку, то в комплекте идёт чудесная панель мониторинга сервера. Доступна она по адресу:

https://mail.example.ru/netdata

Если при тестировании сервера вы получаете ошибку "SPF: HELO does not publish an SPF Record", то просто добавьте в "/etc/postfix/main.cf"

nano /etc/postfix/main.cf

строку:

smtp_helo_name = $mydomain
Миграция почты через imapsync

Для миграции почтовых ящиков с другого сервиса есть прекрасный скрипт, который полностью справляется с этой задачей.

Скачиваем:

cd ~ && wget -N https://raw.githubusercontent.com/imapsync/imapsync/master/imapsync && chmod +x imapsync

Ставим зависимости:

apt install -y \
 libauthen-ntlm-perl \
 libcgi-pm-perl \
 libcrypt-openssl-rsa-perl \
 libdata-uniqid-perl \
 libencode-imaputf7-perl \
 libfile-copy-recursive-perl \
 libfile-tail-perl \
 libio-socket-inet6-perl \
 libio-socket-ssl-perl \
 libio-tee-perl \
 libhtml-parser-perl \
 libjson-webtoken-perl \
 libmail-imapclient-perl \
 libparse-recdescent-perl \
 libproc-processtable-perl \
 libmodule-scandeps-perl \
 libreadonly-perl \
 libregexp-common-perl \
 libsys-meminfo-perl \
 libterm-readkey-perl \
 libtest-mockobject-perl \
 libtest-pod-perl \
 libunicode-string-perl \
 liburi-perl \
 libwww-perl \
 libtest-nowarnings-perl \
 libtest-deep-perl \
 libtest-warn-perl \
 make \
 time \
 cpanminus

В простейшем случае перенос ящика будет выглядеть так:

./imapsync --automap --nofoldersizes --nofoldersizesatend --keepalive1 --keepalive2 --exclude 'Spam|Trash' \
 --host1 imap.yandex.ru \
 --user1 Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. \
 --password1 "Pa$$word1" \
 --host2 mail.example.ru \
 --user2 Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. \
 --password2 "Pa$$word2" 

Для пакетной миграции создаем 2 файла:

  • migrate.sh

    { while IFS=';' read  u1 p1 u2 p2; do
                imapsync --automap --nofoldersizes --nofoldersizesatend --keepalive1 --keepalive2 --exclude 'Spam|Trash'  \
                    --host1 imap.yandex.ru --user1 "$u1" --password1 "$p1" \
                    --host2 mail.example.ru --user2 "$u2" --password2 "$p2"
         done ; } < file.txt
    
  • file.txt

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

Присваиваем бит исполнения:

chmod +x migrate.sh

И запускаем процесс:

./migrate.sh

Для тестирования правльности реквизитов авторизации можно добавить ключ --justlogin

Миграция почты с mail.ru

Будем использовать сгенерированный пароль приложений.

Чтобы создать пароль приложений без привязки номера, необходимо загрузить в админ панели список пользователей, которым нужно сгенерировать пароль. Потребуется создать CSV-файл. Ознакомиться с созданием CSV-файла можно по ссылке:

https://biz.mail.ru/docs/saas/WorkMail/Manage/users/index.html#csv

Для создания пароля приложения достаточно ввести 4 значения:
username: - название почтового ящика до @,
password: - пароль от почтового ящика,
password_up: - новый пароль от почтового ящика (можно указать текущий, чтобы пароль не изменился),
extpassname: - название приложения (можно указать любое).

Пример, как должна выглядеть таблица:

Для пользователей из списка будет сгенерирован пароль приложения, а им на электронную почту придет ссылка на страницу, где этот пароль можно получить. То есть, пользователям надо будет зайти в свой ящик и перейти по ссылке из письма с темой "Пользователю установлен пароль приложения".


Fuse

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