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

Содержание статьи
- 1 Предварительные требования
- 2 Внесите IP-адрес VPN-сервера в исключения брандмауэра.
- 3 Закройте порт для отправки, а также порты IMAP и POP3
- 4 Обеспечение безопасности панели управления и веб-почты
- 5 Отключение функции DNS по протоколу HTTPS в вашем браузере
- 6 Обновление TLS сертификата с использованием Certbot
- 7 Заблокировать порт SSH?
- 8 Итоговый анализ
Предварительные требования
Предполагается, что у вас уже есть функционирующий почтовый сервер. Если это не так, воспользуйтесь одним из указанных ниже руководств для настройки собственного сервера.
- Как просто создать полноценный почтовый сервер на Ubuntu 20.04 с помощью iRedMail.
- Как просто установить почтовый сервер на Debian 10 Buster с помощью iRedMail.
Предполагается, что у вас уже настроен VPN-сервер. Если это не так, пожалуйста, воспользуйтесь одним из предложенных ниже руководств. Почтовый сервер и VPN-сервер могут функционировать как на разных хостах, так и на одном и том же.
- Создание личного VPN-сервера WireGuard на Ubuntu.
Рекомендуется размещать 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.
Порты 587 и 465 служат для отправки электронных писем через почтовые клиенты, такие как Mozilla Thunderbird и Microsoft Outlook. Злоумышленники могут осуществлять атаки методом перебора на эти порты.
В моем почтовом журнале (/var/log/mail.log на Debian/Ubuntu, /var/log/maillog на CentOS/RHEL) я нашел следующий случай: некомпетентный злоумышленник пытался получить доступ к системе, но каждый раз сталкивался с неудачей при аутентификации SASL.
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 commands=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 commands=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 commands=2/3
Мне не нравится подобная активность в моем почтовом журнале, поэтому я блокирую порты 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 хосты, которые нужно оставить доступными в Интернете. Вместо блокировки портов 80 и 443 в файрволе, разумнее воспользоваться встроенными механизмами контроля доступа в 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;

При наличии нескольких VPN-серверов вы можете добавить несколько IP-адресов следующим образом:
allow 12.34.56.78Конечно, напишите текст, который нужно перефразировать.12.34.56.79; 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-адреса не смогут подключиться.
<locationMatch "^/">Требуется IP.12.34.56.78

Если у вас имеется несколько 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-сертификата Let’s Encrypt через вызов HTTP-01. Чтобы избежать этой проблемы, можно временно отключить белый список перед обновлением сертификата, а затем включить его обратно после завершения процесса.
Создайте скрипт оболочки в директории /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:

