Очень часто случается так, что на сервере присутствуют сайты с неактуальными версиями ПО, которые взламываются, через них на сервер заливаются специальные файлы, через которые злоумышленники начинают массово рассылать спам.

Эта проблема довольно серьёзная, так как ip адрес сервера после такой рассылки обычно попадает в различные «чёрные списки», из-за чего и легитимную почту с сервера перестают принимать многие почтовые сервисы. И удалить ip из этих «чёрных списков» не всегда просто. К тому же за рассылку спама сервер может быть заблокирован хостером или дата-центром.

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

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

exim -bpc

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

Пишем скрипт мониторинга почтовой очереди exim

В этом примере администратор получит уведомление на почту, если число писем в почтовой очереди больше 100. Если у вас обычно там больше писем, увеличьте это значение. К тому же к письму будет прикреплён файл с выводом последних 50 строк команды, отображающей почтовую очередь

#!/bin/bash

# Проверяем количество писем в очереди
queue_count=$(exim -bpc)

# Если писем больше 100, отправляем уведомление на почту
if [ $queue_count -gt 100 ]; then
    # Получаем список последних писем в очереди
    queue_list=$(exim -bp | tail -n 50)
    
    # Создаем временный файл для сохранения списка писем
    temp_file=$(mktemp)
    echo "$queue_list" > $temp_file
    
    # Отправляем письмо администратору с вложенным файлом
    echo "Количество писем в очереди превышает 100. Проверьте состояние очереди." | mail -s "Важное уведомление: очередь exim" -a $temp_file admin@site.com
    
    # Удаляем временный файл
    rm $temp_file
fi

Сохраняем этот скрипт в файл, например с именем exim-check.sh в папке /opt/, меняем в нём почту администратора, и даём ему права на выполнение:

chmod +x /opt/exim-check.sh
Проверяем работоспособность скрипта

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

/opt/exim-check.sh

Если не получили письмо с уведомлением, возможно на сервере не установлен mailx. Тогда его нужно установить.

Добавляем скрипт в планировщик

Если уведомление успешно получено, добавляем этот скрипт в планировщик cron, например с временем выполнения каждые 15 минут:

*/15 * * * * /opt/exim-check.sh

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