Установка и настройка iRedMail на CentOS

  • Михаил
  • 12 мин. на прочтение
  • 207
  • 16 Feb 2023
  • 16 Feb 2023

Что такое iRedMail и как ей пользоваться. Это набор скриптов для автоматической установки и базовой настройки всех компонентов, необходимых для полноценной работы почтового сервера. Вот список основных программ, которые будут установлены вместе с iRedMail:

  1. Postfix - сердце почтовой системы, вокруг которого настраивается все остальное.
  2. Dovecot - imap сервер для доступа к почтовым ящикам пользователей.
  3. Web сервер - apache+ php + mysql для вспомогательных функций.
  4. Roundcube и SOGo - веб интерфейсы для доступа к почте. Пользоваться можно любым, что больше понравится.
  5. Awstats - статистика работы почтового сервера.
  6. Amavisd - модуль связи почтовой системы и дополнительных обработчиков почты (антиспам, антивирус и т.д.)
  7. SpamAssassin - бесплатный антиспам для почты.
  8. ClamAV - бесплатный антивирус.
  9. Greylist - эффективная система борьбы со спамом.

Приступаем к установки и начальной настройки.

Подготовка системы

Задаем имя сервера:

hostnamectl set-hostname mail.subbnet.ru

* обязательно задать полное (FQDN) имя, в противном случае, когда мы будем запускать установку почтового сервера мы получим ошибку << ERROR >> Please configure a fully qualified domain name (FQDN) in /etc/hosts before we go further.

Устанавливаем wget и tar (нужны для скачивания и распаковки архива iRedMail):

yum install wget tar

В CentOS 8 необходимо включить репозиторий PowerTools:

dnf config-manager --set-enabled PowerTools

В последних версиях iRedMail необходимо использовать веб-сервер NGINX, поэтому останавливаем apache и отключаем его автозапуск:

systemctl stop httpd
systemctl disable httpd

* если в системе не установлен Apache (httpd), мы увидим ошибку или предупреждение.

Установка iRedMail

На странице загрузки iRedMail копируем ссылку на последнюю версию сборки:

Скачиваем сборку:

wget -O iredmail.tar.gz https://github.com/iredmail/iRedMail/archive/refs/tags/1.6.2.tar.gz

* где https://github.com/iredmail/iRedMail/archive/refs/tags/1.6.2.tar.gz — ссылка на скачивание версии, актуальной на момент обновления инструкции.

Распаковываем скачанный архив:

tar zxvf iredmail.tar.gz

Переходим в распакованную папку:

cd iRedMail-*

Запускаем скрипт установки:

bash iRedMail.sh

В открывшемся приветствии отвечаем Yes:

Вводим путь для хранения почты или оставляем предложенный по умолчанию:

Выбираем веб-сервер, на котором будет работать консоли управления и доступа к почте:

* с версии 0.9.8 только nginx.

Выбираем средство хранения данных:

Задаем пароль администратора базы данных:

Вводим наш почтовый домен:

Задаем пароль для администратора почтовыми ящиками:

Выбираем все дополнения для удобства работы с iRedMail:

Подтверждаем введенные настройки (y) и нажимаем Enter. На все последующие вопросы тоже отвечаем y.

Ждем окончания процесса.

Отключение Graylisting

Graylisting является мощным инструментом в борьбе со СПАМом, но при начальном тестировании сервера он создаст много неудобств. На время проверки почтовика Graylisting лучше отключить. Для этого добавляем права на редактирование следующему файлу:

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

Открываем для редактирования следующий файл:

vi /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

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

systemctl restart iredapd

Ошибка

Если при переходе на https://IP-адрес_сервера/iredadmin/ получил ошибку Internal Server Error ImportError

Запускаем проверку

/opt/www/iredadmin/python2 iredadmin.py

У меня python2 не был установлен, ставим

yum install python2

И ставим модуль web

pip3 install web.py

Перезагружаемся и проверяем web интерфейс администратора

 

 

Создание пользователя

Открываем браузер и в адресной строке вводим https://IP-адрес_сервера/iredadmin/

Откроется страница входа в панель управления. Вводим логин postmaster@subbnet.ru и пароль (пароль и домен subbnet.ru — данные, которые мы вводили при установке iRedMail).

