суббота, 23 декабря 2017 г.

Организация черных списков для почтового сервера Exim.

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

Сейчас я не буду описывать как я реализовывал почтовик у себя дома, о этом в другой раз. Я опишу только одну из проблем с которой столкнулся буквально спустя несколько часов после старта, или скорее после факта открытия 25 порта на моём внешнем интерфейсе. Меня просто и незатейливо начали брутфорсить. Должен отметить что при обслуживании корпоративных почтовых систем я такого ни разу не наблюдал (видимо подсеть не та или мне просто везло).


На другой платформе я бы воспользовался как и всегда решением известным наверное любому, даже начинающему администратору, связкой exim+fail2ban+iptables, но не в данном случае. У меня просто ничего не вышло, exim работает на сетевом накопителе iomega с установленным Debian 7 в ядре которого напрочь отсутствует возможность работы с iptables. Проблему пришлось решать другими средствами.

Использованием черных списков. 
Поскольку все источники атаки были из одной подсети,  назовем её для примера 1.2.3.0/24, используем возможности  самого exim и добавим проверку на этапе acl_smtp_connect на наличие адреса хоста в нашем черном списке.

В раздел правил acl  файла конфигурации добавим следующий раздел:
    acl_check_connect:
    # проверяем находиться ли отправитель в черном списке
    drop message = "Your IP $sender_host_address in black list."
    hosts = +bad_hosts
    accept

А также в начало файла конфигурации, добавим определение списка узлов которое будем брать из файла bad_hosts расположенного в каталоге  /etc/exim4

# Список узлов и доменов от которых ничего не принимаем
hostlist bad_hosts = /etc/exim4/bad_hosts
Нужно создать файл /etc/exim4/bad_hosts со списком адресов и сетей от которых мы не желаем принимать соединения, примерно такого  содержания:

1.2.3.0/24

Ну и конечно определение правил проверок 

acl_smtp_connect = acl_check_connect


В двух словах работает это так: на этапе установления соединения с smtp сервером exim проверяет не значится ли желающий подключиться в нашем черном списке, если нет то все в порядке, но если да и клиент уже заработал на попадание в список, соединение принудительно обрывается после отсылки сообщения об ошибке.

ЗЫ. Мой описанный здесь опыт не претендует на уникальность, но возможно будет полезен тем кто впервые столкнулся с данной частной проблемой навигации в открытом интернете ;)

Материалы по теме:
http://bog.pp.ru/work/exim.html
https://www.lissyara.su/doc/exim/4.62/
https://www.lissyara.su/doc/exim/4.62/access_control_lists/

Комментариев нет: