1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем JonBoss, 15 авг 2019.

  1. Автор темы
    JonBoss

    JonBoss Активный участник Пользователь

    Баллы:
    76
    Skype:
    ya_narik1
    Имя в 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 не использую).

    Я хочу сделать статью максимально понятной, по этому задавайте вопросы, если что-то не понятно.
     
    Последнее редактирование: 9 фев 2020
  2. Nikolai_Faint

    Nikolai_Faint Активный участник Пользователь

    Баллы:
    96
    Не, ну в принципе нормально так. В твоей вселенной не учитывается то что надо постоянно поддерживать UpTime проекта и доводить его как можно ближе к 100%? Или же в твоей вселенной не существует атаки с разных дедиков кучу раз? Зачем нужна эта тема - не понятно, уже все изобрели без таких костылей.
     
  3. SimMiMo

    SimMiMo Активный участник Пользователь

    Баллы:
    76
    А в чем проблема атаки с нескольких дедиков? Пусть отлетают в бан. Вообще в идеале надо на уровне банжи такое банить имхо. Я так делаю, ловлю новое Connection в InitialHandler и там уже разные параметры смотрю и баню.
    А статья вроде ничего, пойдет. Само собой надо юзать такие защиты вкупе с Ботфилтром и аналогами, но сам по себе путь бана на уровне ОС правильный.
     
    Последнее редактирование: 15 авг 2019
  4. Nikolai_Faint

    Nikolai_Faint Активный участник Пользователь

    Баллы:
    96
    Ну вот пускай улетает в бан пока все сервера в мире не закончатся, а твой uptime будет 1%
     
  5. Автор темы
    JonBoss

    JonBoss Активный участник Пользователь

    Баллы:
    76
    Skype:
    ya_narik1
    Имя в Minecraft:
    Jon
    Отвечаю на ваши вопросы:
    1. Предложенное мною решение предотвращает бот атаки, что способствует повышению UpTime. Прошу вас сформулировать вашу мысль яснее, ибо я не понял претензию касательно UpTime.
    2. Существует. Если куча дедиков будет проводить атаку, при этом каждый дедик будет делать > 30 попыток входа на сервер в минуту, то в результате через несколько минут все дедики будут забанены.
      Я тестировал это на атаке в 2к дедиков, все оказались в бане.
      Система уязвима только в случае, если у вас очень огромное число дедиков (миллионы), чего я не встречал ни разу.
    3. Эта тема нужна, хотя бы в качестве альтернативы другим решениям. Это решение обладает своими плюсами: простота, бесплатность, не требует установки плагинов на бангу, бан происходит на уровне системы. Отнюдь, это не костыль! Разве можно называть костылем то, что используется пакетами sshd, mysql, nginx. Это нормальная практика в linux использовать fail2ban.
     
  6. Автор темы
    JonBoss

    JonBoss Активный участник Пользователь

    Баллы:
    76
    Skype:
    ya_narik1
    Имя в Minecraft:
    Jon
    Обычно на это уходит пару минут. Я не вижу в этом большой потери для UpTime.
     
  7. SimMiMo

    SimMiMo Активный участник Пользователь

    Баллы:
    76
    Для проектов с онлайном 500-1000 и более это смерти подобно. Также данная защита не защищает от умных ботов, либо от ботов, которые идут по правилу 1 прокси = 1 коннект. А такое сплошь и рядом.
    Без кастомной банжи с фильтрацией защиту рассматривать смысла нет.
     
  8. Автор темы
    JonBoss

    JonBoss Активный участник Пользователь

    Баллы:
    76
    Skype:
    ya_narik1
    Имя в Minecraft:
    Jon
    Очевидно, вы правы. В этом случае мое решение не спасет. У всего есть грани применимости.
     
  9. Nikolai_Faint

    Nikolai_Faint Активный участник Пользователь

    Баллы:
    96
    Ну подождём несколько минут пока сервер лежит а дедики обращаются не по 30 раз в минуту. Да и пруфов на счёт тестов тоже не будет?
    Она им уступает, и именно по этому не используется.
     
  10. Автор темы
    JonBoss

    JonBoss Активный участник Пользователь

    Баллы:
    76
    Skype:
    ya_narik1
    Имя в Minecraft:
    Jon
    Вы рассматриваете сценарий, где эта защита не поможет. У всего есть грани применимости, моя защита не панацея, но она покроет целый пласт возможных атак.
    Я делал эту конфигурацию такой, потому что на мои сервера совершали атаки боты именно с такой частотой логинов в минуту. А именно на сервера с онлайном 100 и 400.

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

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

    SimMiMo Активный участник Пользователь

    Баллы:
    76
    В паблик защите ботфильтр действительно насколько я знаю решений по бану на железе нет, а ведь это правильный самый вариант.
    Хеш таблицы по типу айписета работают невероятно быстро и эффективно. Но правильное решение - на уровне банжи делать сброс соединения ботам и по достижению определенных условий заносить уже адрес в бан на железе.
     
  12. Автор темы
    JonBoss

    JonBoss Активный участник Пользователь

    Баллы:
    76
    Skype:
    ya_narik1
    Имя в Minecraft:
    Jon
    Мне нравится эта идея, можно использовать fail2ban, чтобы смотреть логи BotFilter и банить ботов сразу на уровне ОС. Это будет отличное публичное решение.

    Можно подробнее. О каких именно хеш таблицах вы говорите?
     
  13. SimMiMo

    SimMiMo Активный участник Пользователь

    Баллы:
    76
    http://ipset.netfilter.org/ipset.man.html
     
  14. Автор темы
    JonBoss

    JonBoss Активный участник Пользователь

    Баллы:
    76
    Skype:
    ya_narik1
    Имя в Minecraft:
    Jon
    Я обновил статью с использованием ipset, спасибо за совет.
     
  15. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Система отвалится, если полетят кривые пакеты на банжу, на которые лог писаться не будут.
     
  16. Автор темы
    JonBoss

    JonBoss Активный участник Пользователь

    Баллы:
    76
    Skype:
    ya_narik1
    Имя в Minecraft:
    Jon
    Да, вы правы.

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

    Вообще, кривые пакеты я бы не классифицировал, как бот атаку. Ведь бот, это тот, кто посылает правильные запросы, а моя защита нацелена именно на бот атаки (что и указано в названии статьи), а не атаки трафиком.
     
  17. Sherwood

    Sherwood Активный участник Пользователь

    Баллы:
    61
    При попытке перезагрузить fail2ban пишет: "2020-03-20 17:48:54,949 fail2ban [697]: ERROR Could not find server"
     
  18. Автор темы
    JonBoss

    JonBoss Активный участник Пользователь

    Баллы:
    76
    Skype:
    ya_narik1
    Имя в Minecraft:
    Jon
    Попробуй:
    Код:
    service fail2ban start
     

Поделиться этой страницей