Создадим первого пользователя. Для этого переходим по Add - User:

Заполняем поля и создаем пользователя:

Проверяем работу сервера

Получение

Чтобы проверить получение почты, для домена должна быть настроена MX-запись. Открываем панель администрирования записей для домена и создаем запись типа MX (приоритет может быть любой, он важен, если используется несколько почтовых серверов). Запись должна вести на имя сервера, например:

subbnet.ru   MX   10 mail.subbnet.ru

* в данном примере добавлена MX-запись для домена subbnet.ru. Ее приоритет 10 и она говорит, что отправлять почту для домена нужно на сервер mail.subbnet.ru.

Чтобы другой сервер понимал, какой адрес у mail.subbnet.ru, создаем запись типа А. Пример:

mail.subbnet.ru   A   88.140.200.98

* где mail.subbnet.ru — имя нашего сервера.

На применение настроек DNS может уйти несколько часов. Ждем и пробуем отправить письма на наш домен.

Отправка почты

Открываем браузер и в адресной строке вводим https://IP-адрес_сервера/mail/

https://10.10.11.60/mail/

Откроется панель для работы с почтой — вводим логин и пароль от созданного пользователя (логин должен быть с доменом, в нашем примере, m@subbnet.ru)

Нажимаем Написать сообщение и отправляем тестовое сообщение на один из своих адресов:

Если письма не отправляются, выполняем рекомендации ниже по предотвращению попадания в СПАМ.

Защищаем сообщения от попадания в СПАМ

Чтобы другие почтовые системы не принимали наши письма за СПАМ, выполняем следующие рекомендации:

А-запись в DNS

Для почтового сервера должна быть создана А-запись в DNS. Пример записи:

mail.subbnet.ru   A   88.140.200.98

* где mail.subbnet.ru — имя нашего сервера. По идее, данную запись мы создавали выше при проверке входящих сообщений.

Создаем PTR-запись для внешнего IP-адреса

Она должна вести на имя сервера (в данном примере, mail.subbnet.ru). Чтобы создать такую запись, нужно написать обращение Интернет-провайдеру или хостеру виртуальной машины. Пример записи:

98.200.140.88.in-addr.arpa      name = mail.subbnet.ru

Добавляем SPF-запись для домена

Эта запись создается в DNS для домена, от которого идет отправка сообщений. Пример:

subbnet.ru     text = "v=spf1 +a +mx -all"

Прописываем DKIM в DNS

Для начала, смотрим ключ, который был сформирован во время установки iRedMail:

amavisd -c /etc/amavisd/amavisd.conf showkeys

Пример ответа:

dkim._domainkey.subbnet.ru.     3600 TXT (
  "v=DKIM1; p="
  "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHNu0ZlYkq8pKsp131jnoZ+Ief"
  "zcSP1WxGzGQXssg3yiRGBlqsRGBnnKgitrsPYTZbzqqL+/rW0ptGNhAqfTWHvMia"
  "+f4RSMLJPMREFtakVEZvTIK5iZvxuCZpVhvM6ldadTLAxbcupX38yMfJV73EwCHK"
  "d2mdqfW+emSW/paUwQIDAQAB")

Копируем DKIM и создаем в DNS запись TXT. Пример:

dkim._domainkey.subbnet.ru     text = "v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHNu0ZlYkq8pKsp131jnoZ+IefzcSP1WxGzGQXssg3yiRGBlqsRGBnnKgitrsPYTZbzqqL+/rW0ptGNhAqfTWHvMia+f4RSMLJPMREFtakVEZvTIK5iZvxuCZpVhvM6ldadTLAxbcupX38yMfJV73EwCHKd2mdqfW+emSW/paUwQIDAQAB"

Создать другую подпись DKIM

Генерируем новый ключ:

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

* где subbnet0.ru — новый домен, для которого мы сгенерируем подпись dkim.
* некоторые системы не работают с ключами более чем 1024 бит.

Задаем права на созданный файл:

chown amavis:amavis /var/lib/dkim/subbnet0.ru.pem
chmod 0400 /var/lib/dkim/subbnet0.ru.pem

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

vi /etc/amavisd/amavisd.conf

* если файла нет или он окажется пустым, vi /etc/amavisd.conf.

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

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

