Это вторая часть статьи о настройке почтового сервера. Расскажу о тестировании настроек почтового сервера и настройке его безопасности с помощью AppArmor, iptables и Fail2ban. Инструкция применима для Debian Linux и дистрибутива Ubuntu.
В этой статье:
Тестирование настроек почтового сервера
Настройка Firewall iptables
Настройка Fail2ban
Безопасность RoundCube
Создание профилей AppArmor
Процесс установки и настройки почтового сервера описал в первой части статьи — «Как настроить почтовый сервер в Debian и Ubuntu с ispmanager, чтобы защититься от спама»
Тестирование настроек почтового сервера
Проверять настройки почтового сервера можно с помощью бесплатного сервиса MxToolbox — анализировать DNS-записи, идентифицировать почтовые серверы и устранять проблемы с доставкой почты.
Вот как использовать MxToolbox:
Перейдите на сайт MxToolbox в раздел Email Health Report.
Введите доменное имя вашего почтового сервера (например, unixweb.info) или e-mail и нажмите Check Email Health. Измените доменное имя или email на ваши собственные данные.
![Тестирование настроек почтового сервера Тестирование настроек почтового сервера](https://habrastorage.org/getpro/habr/upload_files/505/858/65e/50585865e8d4d59a77b5c049141521ac.jpg)
Сервис предоставит вам информацию о состоянии DNS-записей, наличии внешних black-листов, настройках PTR ,SPF, DKIM.
Настройка Firewall iptables
Файрвол помогает контролировать входящие и исходящие соединения, блокируя нежелательный трафик и предотвращая возможные атаки.
Правила iptables по умолчанию после установки ispmanager:
Файл конфигурации iptables /etc/ispiptable.conf содержит правила для фильтрации сетевого трафика с использованием iptables в ispmanager:
cat /etc/ispiptable.conf
# Generated by iptables-save v1.8.7 on Sat May 18 23:58:32 2024
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:ispmgr_allow_ip - [0:0]
:ispmgr_allow_sub - [0:0]
:ispmgr_deny_ip - [0:0]
:ispmgr_deny_sub - [0:0]
:ispmgr_limit_req - [0:0]
# Применение цепочек для фильтрации трафика
-A INPUT -j ispmgr_deny_ip
-A INPUT -j ispmgr_allow_ip
-A INPUT -j ispmgr_allow_sub
-A INPUT -j ispmgr_deny_sub
-A INPUT -m set --match-set ispmgr_limit_req src -j DROP
# Разрешение доступа к порту 1501 для субсети
-A ispmgr_allow_sub -p tcp -m tcp --dport 1501 -j ACCEPT
COMMIT
# Completed on Sat May 18 23:58:32 2024
Из содержимого файла /etc/ispiptable.conf понятно, что все порты открыты. Это небезопасно. Для безопасной работы ispmanager нужно применить более строгие правила.
Вот как можно настроить iptables:
Открыть порты:
SMTP. Порты 25, 465, 587, протокол: TCP
IMAP. Порты 143, 993, протокол: TCP
POP3. Порты 110, 995, протокол: TCP
Обязательно нужно закрыть все входящие соединения, разрешить только установленные соединения, а затем открыть порты для следующих сервисов:
Ispmanager. Порт 1500, Протокол: TCP
HTTP. Порт 80, Протокол: TCP
HTTPS. Порт 443, Протокол: TCP
SSH. Порт 22, Протокол: TCP
FTP. Порт 21, Протокол: TCP
FTP пассивный режим. Диапазон 49152:65534, Протокол: TCP
DNS. Порт 53, Протокол: UDP
Чтобы открыть доступ к этим портам:
1. Добавьте правила для предоставления доступа к портам почтового сервера.
Для IPv4:
# Разрешение входящих соединений на порт 21 для FTP
sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# Разрешение входящих соединений на порты 49152-65534 для пассивного режима FTP
sudo iptables -A INPUT -p tcp --dport 49152:65534 -j ACCEPT
# Разрешение входящих соединений на порт 22 для SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Разрешение входящих соединений на порт 80 для HTTP
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Разрешение входящих соединений на порт 443 для HTTPS
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Разрешение входящих соединений на порт 1500 для ISPmanager
sudo iptables -A INPUT -p tcp --dport 1500 -j ACCEPT
# Разрешение входящих соединений на порт 53 для DNS
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
# Разрешение входящих соединений на порт 25 для SMTP
sudo iptables -A INPUT -p tcp --dport 25 -j ACCEPT
# Разрешение входящих соединений на порт 465 для SMTPS
sudo iptables -A INPUT -p tcp --dport 465 -j ACCEPT
# Разрешение входящих соединений на порт 587 для Submission
sudo iptables -A INPUT -p tcp --dport 587 -j ACCEPT
# Разрешение входящих соединений на порт 143 для IMAP
sudo iptables -A INPUT -p tcp --dport 143 -j ACCEPT
# Разрешение входящих соединений на порт 993 для IMAPS
sudo iptables -A INPUT -p tcp --dport 993 -j ACCEPT
# Разрешение входящих соединений на порт 110 для POP3
sudo iptables -A INPUT -p tcp --dport 110 -j ACCEPT
# Разрешение входящих соединений на порт 995 для POP3S
sudo iptables -A INPUT -p tcp --dport 995 -j ACCEPT
# Разрешение установленных соединений
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Разрешение входящих соединений на localhost
sudo iptables -A INPUT -i lo -j ACCEPT
# Установка политики по умолчанию для цепочки INPUT на DROP
sudo iptables -P INPUT DROP
Для IPv6:
# Разрешить входящие соединения на порт 21 для FTP.
sudo ip6tables -A INPUT -p tcp --dport 21 -j ACCEPT
# Разрешить входящие соединения на порты 49152-65534 для пассивного режима FTP.
sudo ip6tables -A INPUT -p tcp --dport 49152:65534 -j ACCEPT
# Разрешить входящие соединения на порт 22 для SSH.
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
# Разрешить входящие соединения на порт 80 для HTTP.
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
# Разрешить входящие соединения на порт 443 для HTTPS.
sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
# Разрешить входящие соединения на порт 1500 для ISPmanager.
sudo ip6tables -A INPUT -p tcp --dport 1500 -j ACCEPT
# Разрешить входящие соединения на порт 53 для DNS.
sudo ip6tables -A INPUT -p udp --dport 53 -j ACCEPT
# Разрешить входящие соединения на порт 25 для SMTP.
sudo ip6tables -A INPUT -p tcp --dport 25 -j ACCEPT
# Разрешить входящие соединения на порт 465 для SMTPS.
sudo ip6tables -A INPUT -p tcp --dport 465 -j ACCEPT
# Разрешить входящие соединения на порт 587 для Submission.
sudo ip6tables -A INPUT -p tcp --dport 587 -j ACCEPT
# Разрешить входящие соединения на порт 143 для IMAP.
sudo ip6tables -A INPUT -p tcp --dport 143 -j ACCEPT
# Разрешить входящие соединения на порт 993 для IMAPS.
sudo ip6tables -A INPUT -p tcp --dport 993 -j ACCEPT
# Разрешить входящие соединения на порт 110 для POP3.
sudo ip6tables -A INPUT -p tcp --dport 110 -j ACCEPT
# Разрешить входящие соединения на порт 995 для POP3S.
sudo ip6tables -A INPUT -p tcp --dport 995 -j ACCEPT
# Разрешить установленные соединения и связанные пакеты.
sudo ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Разрешить локальные петлевые соединения (localhost).
sudo ip6tables -A INPUT -i lo -j ACCEPT
# Установить политику по умолчанию для цепочки INPUT на DROP (блокировать все входящие соединения).
sudo ip6tables -P INPUT DROP
2. Проверьте, что правила добавлены.
Для IPv4:
sudo iptables -L -vn
Для Ipv6:
sudo ip6tables -L -vn
3. Сохраните изменения:
Для IPv4:
sudo iptables-save > /etc/ispiptable.conf
Для IPv6:
sudo ip6tables-save > /etc/ispip6table.conf
Теперь ваш почтовый сервер защищен от несанкционированного доступа и будет работать корректно.
Настройка Fail2ban для Exim и Dovecot
Fail2ban автоматически реагирует на подозрительные активности и предотвращает брутфорс-атаки.
Установка Fail2ban.
В интерфейсе ispmanager:
Перейдите в «Сервер» → «Установка ПО».
Выберите Fail2ban и установите его.
В командной строке:
sudo apt-get install fail2ban
Настройка конфигурации Fail2ban в интерфейсе ispmanager:
1. Войдите в интерфейс ispmanager.
2. Перейдите в раздел «Мониторинг и журналы».
3. Выберите «Сетевые службы».
Сетевые службы:
![Мониторинг и журналы > Сетевые службы Мониторинг и журналы > Сетевые службы](https://habrastorage.org/getpro/habr/upload_files/311/fd8/909/311fd890934a7b51bfac27911cb1e8dd.jpg)
3. Отметьте нужный сервис, который вы хотите защитить — например, sshd
. Нажмите кнопку «Правила Fail2ban». Откроется страница «Правила службы».
4. Выберите соответствующий сервис — в нашем примере sshd
и активируйте правило, нажав соответствующую кнопку, как показано в примерах.
Правила службы:
![Мониторинг и журналы > Сетевые службы > Правила Fail2ban > Правила службы Мониторинг и журналы > Сетевые службы > Правила Fail2ban > Правила службы](https://habrastorage.org/getpro/habr/upload_files/14c/aca/16e/14caca16edeaee422b65ac45bd9440be.jpg)
Чтобы предотвратить блокировки вашего IP Fail2ban:
1. Перейдите в раздел «Мониторинг и журналы»
2. Выберите «Сетевые службы».
3. Нажмите на кнопку «Настройки Fail2ban». Откроется страница «Глобальные настройки Fail2ban», где вы сможете установить количество попыток и время бана.
Также установите:
ваш IP в поле «Никогда не банить»,
галочку «Применить ко всем правилам».
4. Нажмите «Сохранить».
Перезапустите Fail2ban в интерфейсе ispmanager:
1. Перейдите в «Сервер» → «Управление службами».
2. Выберите Fail2ban и перезапустите его.
Какие сложности могут возникнуть. Я нашел недочет в операционной системе — не установлен rsyslog
. Вот как можно поправить работу правила Dovecot в Fail2ban:
1. Установка rsyslog
:
sudo apt install rsyslog
2. Создание файла /var/log/mail.log
и установка прав:
sudo touch /var/log/mail.log && sudo chown syslog:adm /var/log/mail.log
3. Повторный перезапуск rsyslog
и dovecot
:
sudo systemctl restart rsyslog dovecot
4. Проверка работы лога:
sudo tail -f /var/log/mail.log
Jun 17 22:31:02 mail dovecot: master: Warning: Killed with signal 15 (by pid=3037075 uid=0 code=kill)
Jun 17 22:31:03 mail dovecot: master: Dovecot v2.3.16 (7e2e900c1a) starting up for imap, pop3 (core dumps disabled)
Jun 17 22:31:03 mail dovecot: config: Warning: /etc/dovecot/conf.d/90-plugin.conf line 12: Global setting mail_plugins won't change the setting inside an earlier filter at /etc/dovecot/conf.d/15-lda.conf line 47 (if this is intentional, avoid this warning by moving the global setting before /etc/dovecot/conf.d/15-lda.conf line 47)
Основной лог ведется, не вижу смысла в детальном его анализе, так как это не является критичным.
5. Перезапуск fail2ban
:
sudo fail2ban-client restart
После выполнения этих шагов все правила заработали. Проверка статуса Fail2ban показала следующее:
sudo fail2ban-client status
Status
|- Number of jail: 5
`- Jail list: dovecot, exim-isp, exim-spam, sieve, sshd
Настройка конфигурации Fail2ban в командной строке
Произведите изменения в файле /etc/fail2ban/jail.local
:
# ispmanager start
[sshd]
maxretry = 5
enabled = true
backend = systemd
[exim-isp]
port = smtp,465,submission
logpath = %(exim_main_log)s
maxretry = 3
enabled = true
[exim-spam]
port = smtp,465,submission
logpath = %(exim_main_log)s
maxretry = 3
enabled = true
[dovecot]
port = pop3,pop3s,imap,imaps,submission,465,sieve
logpath = %(dovecot_log)s
backend = %(dovecot_backend)s
maxretry = 3
enabled = true
[sieve]
port = smtp,465,submission
logpath = %(dovecot_log)s
backend = %(dovecot_backend)s
maxretry = 3
enabled = true
# ispmanager end
Чтобы предотвратить блокировку вашего IP Fail2ban, добавьте ваш IP в секцию ignoreip
в файле конфигурации [DEFAULT]
, как показано в примере ниже. Замените 1.2.3.4
на ваш текущий IP-адрес:
[DEFAULT]
bantime = 600
ignoreip = 1.2.3.4
maxretry = 3
Сохраните изменения и перезапустите правила в Fail2ban с помощью команды sudo fail2ban-client reload.
4. Перезапустите Fail2ban с помощью команды:
sudo service fail2ban restart
Теперь Fail2ban будет следить за логами Exim и Dovecot, блокируя подозрительные IP-адреса. Это обезопасит ваш почтовый сервер.
Безопасность RoundCube
RoundCube – это веб-почтовый клиент, который предоставляет доступ к электронной почте через веб-интерфейс и программное обеспечение с открытым исходным кодом, уязвимости которого часто публикуются в базах данных, таких как exploit-db.com. Описанные в этой главе меры помогают минимизировать риск эксплуатации этих уязвимостей злоумышленниками.
Ограничение доступа к RoundCube это:
Безопасность. Ограничение доступа помогает предотвратить несанкционированный доступ к почтовым ящикам и конфиденциальной информации.
Защита от спама и фишинга. Ограничение доступа помогает предотвратить злоумышленникам использование RoundCube для массовой рассылки спама или фишинговых писем.
Ресурсоэффективность. Ограничение доступа помогает управлять нагрузкой на сервер, предотвращая избыточные запросы к RoundCube.
Соответствие стандартам безопасности. Многие организации обязаны соблюдать определенные стандарты безопасности и конфиденциальности данных. Ограничение доступа к почтовым клиентам помогает соответствовать этим требованиям.
Список эксплойтов:
![Список эксплойтов RoundCube Список эксплойтов RoundCube](https://habrastorage.org/getpro/habr/upload_files/5e7/94f/a06/5e794fa06bc7cb7358384acd12eb31e4.jpg)
Рекомендации по обеспечению безопасности в RoundCube.
Регулярно обновляйте RoundCube и все его зависимости для устранения возможности эксплуатации возможных уязвимостей.
В данном примере рассмотрю методы ограничения доступа по IP-адресам, конфигурацию web-сервера Nginx, .htaccess
файла и изменение параметров в самом RoundCube и общие рекомендации.
Настройка web-сервера (Nginx):
Для Nginx можно использовать директиву allow
и deny
в конфигурационном файле:
cat /etc/nginx/vhosts-includes/roundcube-nginx.conf
location /roundcube {
allow 1.2.3.4;
allow 192.168.1.0/24;
deny all;
alias /var/lib/roundcube;
index index.php;
}
location ~* ^/roundcube/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
alias /var/lib/roundcube/$1;
error_page 404 @apache;
}
location ~ ^/roundcube/(.+\.php)$ {
allow 1.2.3.4;
allow 192.168.1.0/24;
deny all;
alias /var/lib/roundcube/$1;
fastcgi_pass unix:/var/run/php-fpm.www-data.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param PHP_VALUE "display_errors=off \n display_startup_errors=off";
include fastcgi_params;
error_page 502 = @apache;
error_page 404 = @apache;
}
location @apache {
error_log /dev/null crit;
proxy_pass http://127.0.0.1:8080;
proxy_redirect http://127.0.0.1:8080 /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Для ограничения доступа к RoundCube достаточно использовать следующие настройки — замените 1.2.3.4
и 192.168.1.0/24
на IP-адреса администраторов.
Для предотвращения случайного изменения конфигурации во время обновлений, выполните команду:
sudo chattr +i /etc/nginx/vhosts-includes/roundcube-nginx.conf
Настройка самого RoundCube. В конфигурационном файле RoundCube /etc/roundcube/config.inc.php
можно добавить проверку IP-адреса:
$allowed_ips = array('1.2.3.4', '192.168.1.0/24');
if (!in_array($_SERVER['REMOTE_ADDR'], $allowed_ips)) {
die('Access denied');
}
Пожалуйста, обратите внимание, что обновления RoundCube могут затереть изменения в этом файле. Чтобы защитить файл конфигурации от случайных изменений, выполните следующую команду в терминале:
sudo chattr +i /etc/roundcube/config.inc.php
Настройка .htaccess
файла:
В файле .htaccess
можно указать разрешенные IP-адреса:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^1\.2\.3\.4$
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+$
RewriteRule ^ - [F,L]
</IfModule>
Этот сценарий актуален, когда RoundCube работает под управлением Apache. При настройках по умолчанию в ispmanager файл .htaccess
не работает.
В этой главе описаны лишь базовые методы обеспечения безопасности RoundCube. Если есть вопросы — задавайте в комментариях.
Профили AppArmor для Exim, Dovecot, RoundCube
AppArmor изолирует каждое приложение и ограничивает доступ приложений к системным ресурсам. Это уменьшает риски несанкционированного доступа.
Важно! Невозможно учесть все детали и создать универсальные правила AppArmor для каждого случая.
Скрипт и профили AppArmor распространяются под лицензией GPL-3.0. Загружая скрипт, вы делаете это на свой страх и риск и несете ответственность за его использование.
Итоги и рекомендации
Советы по дальнейшей настройке и обслуживанию почтового сервера:
В двух частях статьи я рассмотрел шаги по созданию и настройке безопасного и функционального почтового сервера. Вы сможете настроить почтовый сервер так, чтобы ваши письма не попадали в спам.
Использовали:
AppArmor, который ограничивает действия приложений и повышает общий уровень защиты.
Сетевой фильтр с настройкой iptables — используется для управления сетевыми соединениями и предотвращения несанкционированного доступа.
Fail2ban для защиты от брутфорс-атак — он автоматически блокирует вредоносные IP-адреса.
Greylisting, DNSBL, SpamAssassin для борьбы со спамом.
ClamAV для антивирусной защиты — обеспечивает сканирование и защиту от вредоносного ПО. А еще дополнительно ограничивает доступ к RoundCube — оставляет его только для пользователей из белого списка.
Пять рутин, чтобы обеспечить безопасность почтового сервера:
Регулярные обновления. Убедитесь, что все компоненты почтового сервера и системы безопасности регулярно обновляются для защиты от новых угроз.
Мониторинг. Используйте инструменты мониторинга для отслеживания производительности и безопасности сервера, реагируя на подозрительные активности.
Резервное копирование. Настройте регулярные резервные копии данных почтового сервера, чтобы не потерять информацию .
Пользовательская политика и обучение. Создайте и применяйте строгие политики безопасности для пользователей. Как минимум, контролируйте, чтобы пользователи создавали сложные пароли, устанавливали двухфакторную аутентификацию, знали как безопасно использовать почтовые сервисы.
Вот еще мои статьи на Хабре по теме информационной безопасности: