Чуть-чуть про безопасность в Exim


Пока игрался с Exim, случайно оставил дырочку или точнее ОГРОМНОЕ ОТВЕРСТИЕ для использования сервера в качестве релей - для авторизации достаточно было подобрать пользователя, пароль мог быть любым.

Проблему нашел по жалобам пользователей, что почта подтормаживает и письма странно уходят - то уходят, то не уходят и загрузка системы подпрыгнула 2-3% до 100%.

Оказалось, что за несколько часов, через меня пытались отправить около 50 тысяч сообщений под одной учеткой. Сначала подумал, что как-то подняли пароль к учетке и этим воспользовались, но потом разобрался, что сам дурак и закрыл все.

Дыру использовали 15-17 часов, за это время успел попасть в некоторые спам листы и уронить рейтинг. Задумался, что нужно бороться (ну не только с собственной глупостью) с тем, чтобы при получении доступа к серверу минимизировать урон.

Оказалось, что Exim легко умеет ограничивать количество отправленной почты в единицу времени. Не совсем понятно, почему это не прикручено по умолчанию, с какими-нибудь небольшими лимитами. Кому нужно, найдут сразу, а у остальных будет мелкая дополнительная защита от возможности больших лишних рассылок.

Добавил в exim/configure в секцию acl_check_rcpt:

#  warn ratelimit = 2 / 1h / strict / $authenticated_id
#     log_message = Sender $sender_address rate $sender_rate / $sender_rate_period (for control ratelimit)

  deny authenticated = *
                message = Sender rate SMTP overlimit - $sender_rate / $sender_rate_period
                ratelimit = 20 / 1h / strict / $authenticated_id
                log_message = Auth_id: $authenticated_id Sender: $sender_address block by ratelimit 1h $sender_rate / $sender_rate_period


  deny authenticated = *
                message = Sender rate SMTP overlimit - $sender_rate / $sender_rate_period
                ratelimit = 100 / 1d / strict / $authenticated_id
                log_message = Auth_id: $authenticated_id Sender: $sender_address block by ratelimit 24h $sender_rate / $sender_rate_period

И дополнительно в cron прикрутил скрипт, на анализ, кого мы заблокировали и отправки письма:

cat /var/log/exim/mainlog | grep 'block by ratelimit'

Так же, просматривая заголовки писем осознал, что по ним получатель может составить представление о внутренней структуре сети, что не есть очень хорошо.

Чтобы этого не происходило, перед отправкой сообщений на внешние адреса в заголовках писем удаляю поле Received. Для этого в исходящем транспорте добавил:

headers_remove = Received