* напомню, что subbnet.ru — домен, который мы вводили при установке iRedMail. В каждом случае он будет другим.

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

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

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

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

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

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

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

systemctl restart amavisd

Посмотреть DKIM последовательность для нового домена можно командой:

amavisd -c /etc/amavisd/amavisd.conf showkeys

Ящик abuse

По аналогии с тем, как мы создавали тестовую учетную запись, необходимо создать ящик abuse@... На данный ящик могут приходить жалобы на СПАМ. Стоит время от времени просматривать его (или настроить переадресацию), и реагировать на жалобы.

Управление белыми и черными списками

Переходим в каталог с утилитами iredmail:

cd /opt/iredapd/tools/

Просмотреть содержимое белого и черного списков:

python wblist_admin.py --list --whitelist
python wblist_admin.py --list --blacklist

Добавить в списки:

python wblist_admin.py --add --whitelist 111.112.113.114 info@domain.ru @subbnet.ru @.subbnet.ru
python wblist_admin.py --add --blacklist 111.112.113.115 @baddomain.com

* Первая команда добавит в белый список адрес 111.112.113.114, email info@domain.ru и домен subbnet.ru со всеми поддоменами. Вторая команда добавит в черный список адрес 111.112.113.115 и домен baddomain.com.

Удалить из списка:

python wblist_admin.py --delete --whitelist 111.112.113.114 info@domain.ru @subbnet.ru @.subbnet.ru
python wblist_admin.py --delete --blacklist 111.112.113.115 @baddomain.com

* как видим, процесс удаления аналогичен — просто меняем --add на --delete.

Установка своего сертификата

При установке устанавливается самоподписанный сертификат. Это приведет к лишним сообщениям нарушения безопасности в браузере.

Для начала, получаем сертификат, заверенный доверенным центром сертификации. Его можно купить или получить бесплатно от Let's Encrypt. Мы рассмотрим последнее подробнее.

Открываем файл:

vi /etc/nginx/sites-enabled/00-default-ssl.conf

... и добавим в секцию server:

server {
    ...
    location ~ /.well-known {
        root /usr/share/nginx/html;
        allow all;
    }
    ...
}

Перечитаем конфиг nginx:

systemctl restart nginx

Устанавливаем утилиту для получения сертификата:

yum install certbot

И получаем сертификат командой:

certbot certonly --webroot --agree-tos --email postmaster@subbnet.ru --webroot-path /usr/share/nginx/html/ -d mail.subbnet.ru

* обратите внимание, что в данном примере мы получим сертификат для узла mail.subbnet.ru.

Продолжаем выполнение операции:

(Y)es/(N)o: Y

Мы должны увидеть подтверждение об успешном получении сертификата:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live...

Удаляем старые сертификаты:

\rm /etc/pki/tls/private/iRedMail.key
\rm /etc/pki/tls/certs/iRedMail.crt

Создаем переменную с нашим именем узла, на который мы получили сертификат (для удобства):

DOMAIN=mail.subbnet.ru

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

ln -s /etc/letsencrypt/live/$DOMAIN/cert.pem /etc/pki/tls/certs/iRedMail.crt
ln -s /etc/letsencrypt/live/$DOMAIN/privkey.pem /etc/pki/tls/private/iRedMail.key

cert.pem и iRedMail.crt — открытые ключи (public); privkey.pem и iRedMail.key — закрытые (private); mail.subbnet.ru — узел, для которого был получен сертификат (его мы задали в переменной DOMAIN). Обратите внимание, что в нашем примере прописаны пути до сертификатов от Let's Encrypt — если у вас свои сертификаты, пути должны быть соответствующими.

Перезапускаем следующие службы:

systemctl restart iredapd
systemctl restart nginx

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

crontab -e

Добавим: 

0 0 * * 1,4 /usr/bin/certbot renew && systemctl restart nginx && systemctl restart iredapd

Отключение антивируса и антиспама

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

  1. Для диагностики проблем отправки сообщений.
  2. Экономии ресурсов (антивирус может слишком много потреблять ресурсов).
  3. При отсутствии необходимости.

И так, для отключения amavis (clam + spamassassin) открываем файл:

vi /etc/amavisd/amavisd.conf

Приводим к следующему виду настройку:

@bypass_virus_checks_maps = (1);
@bypass_spam_checks_maps  = (1);

