Защита от перебора паролей SSH. Автоматический вечный бан на основе списков fail2ban

Защита от перебора паролей SSHНачну с постановки проблемы и обоснования ее решения. Я уже писал про автоматическую блокировку попыток подбора пароля к sshна основе fail2ban тут, тут и тут. Но настал такой период, что понадобилось мне помимо просмотра и составления топа, блокировать отдельных зарвавшихся личностей, которые уж сильно рьяно нападают на мой ssh. Про то почему я не пользуюсь сертификатами я уже писал, но повторюсь. Вся суть в том, что мне во первых нравится мониторить ситуацию на моих серверах (интерес к ним), а во вторых, достаточно часто бывает необходимость попадать на сервера из самых непредсказуемых мест, и с самых разнообразных устройств.

Помимо всего выше сказанного, данный способ очень гибок и подходит для защиты множества других сервисом, достаточно его лишь немного подогнать. А универсальность и гибкость, это наше все.

Принцип работы скрипта такой: на основе сознанного топа выбираются ip адреса, которые превышают по попыткам определенный порог, они заносятся в перманентный бан, о чем потом (вместе с обычным топом) сообщается на почту.

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

#!/bin/bash

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

# Генерируем топ 10.
rm -rf /tmp/fail2banlog && mkdir /tmp/fail2banlog && cp `ls /var/log/fail2ban*` /tmp/fail2banlog && cd /tmp/fail2banlog && ls *.gz | while read i; do gzip -d $i; done; cat fail2ban.log* | grep Ban | awk '{print $7}' | sort -nr | uniq -c | sort -nr | head -n10 >/tmp/fail2banlog/send

# Добавляем в файл 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 элементов).
i=1
while [ $i -lt 10 ]
do

        # Внутри цикла проверяем первую переменную с кол-вом попыток перебора, не превысило ли десяти кол-во попыток.
        if [ ${F[$i]} -ge 10 ]; then

                # Если попыток подбора 10 или больше, смотрим бан лист и проверяем, нет ли в нем уже этого ip.
                vuurmuur_script --list-blocked | grep ${S[$i]} >/dev/null 2>&1
                # Если такого ip нет в бан листе, то баним его, если есть, то сообщаем об этом.
                if [ $? -ne 0 ]; then
                vuurmuur_script --block ${S[$i]}
                echo "Ip ${S[$i]} добавлен в вечный бан." >>/tmp/fail2banlog/send
                # Мне сообщение о уже забаненных ip не нужны, поэтому сообщение уходит в ноль.
                else echo "Ip ${S[$i]} уже находится в вечном бане " >/dev/null 2>&1
                fi

        # Если попыток меньше 10, ничего не делаем и выходим.
        else echo >/dev/null 2>&1
        fi

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

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

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

Скрипт опробован и с успехом применяется на 3х серверах в разных частях страны, причем не только для блокировки попыток перебора паролей ssh.

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

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

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

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