В данном руководстве я хочу поделиться своими рекомендациями по защите почтовых серверов от атак хакеров с использованием собственного VPN-сервера. Множество спамеров пытаются взломать почтовые серверы других пользователей. Если им удается это сделать, они используют захваченные серверы для массовой рассылки спама или кражи конфиденциальной информации. Почему мы выбираем собственный VPN-сервер? Он позволяет создать белый список, благодаря которому только проверенные пользователи, подключенные к VPN, могут получить доступ к вашему почтовому серверу.
Содержание статьи
- 1 Начальные условия
- 2 Внесите IP-адрес VPN-сервера в исключения брандмауэра
- 3 Отключите порты для подачи, IMAP и POP3.
- 4 Обеспечение безопасности административной панели
- 5 Отключение функции DNS через HTTPS в вашем интернет-браузере
- 6 Обновление сертификата TLS с помощью Certbot
- 7 Закрыть доступ к порту SSH?
Начальные условия
Предполагается, что у вас уже имеется работающий почтовый сервер. Если это не так, воспользуйтесь одним из нижеуказанных руководств для его настройки.
- Простой способ развернуть полноценный почтовый сервер на Ubuntu 20.04 с помощью iRedMail.
- Как просто установить почтовый сервер на Debian 10 Buster с помощью iRedMail.
Предполагается, что вы уже настроили VPN-сервер. Если это не так, пожалуйста, ознакомьтесь с одним из следующих руководств. Почтовый сервер и VPN-сервер могут находиться на разных хостах или на одном и том же.
- Установите и настройте личный VPN-сервер WireGuard на Ubuntu.
- Настройка собственного сервера VPN с использованием WireGuard на операционной системе Debian
Рекомендуется размещать VPN сервер и почтовый сервер на различных хостах, чтобы упростить управление. Если оба сервера находятся на одном хосте, то нужно будет выполнить дополнительные настройки, включая конфигурацию зоны политик ответа на VPN сервере для изменения DNS A записи хоста вашего почтового сервера.
- Конфигурация зоны политик ответа (RPZ) в DNS-резольвере BIND на системах Debian/Ubuntu.
Если 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 сервера в белый список брандмауэра почтового сервера. Если у вас установлен брандмауэр UFW (на Debian/Ubuntu), выполните следующую команду на почтовом сервере, заменив 12.34.56.78 на IP-адрес вашего VPN сервера.
sudo ufw insert 1 allow in from 12.34.56.78
Вы можете включить в белый список IP-адреса других ваших серверов. К примеру, у некоторых пользователей может быть отдельный веб-сервер, который должен отправлять письма через почтовый сервер. В таком случае не забудьте добавить его в белый список.
sudo ufw insert 1 allow in from IP-адрес-другого-веб-сервера
Отключите порты для подачи, IMAP и POP3.
- Порты для подключения: 587 и 465.
- Порты для IMAP: 143 и 993.
- Порты для POP3: 110 и 995.
Почтовые клиенты, например, Mozilla Thunderbird и Microsoft, применяют порты 587 и 465.
postfix/smtps/smtpd[18071]:
Мне не нравится такая активность в моем почтовом журнале, поэтому я просто блокирую порты 587, 465, 143, 993, 110 и 995 в брандмауэре. Поскольку IP-адрес моего VPN-сервера находится в белом списке, только те, кто подключен к нему, могут получить доступ к этим портам.
Для того чтобы заблокировать эти порты в брандмауэре UFW, начните с отображения текущих правил вашего брандмауэра.
sudo ufw status numbered

Существуют правила как для IPv4, так и для IPv6. Для того чтобы закрыть порт 587, необходимо удалить правила под номерами 16 и 6. (Сначала следует удалить правило с большим номером.)
sudo ufw delete 16 sudo ufw delete 6
После этого следует повторно выполнить команду sudo ufw status numbered, чтобы получить обновленный список правил брандмауэра. Учтите, что для некоторых правил изменился номер индекса.

В этот раз мне нужно заблокировать порт 465, поэтому необходимо удалить правила под номерами 15 и 6.
sudo ufw delete 15 sudo ufw delete 6
После этого примените аналогичный подход для блокировки портов 143, 993, 110 и 995. Не забудьте оставить порт 25 открытым, чтобы иметь возможность получать электронные письма от других SMTP-серверов.
Обеспечение безопасности административной панели
Закрытие TCP портов 80 и 443 поможет защитить административную панель и веб-почту от несанкционированного доступа. Однако это приведет к тому, что все виртуальные хосты станут недоступны для общего пользования. Некоторые пользователи могут иметь виртуальные хосты в Apache или Nginx, которые необходимо оставить открытыми для интернета. Вместо блокировки этих портов в файрволе целесообразнее воспользоваться встроенной функцией контроля доступа в Apache или Nginx.
Измените конфигурационный файл виртуального хоста для веб — почты, например.
sudo nano /etc/nginx/conf.d/mail.your-domain.com.conf
Включите указанные строки в раздел SSL-сервера, работающего на порту 443. (Блок сервера на порту 80 можно не учитывать.) Это ограничит доступ к веб-почте только для IP-адреса 12.34.56.78 и запретит вход для всех остальных адресов.
allow 12.34.56.78; deny all;

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

Измените конфигурационный файл виртуального хоста для веб — почты, например.
sudo nano /etc/apache2/sites-enabled/mail.your-domain.com-le-ssl.conf
Вставьте указанные строки между тегами..Данный подход обеспечит доступ к веб-почте исключительно для IP-адреса 12.34.56.78, в то время как всем остальным IP-адресам будет отказано в доступе.

Если у вас имеется несколько VPN-серверов, вы можете добавить несколько IP-адресов следующим образом:
<locationMatch "^/">Требуется IP.12.34.56.78 12.34.56.79
Сохраните файл и закройте его. После этого проверьте настройки Apache.
sudo apache2ctl - t
Если синтаксис корректен, перезапустите Apache для применения изменений.
sudo systemctl reload apache2
Пользователи, не включенные в белый список, столкнутся с ошибкой 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-сертификата через задачу HTTP-01. Для решения этой проблемы можно временно отключить белый список перед обновлением сертификата, а затем снова активировать его после завершения обновления.
Напишите shell-скрипт в директории /root/.
sudo nano /root/certbot-renewal.sh
Если вы работаете с Nginx, внесите эти строки в указанный файл.
#! /bin/bash # отключить белый список sed - i 's/deny all;/#deny all;/g' /etc/nginx/conf.d/mail.your-domain.com
Чтобы обновить TLS-сертификат, выполните команду:
systemctl reload nginx
Для автоматического обновления сертификата используйте
certbot renew --quiet
Чтобы активировать белый список, отредактируйте файл командой:
sed - i 's/#deny all;/deny all;/g' /etc/nginx/conf.d/
.mail.your-domain.com.conf systemctl reload nginx postfix dovecot
Если вы работаете с Apache, вставьте указанные строки в данный файл.
#! /bin/bash # отключить белый список sed - i 's/Require ip/#Require ip/g' /etc/apache2/sites-enabled/mail.your-domain.com-nle-ssl.conf systemctl reload apache2 # обновить сертификат TLS certbot renew --quiet # активировать белый список sed - i 's/#Require ip/Require ip/g' /etc/apache2/sites-enabled/mail.your-domain.com-le-ssl.conf systemctl reload apache2 postfix dovecot
Сохраните изменения и закройте документ. После этого предоставьте права на выполнение для данного файла.
sudo chmod +x /root/certbot-renewal.sh
После этого внесите изменения в файл crontab для пользователя root.
sudo crontab -e
Вставьте следующую строку в конец файла, чтобы ваш shell-скрипт запускался ежедневно.
@daily bash /root/certbot-renewal.sh
Сохраните изменения и закройте документ.
Закрыть доступ к порту SSH?
Поскольку IP-адрес вашего VPN-сервера внесён в белый список, вы можете закрыть порт SSH в файрволе. Однако это связано с определёнными рисками: если VPN-сервер выйдет из строя, вы окажетесь в затруднительном положении. Для повышения безопасности SSH-сервиса советую настроить аутентификацию с использованием открытых ключей или двухфакторную аутентификацию.
- Два легких шага для конфигурации входа по SSH без использования пароля в Ubuntu.
- Конфигурация двухфакторной аутентификации SSH (2FA) на сервере Ubuntu.