* в данном примере мы сняли комментарий с данных строк (если они были закомментированы) и задаем для них значение 1. Опция bypass_virus_checks_maps отвечает за включение проверки писем на вирусы; bypass_spam_checks_maps — на СПАМ.

Перезапускаем службу amavisd:

systemctl restart amavisd

После данной настройки письма будут отправляться без проверок. Однако, сервис антивируса будет, по-прежнему, работать.

Останавливаем и отключаем сервис clamd:

systemctl disable clamd@amavisd --now

Настройка почтового клиента

Помимо веб-интерфейса, мы можем работать с нашим сервером iredmail, используя почтовые клиенты, такие как MS Outlook, Mozilla Thunderbird и так далее.

Для подключения клиента используем следующие параметры:

НастройкаIMAPPOP3SMTP
Адрес сервераIP-адрес сервера или его имя
Порт143110587
SSLSTARTTLS
Имя пользователяПочтовый адрес, к которому выполняем подключение
ПарольПароль для почтового ящика

Группы рассылки

В профессиональной платной версии iRedMail можно управлять группами рассылки из веб-интерфейса. Данный процесс не вызовет сложностей. Мы же рассмотрим, как создать группу для рассылки через запросы SQL. Данный метод является единственным для бесплатной версии.

Подключаемся к базе данных (в нашем примере, это mariadb):

mysql -uroot -p

Используем нашу базу для почты:

> use vmail

Создадим группу рассылки:

> INSERT INTO alias (address, domain, active) VALUES ('managers@subbnet.ru', 'subbnet.ru', 1);

* в данном примере мы создали группу с почтовым адресом managers@subbnet.ru для домена subbnet.ru.

Теперь добавим в нее три адреса:

> INSERT INTO forwardings (address, forwarding, domain, dest_domain, is_list, active) VALUES ('managers@subbnet.ru', 'postmaster@subbnet.ru', 'subbnet.ru', 'subbnet.ru', 1, 1);
> INSERT INTO forwardings (address, forwarding, domain, dest_domain, is_list, active) VALUES ('managers@subbnet.ru', 'test1@subbnet.ru', 'subbnet.ru', 'subbnet.ru', 1, 1);
> INSERT INTO forwardings (address, forwarding, domain, dest_domain, is_list, active) VALUES ('managers@subbnet.ru', 'example@gmail.com', 'subbnet.ru', 'gmail.com', 1, 1);

* в данном примере мы добавили в созданный адрес рассылки managers@subbnet.ru три адреса — postmaster@subbnet.rutest1@subbnet.ruexample@gmail.com. Обратите внимание, что последний адрес на бесплатном сервисе от Google.

Сбросить пароль

В бесплатной версии iredmail сброс паролей выполняется напрямую в СУБД или каталоге LDAP. Подробнее процедура описана на официальном сайте. Мы же рассмотрим пример работы с базой MySQL.

Создаем хэш для пароля:

doveadm pw -s 'ssha512'

Система попросит нас ввести дважды пароль — вводим тот, что хотим использовать. В итоге, мы получим хэш, например:

{SSHA512}53iNTXnhUNMXmhKOEARf38tD1I/xbafuQ3HIrQxCnI0Pxj0Ikp87rxnFE2bTEEEQHquU7+w9nwGlmTNqjqIHEqKgJhw=

Подключаемся к базе:

mysql -p

Выбираем базу:

> USE vmail

Смотрим пользователей:

> select username, isadmin, isglobaladmin from mailbox;

Сбрасываем пароль для пользователя с правами администратора, например:

> UPDATE mailbox SET password='{SSHA512}53iNTXnhUNMXmhKOEARf38tD1I/xbafuQ3HIrQxCnI0Pxj0Ikp87rxnFE2bTEEEQHquU7+w9nwGlmTNqjqIHEqKgJhw=' WHERE username='postmaster@subbnet.ru';

* в нашем примере, для postmaster@subbnet.ru.

Дополнительная настройка

Лимит на объем отправляемого сообщения

Задается командой:

postconf -e "message_size_limit = 31457280"

* в данном примере выставлен лимит в 30 мб.

После перезапускаем сервис Postfix:

systemctl restart postfix

Настройка администратора для домена

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

