В этом материале я расскажу о своих рекомендациях по обеспечению безопасности почтовых серверов на базе CentOS/RHEL с использованием личного VPN. Часто злоумышленники пытаются атаковать чужие почтовые серверы, и если им это удается, они могут использовать сервер для массовой рассылки спама или кражи информации. Использование собственного VPN-сервера оправдано, так как он позволяет настроить белый список, ограничивая доступ к почтовому серверу только для доверенных пользователей, подключенных к VPN.

Содержание статьи
Предварительные требования
Ожидается, что у вас уже имеется действующий почтовый сервер. Если это не так, воспользуйтесь одним из приведенных ниже руководств для его настройки.
- Как просто установить полноценный почтовый сервер на CentOS 8 с помощью iRedMail.
Предполагается, что вы уже настроили VPN-сервер. Если это не так, пожалуйста, обратитесь к одному из приведенных ниже руководств. Почтовый сервер и VPN могут функционировать на разных хостах или на одном и том же.
- Создайте личный VPN-сервер WireGuard на CentOS.
Рекомендуется размещать VPN-сервер и почтовый сервер на разных хостах, чтобы снизить сложность управления. При их размещении на одном хосте потребуется выполнить дополнительные настройки: в частности, задать политику ответов на VPN-сервере, чтобы изменить публичную DNS A-запись, связанную с именем почтового сервера.
- Конфигурация зоны политики ответов (RPZ) в резолвере BIND на CentOS/RHEL.
Если DNS A-запись для mail.yourdomain.com указывает на 12.34.56.78, необходимо добавить запись в зоне политики ответа, которая будет перенаправлять этот адрес на приватный IP VPN-сервера — 10.10.10.1.
В последующих текстах я буду использовать 12.34.56.78 в качестве публичного IP-адреса для VPN-сервера. В случае, если VPN-сервер и почтовый сервер расположены на одном хосте, необходимо заменить 12.34.56.78 на частный IP-диапазон VPN 10.10.10.0/24.
Внесите IP-адрес VPN-сервера в список разрешенных в брандмауэре.
После настройки и запуска почтового сервера и VPN-сервера необходимо внести IP-адрес VPN-сервера в белый список брандмауэра почтового сервера. Если у вас установлен Firewalld (CentOS/RHEL), выполните следующую команду.
postfix/smtps/smtpd[18071]: Анонимное TLS-соединение установлено от unknown[92.118.38.56]: TLSv1.2 с шифром ECDHE-RSA-AES256-GCM-SHA384 (256/256 бит) postfix/smtps/smtpd[18071]: предупреждение: unknown[92.118.38.56]: SASL LOGIN аутентификация не удалась: UGFzc3dvcmQ6 postfix/smtps/smtpd[18071]: потеряно соединение после AUTH от unknown[92.118.38.56] postfix/smtps/smtpd[18071]: отключение от unknown[92.118.38.56] ehlo=1 auth=0/1 rset=1 команды=2/3 postfix/smtps/smtpd[18071]: соединение от unknown[92.118.38.56] postfix/smtps/smtpd[18071]: Анонимное TLS-соединение установлено от unknown[92.118.38.56]: TLSv1.2 с шифром ECDHE-RSA-AES256-GCM-SHA384 (256/256 бит) postfix/smtps/smtpd[18071]: предупреждение: unknown[92.118.38.56]: SASL LOGIN аутентификация не удалась: UGFzc3dvcmQ6 postfix/smtps/smtpd[18071]: потеряно соединение после AUTH от unknown[92.118.38.56] postfix/smtps/smtpd[18071]: отключение от unknown[92.118.38.56] ehlo=1 auth=0/1 rset=1 команды=2/3 postfix/smtps/smtpd[18071]: соединение от unknown[92.118.38.56] postfix/smtps/smtpd[18071]: Анонимное TLS-соединение установлено от unknown[92.118.38.56]: TLSv1.2 с шифром ECDHE-RSA-AES256-GCM-SHA384 (256/256 бит) postfix/smtps/smtpd[18071]: предупреждение: unknown[92.118.38.56]: SASL LOGIN аутентификация не удалась: UGFzc3dvcmQ6 postfix/smtps/smtpd[18071]: потеряно соединение после AUTH от unknown[92.118.38.56] postfix/smtps/smtpd[18071]: отключение от unknown[92.118.38.56] ehlo=1 auth=0/1 rset=1 команды=2/3
Я предпочитаю не наблюдать подобную активность в своем почтовом журнале, поэтому закрываю порты 587, 465, 143, 993, 110 и 995 в брандмауэре. Так как IP-адрес моего VPN-сервера находится в белом списке, только те, кто подключен к нему, смогут получить доступ к этим портам.
Для отключения служб imap, imaps, smtp-submission, smtps, pop3 и pop3s на CentOS/RHEL выполните следующие две команды.
sudo firewall-cmd --permanent --remove-service= sudo firewall-cmd --permanent --remove-port=
Если вам попалось предупреждение, такое как Warning: NOT_ENABLED: smtps, не обращайте на него внимания. Чтобы изменения начали действовать, перезапустите firewalld.
sudo systemctl reload firewalld
Безусловно, необходимо оставить порт 25 открытым для приема электронных писем от других SMTP-серверов.
Обеспечение безопасности администраторской панели и веб-электронной почты.
Можно закрыть порты 80 и 443, чтобы обеспечить безопасность администраторской панели и веб-почты от потенциальных атак. Однако это приведет к ограничению публичного доступа ко всем виртуальным хостам. У некоторых пользователей могут быть настроены виртуальные хосты в Apache или Nginx, которые необходимо оставить открытыми для интернета. Вместо блокировки портов 80 и 443 в брандмауэре разумнее воспользоваться функцией контроля доступа, которая уже встроена в Apache и Nginx.
Nginx
Измените конфигурационный файл виртуального хоста для веб-почты, например.
sudo nano /etc/nginx/conf.d/mail.your-domain.com.conf
Включите указанные строки в контекст.<. >серверы. Это обеспечит доступ к веб-почте только для IP-адреса 12.34.56.78, в то время как все остальные IP-адреса будут заблокированы.
allow 12.34.56.78; deny all;

Если у вас имеется несколько VPN-серверов, можно добавить несколько IP-адресов следующим образом:
allow 12.34.56.78Разрешить12.34.56.79; deny all;
Сохраните файл и закройте его. После этого проверьте настройки Nginx.
sudo nginx - t
После успешного тестирования перезапустите Nginx, чтобы изменения начали действовать.
sudo systemctl reload nginx
Пользователи, не внесенные в белый список, получат сообщение об ошибке 403: доступ запрещен.

Apache
Измените конфигурационный файл виртуального хоста для веб-почты, расположенный в директории /etc/httpd/conf.d/, например
sudo nano /etc/httpd/conf.d/mail.your-domain.com-le-ssl.conf
Вставьте указанные строки в пределах тегов.

Если у вас имеется несколько VPN-серверов, можно добавить несколько IP-адресов следующим образом:
Сохраните файл и закройте его. После этого проверьте настройки Apache.
sudo apachectl - t
При правильном синтаксисе выполните перезагрузку Apache, чтобы изменения начали действовать.
sudo systemctl reload httpd
Пользователи, не имеющие доступа, столкнутся с ошибкой 403 — доступ запрещён.

Выключите DNS через HTTPS в вашем интернет-браузере.
Если VPN-сервер и почтовый сервер размещены на одном хосте, вам следует отключить DNS через HTTPS в вашем браузере.
- Когда ваш компьютер соединён с VPN-сервером, ваш DNS-трафик уже защищён шифрованием, поэтому функция DNS через HTTPS в браузере вам не требуется.
- При активированном DNS через HTTPS в веб-браузере используется внешний DNS-резольвер, что означает, что ваш собственный резольвер не будет задействован, и вы не сможете получить доступ к панели администратора и веб-почте.
В Firefox данная опция расположена в сетевых настройках. В Chrome её можно найти в разделе конфиденциальности и безопасности (защищенный DNS). После отключения рекомендуется закрыть браузер и подождать около минуты. Затем у вас будет возможность зайти в панель администратора и веб-почту. Если проблема не исчезнет, попробуйте очистить кэш вашего браузера.
Обратите внимание: хотя вы можете настроить собственный DNS через HTTPS-резольвер, это не является обязательным, если вы используете свой собственный VPN-сервер.
Обновление TLS-сертификата с помощью Certbot.
Включение белого списка в виртуальном хосте Apache или Nginx может привести к блокировке доступа серверов Let’s Encrypt к вашему веб-серверу, что необходимо для обновления TLS-сертификата Let’s Encrypt через HTTP-01. Чтобы избежать этой проблемы, можно временно отключить белый список во время процесса обновления сертификата и вновь активировать его после завершения обновления.
Сформируйте скрипт-оболочку в директории /root/.
sudo nano /root/certbot-renewal. sh
Если вы работаете с Nginx, внесите указанные ниже строки в этот файл.
#! /bin/bash # отключить белый список в виртуальном хосте Nginx sed - i 's/deny all;/#deny all;/g' /etc/nginx/conf.d/mail.your-domain.comВот перефразированный текст:

