Войти или зарегистрироваться

Туториал Простая и надежная защита от бот атак

JonBoss

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Jon
Сразу к делу. Если на ваш сервер совершаю бот атаки, иногда даже с разных айпи, есть хороший способ решить эту проблему.
Этот способ подойдет только тем, у кого сервер работает на линуксе и есть root доступ.

fail2ban - это встроенный в линукс сервис, который предотвращает попытки взлома ssh,mysql,ftp,apache,nginx и других сервисов. Работает он интересным образом: он сканирует логи сервисов и, если айпи превысил лимит попыток авторизироваться, то он попадает в черный список и блокируется через iptables и ipset.

Я приведу рабочий пример защиты BungeeCord (далее банга).

И так, у нас есть банга, ее логи находятся в файле proxy.log.0. Когда идет бот атака, в логах начинает появляться куча сообщений вида:
Код:
23:03:07 [INFO] [/213.32.67.146:59380] <-> InitialHandler has connected
23:03:37 [INFO] [/213.32.67.146:60984] <-> InitialHandler has connected
23:04:07 [INFO] [/213.32.67.146:34370] <-> InitialHandler has connected
23:04:15 [INFO] [/77.122.62.35:55387] <-> InitialHandler has connected
23:04:19 [INFO] [/77.122.62.35:55399] <-> InitialHandler has connected
Сообщение "InitialHandler has connected" пишется, когда игрок входит на сервер или получает motd сервера. Нам не важно, что из этого делает бот, потому что атаки бывают и с получением большого числа motd.
Я пришел к таким цифрам: если игрок за 60 секунд попытался войти/получить motd более 30 раз, то это скорее всего бот.

Переходим к настройке защиты.
  • Заходим по ssh/sftp от рута
  • Установка fail2ban. Он может стоять по умолчанию, но очень рекомендую поставить версию v0.10.5 или выше:
    Код:
    # Смотрим версию
    # Если версия v0.10.5 и выше, тогда все хорошо, на этом установка окончена.
    fail2ban-client --version
    
    # Если версия ниже, тогда придется обновить вручную до новой версии
    # Обновляем
    apt remove fail2ban -y
    rm /etc/systemd/system/fail2ban.service
    git clone -b 0.10 https://github.com/fail2ban/fail2ban.git
    cd fail2ban/
    python setup.py install
    source /etc/profile
    cp files/debian-initd /etc/init.d/fail2ban
    update-rc.d fail2ban defaults
    cd ..
    rm -r fail2ban
    service fail2ban start
    
    # перезаходим по ssh
  • Устанавливаем ipset:
    Код:
    apt install ipset
  • Заходим в папку /etc/fail2ban/jail.d
  • Создаем там файлик minecraft.conf, вставляем туда:
    Код:
    [bungee-connection]
    enabled  = true
    
    # фильтр логов, об этом ниже
    filter   = bungee-connection
    
    # тип блокировки, установлена блокировка порта 25565
    action   = iptables-ipset-proto4[name="bungee-connection", port="25565"]
    
    # путь к файлу логу банги
    logpath  = /глобальный-путь-к/proxy.log.0
    
    # максимальное число "InitialHandler has connected"
    maxretry = 30
    
    # время бана айпи в секундах, установлен 1 месяц
    bantime  = 2592000
    
    # время в секундах, за которое будет учитываться maxretry
    # если за findtime секунд, будет совершено maxretry попыток входа, тогда айпи забанится на bantime
    findtime = 60
  • Теперь нужно создать фильтр логов bungee-connection, переходим в папку /etc/fail2ban/filter.d
  • Создаем файлик bungee-connection.conf, вставляем туда:
    Код:
    [Definition]
    
    # regex выражение, которое находит нужные нам сообщения в логах и извлекает из них айпи бота <HOST>
    failregex = \[\/<HOST>:.+] <-> InitialHandler has connected
    ignoreregex =
    
    # формат даты в логах, в нашем случае "23:27:38"
    datepattern = %%H:%%M:%%S
  • Перезагружаем fail2ban
    Код:
    fail2ban-client reload
    service fail2ban restart
