Мониторинг перебора паролей на почту позволяет оценить, сколько недоброжелателей пытается подбирать пароли к вашей почте. Рассмотрим на примере почтового сервера 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
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 читабельнее
Согласен, поправил. Тут не то чтобы идиома плохая, тут с внутренней стороны различия. Во-первых, да, лишний процесс в виде cat, во-вторых, размер буфера пайпа ограничен, на больших объемах могут накладки случаться. И номера дескрипторов разные, если изнутри программы смотреть.