Мониторинг перебора паролей на почту

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

Для работы с информацией будем использовать bash-скрипты, чтобы фильтровать информацию, и планировщик cron, чтобы выполнять анализ по расписанию и высылать результат вам на почту. Результат будем сохранять в отдельном файле на каждый день и в одном файле будем собирать всю информацию. Саму информацию представим в виде двух значений — количество попыток и IP-адрес. Таким образом мы можем посмотреть заодно, правильно ли работает fail2ban и сколько попыток залогиниться на почтовый сервер проходит за сутки.

Сбор статистической информации

Для получения информации будем использовать логи почтового сервера, в которых регистрируются попытки подключения к почтовому серверу. Вот что нам нужно. Из лога аутентификации будем отфильтровывать ошибки аутентификации и считать для IP-адресов, при обращении с которых происходили ошибки, количество попыток. После размещения скрипта в cron’е вам на почту будет приходить каждый день письмо со статистикой атак. Рассмотрим аутентификацию почтового сервера dovecot, но вы можете поправить скрипт под свои нужды.

Мониторинг перебора паролей

Напишем скрипт на bash, который будет фильтровать логи.

#!/bin/bash

# Название файла с адресами, включающее дату
IP_BLACKLIST="/root/scripts/blacklist-`date "+%Y-%m-%d"`.lst"

# Фильтрация ошибок аутентификации
CURRENT_DATE=`date "+%b %d"`
grep "dovecot:auth" /var/log/auth.log \
| grep "authentication failure" \
| grep "$CURRENT_DATE" \
| cut -d" " -f 14 \
| sed 's/rhost=//' \
| sort | uniq -c >> $IP_BLACKLIST

# Добавление в большой список только IP-адресов из сегодняшнего лога
awk '{print $2}' $IP_BLACKLIST >> /root/scripts/blacklist-full.lst
# После добавления сортируем и убираем неуникальные адреса
cat /root/scripts/blacklist-full.lst | sort | uniq >> /root/scripts/blacklist-full.lst.new
rm /root/scripts/blacklist-full.lst
mv /root/scripts/blacklist-full.lst.new /root/scripts/blacklist-full.lst

# Выводим сегодняшний лог
cat $IP_BLACKLIST

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

      3 112.187.199.184
      1 115.239.137.231
      1 118.102.162.66
      2 122.248.242.78
      3 122.255.30.146
      1 124.16.31.184
      5 127.0.0.1
      1 188.165.24.224
      1 203.130.239.137
      1 54.84.43.159
      1 62.85.210.232
     49 89.248.174.101

Общий лог будет выглядеть как обычный список IP-адресов:

94.102.52.31
94.102.53.167
94.158.158.194
94.176.9.98
94.23.35.48
94.242.243.88
94.56.148.188
95.110.186.218
95.140.125.52
95.167.110.237
95.211.215.82
95.228.77.74
95.242.157.225
95.59.56.101
95.9.110.101
95.9.178.157
95.97.99.43
96.119.1.143
97.76.123.62
99.59.103.92

После написания скрипта необходимо его записать в крон, чтобы он выполнялся по расписанию. Когда будут неудачные попытки аутентификации, вам будет приходить письмо со списком и количеством попыток, если их не будет, то письмо тоже не будет приходить. Добавим для этого в файл /etc/crontab следующую строчку:

55 23   * * *   root    /root/scripts/check-auth-errors.sh

Блокировка перебора при помощи iptables

Для блокировки при помощи iptables можно написать еще один скрипт, которым можно блокировать адреса из ежедневного лога:

#!/bin/bash

IPLIST=$(awk '{print $2}' $1)
for IP in ${IPLIST}
do
    echo -n Blocking ${IP} ... 
    iptables -t filter -A INPUT -s ${IP} -j DROP
    echo Done
done

 

Мониторинг перебора паролей на почту: 2 комментария

  1. #kstn

    cat $file | { grep, sed, awk, ...}
    плохая идиома, не оптимально — лишний cat, не рекомендуется

    cat $IP_BLACKLIST | awk '{printf $2"\n"}' >> /root/scripts/blacklist-full.lst
    awk '{print $2}' $IP_BLACKLIST >> /root/scripts/blacklist-full.lst
    ( printf $2″\n» == print $2)

    и
    IPLIST=$(cat $1 | awk '{printf $2" "}')
    IPLIST=$(awk '{print $2}' $1)
    или даже
    for IP in $(awk '{print $2}' $1)
    Но с IPLIST читабельнее

    1. mnorin Автор записи

      Согласен, поправил. Тут не то чтобы идиома плохая, тут с внутренней стороны различия. Во-первых, да, лишний процесс в виде cat, во-вторых, размер буфера пайпа ограничен, на больших объемах могут накладки случаться. И номера дескрипторов разные, если изнутри программы смотреть.

Обсуждение закрыто.