Вечный бан fail2ban версия 2.0

fail2ban

Какое то время назад, я написал пост — «Защита от перебора паролей SSH. Автоматический вечный бан на основе списков fail2ban» в котором запилил скрипт по вечной блокировке наиболее активных перебирателей паролей к ssh.

Сегодня, хочу представить вам логическое продолжение этого скрипта, которое из меня «вытянул», или я бы даже сказал выплакал, мой коллега админ из Москвы.

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

#!/bin/bash

# Ящики на которые шлем отчет
mails="admin1@itroad.ru.ru admin2@itroad.ru"

# Генерируем список IP которые попадали в бан.
rm -rf /tmp/fail2banlog && mkdir /tmp/fail2banlog && cp `ls /var/log/fail2ban*` /tmp/fail2banlog && cd /tmp/fail2banlog && ls *.gz >/dev/null 2>&1 | while read i; do gzip -d $i >/dev/null 2>&1; done; cat fail2ban.log* | grep Ban | awk '{print $7}' >/tmp/fail2banlog/send_0

# Наполняем переменную из этого списка
fil="`cat /tmp/fail2banlog/send_0`"

# Проверяем все IP на наличие из в блоке
for w in $fil
do
      vuurmuur_script --list-blocked | grep $w >/dev/null 2>&1
   
      # Если такого ip нет в бан листе, то передаем его дальше на проверку, если есть, просто пропускаем.
      if [ $? -ne 0 ]; then
      echo $w >>/tmp/fail2banlog/send_1
      fi
done
# Составляем топ 10 адресов
cat /tmp/fail2banlog/send_1 | sort -nr | uniq -c | sort -nr | head -n10 >/tmp/fail2banlog/send
echo >>/tmp/fail2banlog/send

# Создаем массив из рейтинга, наполняя одну переменную кол-вом совпадений, а другую ip который совпал
F=(echo `cat /tmp/fail2banlog/send |awk '{print $1}'`)
S=(echo `cat /tmp/fail2banlog/send |awk '{print $2}'`)

# Начинаем перебор массива с 1 элемента до 10 элемента (в рейтинге ведь у нас всего 10 элементов).
i=1
while [ $i -lt 10 ]
do

    # Внутри цикла проверяем первую переменную с кол-вом попыток перебора, не превысило ли шест кол-во попыток.
    if [ ${F[$i]} -ge 6 ] >/dev/null 2>&1; then
    
    # Если попыток подбора 6 или больше смотрим бан лист и проверяем, нет ли в нем уже этого ip.
    # Если нет, то баним
    vuurmuur_script --block ${S[$i]} >/dev/null 2>&1
    echo "Ip ${S[$i]} добавлен в вечный бан." >>/tmp/fail2banlog/send
    
    # Если попыток меньше 6, ничего не делаем и выходим.
    else echo >/dev/null 2>&1
    fi

# Добавляем к счетчику единицу.
i=$[$i+1]
done

# Обновляем правила файрвола
vuurmuur_script --reload >/dev/null 2>&1

# Отсылаемый на почту рейтинг ip пытающихся подобрать пароль к SSH.
mutt -s "fail2ban" $mails </tmp/fail2banlog/send

В качестве файрвола, я использую vuurmuur, но переписать скрипт на использование чистого iptables или hosts.deny нет никакой проблемы.

В итоге изменений в скрипте, мы получаем ровненький столбик ip адресов, причем только тех, которых еще не в бане, т.е. в моем случае, в списке будут адреса появившиеся до 6 раз (сделавшие до 6 попыток перебора).

К тому же, в процессе изменения, скрипт был существенно упрощен.

По видимому следующим изменением скрипта будет указание сервиса, из за которого ip попал в бан. Я вообще стараюсь не делать на одном сервере более одного сервиса, но в последнее время таких серверов становится все больше и больше. Уже появляется asterisk + apache и прочие связки, в которых fail2ban работает на несколько сервисов.

Смотрите так же:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.