Создаем пользователя в iredadmin и подключаемся к SQL-оболочке, в зависимости от того, какая СУБД была установлена. В нашем примере, это mariadb:

mysql -uroot -p

Используем базу vmail:

> use vmail

Изменим настройки для созданного пользователя:

> UPDATE mailbox SET isadmin=1, isglobaladmin=0 WHERE username='postmaster@test.local';

* в данном примере мы указываем, что пользователь postmaster@test.local должен быть админом (isadmin=1), но не глобальным админом (isglobaladmin=0).

Теперь укажем, для какого домена пользователь должен быть администратором:

> INSERT INTO domain_admins (username, domain) VALUES ('postmaster@test.local', 'test.local');

* в данном примере мы добавили запись, в которой указали, что пользователь postmaster@test.local является администратором для домена test.local. При необходимости разрешить одному пользователю управлять несколькими доменами, мы должны выполнить несколько аналогичных запросов.

Перенаправление СПАМа на специальный ящик

По умолчанию, письма с отметкой [SPAM] в теме письма приходят на ящики пользователей. Если мы хотим, чтобы наш сервер пересылал все сообщения с подозрением на СПАМ в специальный ящик, выполняем следующее.

Открываем на редактирование файл:

vi /etc/postfix/header_checks

... и добавляем строку:

/^SUBJECT:\s+\[SPAM\]/ REDIRECT spam@subbnet.ru

* в даной инструкции мы говорим проверять заголовок, и если находим в теме [SPAM], перенаправляем письмо на ящик spam@subbnet.ru.

Проверяем настройку командой:

postmap -q "Subject: [SPAM] test" pcre:/etc/postfix/header_checks

Мы должны увидеть что-то на подобие:

REDIRECT spam@subbnet.ru

Теперь открываем файл:

vi /etc/postfix/master.cf

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

Перезапускаем службу mta:

systemctl restart postfix

Перенаправление почты для почтового ящика

Настройка пересылки писем через веб-интерфейс доступна только в Pro версии. В бесплатной это можно сделать с помощью прямых запросов в базу. Рассмотрим одну SQL-команду.

Подключаемся к базе данных:

mysql -uroot -p

Используем нашу базу для почты:

> use vmail

Создадим настройку для пересылки:

> INSERT INTO forwardings (address, forwarding, domain, dest_domain, is_forwarding, active) VALUES ('iredmail_user@subbnet.ru', 'other_user@example.com', 'subbnet.ru', 'example.com', 1, 1);

* в данном примере мы перенаправим всю почту, которая придет на адрес iredmail_user@subbnet.ru на почтовый ящик other_user@example.com.

Чтобы удалить перенаправление, сначала находим нужную нам строку:

> SELECT * FROM forwardings WHERE address!=forwarding;

Затем просто ее либо удаляем по идентификатору:

> DELETE FROM forwardings WHERE id='10';

* в моем примере нужная нам строка была под идентификатором 10.

... или можно просто отключить перенаправления, не трогая троку:

> UPDATE forwardings SET active='0' WHERE id='10';

Настройка политики паролей

По умолчанию, система требует сложные пароли. Если это нам мешает, мы можем поменять настройку в файле:

vi /opt/www/iredadmin/settings.py

Для длины пароля меняем:

min_passwd_length = 8
max_passwd_length = 0

А также дописываем те опции, которые хотим переопределить:

PASSWORD_HAS_LETTER = False
PASSWORD_HAS_UPPERCASE = False
PASSWORD_HAS_NUMBER = False
PASSWORD_HAS_SPECIAL_CHAR = False

* не рекомендуется отключать все требования. Стоит оставить только те, которые мешают работе.
** где:

  • PASSWORD_HAS_LETTER — должен ли пароль содержать буквы алфавита.
  • PASSWORD_HAS_UPPERCASE — должен ли содержать буквы в верхнем регистре.
  • PASSWORD_HAS_NUMBER — должны ли быть цифры.
  • PASSWORD_HAS_SPECIAL_CHAR — требуется ли использовать специальные символы.

Чтобы настройки применились, перезагружаем uwsgi:

systemctl restart uwsgi

Однако, в моем случае настройка не применилась. По ощущениям, из-за кэша. В итоге, помогла полная перезагрузка сервера.