Готово, защита активирована.

Узнать, сколько айпи забанено: fail2ban-client status bungee-connection
Разбанить айпи: fail2ban-client set bungee-connection unbanip АЙПИ

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

Вы можете создать и другие тюрьмы (так это называется в fail2ban).
Например, если вы используете BotFilter, вы можете банить айпи, если в лог пишется аля "Игрок 32.32.32.32 не прошел проверку на антибота". Кто скинет рабочий пример, я добавлю в статью (просто я BotFilter не использую).

Я хочу сделать статью максимально понятной, по этому задавайте вопросы, если что-то не понятно.
 
Последнее редактирование:
Сразу скажу, при первой атаке бангу могут положить несколько раз. Но когда все айпи ботов попадут в бан, вы будете защищены.
Не, ну в принципе нормально так. В твоей вселенной не учитывается то что надо постоянно поддерживать UpTime проекта и доводить его как можно ближе к 100%? Или же в твоей вселенной не существует атаки с разных дедиков кучу раз? Зачем нужна эта тема - не понятно, уже все изобрели без таких костылей.
 
Не, ну в принципе нормально так. В твоей вселенной не учитывается то что надо постоянно поддерживать UpTime проекта и доводить его как можно ближе к 100%? Или же в твоей вселенной не существует атаки с разных дедиков кучу раз? Зачем нужна эта тема - не понятно, уже все изобрели без таких костылей.
А в чем проблема атаки с нескольких дедиков? Пусть отлетают в бан. Вообще в идеале надо на уровне банжи такое банить имхо. Я так делаю, ловлю новое Connection в InitialHandler и там уже разные параметры смотрю и баню.
А статья вроде ничего, пойдет. Само собой надо юзать такие защиты вкупе с Ботфилтром и аналогами, но сам по себе путь бана на уровне ОС правильный.
 
Последнее редактирование:
Не, ну в принципе нормально так. В твоей вселенной не учитывается то что надо постоянно поддерживать UpTime проекта и доводить его как можно ближе к 100%? Или же в твоей вселенной не существует атаки с разных дедиков кучу раз? Зачем нужна эта тема - не понятно, уже все изобрели без таких костылей.
Отвечаю на ваши вопросы:
  1. Предложенное мною решение предотвращает бот атаки, что способствует повышению UpTime. Прошу вас сформулировать вашу мысль яснее, ибо я не понял претензию касательно UpTime.
  2. Существует. Если куча дедиков будет проводить атаку, при этом каждый дедик будет делать > 30 попыток входа на сервер в минуту, то в результате через несколько минут все дедики будут забанены.
    Я тестировал это на атаке в 2к дедиков, все оказались в бане.
    Система уязвима только в случае, если у вас очень огромное число дедиков (миллионы), чего я не встречал ни разу.
  3. Эта тема нужна, хотя бы в качестве альтернативы другим решениям. Это решение обладает своими плюсами: простота, бесплатность, не требует установки плагинов на бангу, бан происходит на уровне системы. Отнюдь, это не костыль! Разве можно называть костылем то, что используется пакетами sshd, mysql, nginx. Это нормальная практика в linux использовать fail2ban.
 
Обычно на это уходит пару минут. Я не вижу в этом большой потери для UpTime.
Для проектов с онлайном 500-1000 и более это смерти подобно. Также данная защита не защищает от умных ботов, либо от ботов, которые идут по правилу 1 прокси = 1 коннект. А такое сплошь и рядом.
Без кастомной банжи с фильтрацией защиту рассматривать смысла нет.
 
Для проектов с онлайном 500-1000 и более это смерти подобно. Также данная защита не защищает от умных ботов, либо от ботов, которые идут по правилу 1 прокси = 1 коннект. А такое сплошь и рядом.
Без кастомной банжи с фильтрацией защиту рассматривать смысла нет.
Очевидно, вы правы. В этом случае мое решение не спасет. У всего есть грани применимости.
 
Существует. Если куча дедиков будет проводить атаку, при этом каждый дедик будет делать > 30 попыток входа на сервер в минуту, то в результате через несколько минут все дедики будут забанены.
Я тестировал это на атаке в 2к дедиков, все оказались в бане.
Ну подождём несколько минут пока сервер лежит а дедики обращаются не по 30 раз в минуту. Да и пруфов на счёт тестов тоже не будет?
Эта тема нужна, хотя бы в качестве альтернативы другим решениям.
Она им уступает, и именно по этому не используется.
 
Ну подождём несколько минут пока сервер лежит а дедики обращаются не по 30 раз в минуту. Да и пруфов на счёт тестов тоже не будет?
Вы рассматриваете сценарий, где эта защита не поможет. У всего есть грани применимости, моя защита не панацея, но она покроет целый пласт возможных атак.
Я делал эту конфигурацию такой, потому что на мои сервера совершали атаки боты именно с такой частотой логинов в минуту. А именно на сервера с онлайном 100 и 400.

Вы попросили пруфы. Могу показать состояние тюрьмы:
Я немного обманул, сказав, что тестировал на 2к адерсов, потому что адерсов было 4к. И все они оказались в бане:
x6XV64K.png

Она им уступает, и именно по этому не используется.
Предоставьте мне список других защит, которым моя уступает. Только тогда я смогу с вами согласиться или не согласиться. Так же это будет всем полезно тут, кто нуждается в защите сервера.
 
Вы рассматриваете сценарий, где эта защита не поможет. У всего есть грани применимости, моя защита не панацея, но она покроет целый пласт возможных атак.
Я делал эту конфигурацию такой, потому что на мои сервера совершали атаки боты именно с такой частотой логинов в минуту. А именно на сервера с онлайном 100 и 400.

Вы попросили пруфы. Могу показать состояние тюрьмы:
Я немного обманул, сказав, что тестировал на 2к адерсов, потому что адерсов было 4к. И все они оказались в бане:
x6XV64K.png


Предоставьте мне список других защит, которым моя уступает. Только тогда я смогу с вами согласиться или не согласиться. Так же это будет всем полезно тут, кто нуждается в защите сервера.
В паблик защите ботфильтр действительно насколько я знаю решений по бану на железе нет, а ведь это правильный самый вариант.
Хеш таблицы по типу айписета работают невероятно быстро и эффективно. Но правильное решение - на уровне банжи делать сброс соединения ботам и по достижению определенных условий заносить уже адрес в бан на железе.
 
Но правильное решение - на уровне банжи делать сброс соединения ботам и по достижению определенных условий заносить уже адрес в бан на железе.
Мне нравится эта идея, можно использовать fail2ban, чтобы смотреть логи BotFilter и банить ботов сразу на уровне ОС. Это будет отличное публичное решение.

Хеш таблицы по типу айписета работают невероятно быстро и эффективно.
Можно подробнее. О каких именно хеш таблицах вы говорите?
 
Система отвалится, если полетят кривые пакеты на банжу, на которые лог писаться не будут.
 
Система отвалится, если полетят кривые пакеты на банжу, на которые лог писаться не будут.
Да, вы правы.

Я не тестил, но если банга на кривые пакеты пишет особый лог, тогда можно добавить еще фильтр и на кривые пакеты. Если же банга ничего писать не будет, тогда уже такой способ атаки невозможно отклонить с помощью fail2ban, на этом его грань применимости.

Вообще, кривые пакеты я бы не классифицировал, как бот атаку. Ведь бот, это тот, кто посылает правильные запросы, а моя защита нацелена именно на бот атаки (что и указано в названии статьи), а не атаки трафиком.
 
При попытке перезагрузить fail2ban пишет: "2020-03-20 17:48:54,949 fail2ban [697]: ERROR Could not find server"
 
Назад
Верх