Защита от DDOS атаки случайными аргументами при помощи Nginx

    Я встретился с новым типом ботнета. Если старый долбил только в главную, то новый действует иначе. Он посылает множество запросов вида
    GET someurl/?t1555ss5326=5326, где someurl — найденный ботом php скрипт.
    Но если атакуемый сайт поддерживает ЧПУ, то такие запросы к нему должны отсутствовать в принципе. ЧПУ сейчас является стандартом де-факто, по этому можно смело отрезать такие запросы, логируя IP ботов.
    Для этого очень удобен nginx, и его переменная is_args, которая имеет значение "?", если в URI идут аргументы. Базовая конструкция выглядит так:

    if ($is_args = "?") {
    return 403 444;
    }

    Очень просто и красиво, правда?
    Вот как выглядит LA после включения этой защиты:
    load average: 1.50, 3.09, 6.96
    Текущий ботнет из ~20000 зомби, делают 5-8k одновременных запросов.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 55

    • UFO just landed and posted this here
        0
        В современном интернете — ЧПУ стандарт де-факто

        На счет 444 — почему нагрузка меньше? Не все равно, что отдавать?
        • UFO just landed and posted this here
            +2
            В мемориз, однозначно.
            • UFO just landed and posted this here
              0
              https://calomel.org/nginx.html Читайте главу 'IMPORTANT NOTE: Why are we using the error code «return 444» ?'
            0
            ну это всегда можно уточнить, стоит или нет.
              +3
              Присоединяюсь к 444, сам хотел написать.
              Грубо говоря, всё остальное — сервер оправдывается, почему он не можут дать конент (нет на сайте, ушло, запрещено).
              А 444 — просто нет и всё. Т.е. сервер молчит, пользователя в игнор.
              +5
              Скажите, а это правило разве не отключит вообще возможность передавать параметры GET-запросом? )
                0
                Можно же дописать только для определённой части сайта.
                  +2
                  На момент атаки это меньше всего беспокоит. Когда боты попадут в лог и будут забанены — все вернется как и было.
                    0
                    Скажите, вот есть список ип ботов, как и чем лучше банить?
                      0
                      ipfw, пишете локальный скрипт на питоне или баше и вешаете его в крон, он будет парсить логи nginx`а и добавлять\удалять забаненные IP.
                        0
                        Зачем что-то писать, когда есть готовое? fail2ban к примеру.
                      • UFO just landed and posted this here
                          0
                          ipset
                          +2
                          Так… это… фейсбук вечно пытается пристроить свой параметр, гуглоаналитика тоже.
                        +2
                        В 6ом друпале иногда нужны урлы с вопросом, даже когда включены урлы.

                        Алсо ЧПУ = Числовое программное управление. Долго курил как может быть с ним сервер.
                        +1
                        GET'ы нужны даже при наличии ЧПУ. Например для пагинаторов или поиска.
                          0
                          «Пагинаторы» Без проблем работают в Wordpress к примеру, Не вижу проблемы. А вот поиск — согласен. Хотя если отрубать аргументы только при атаке, то оправдано, так как не до поиска будет, а лишь бы выстоять.
                            +5
                            Как будто кто-то мешает вести атаки на адреса типа /foo/bar/13245
                              0
                              Ботам невыгодно делать такое, т.к. при настроящем foo.php/foo/bar часто может выскакивать ошибка 404.
                                0
                                и что? почему это не выгодно?
                                  0
                                  Если папки /foo/bar/123 не существует, то посетители — зомби будут просить 404 страницы, которые не жрут много ресурсов, а значит не создадут высокой нагрузки. Особенно если во время атаки правильно подкрутить nginx. Это не на всех сайтах, но на многих.
                                  Сравните две ссылки:
                                  habrahabr.ru/foo/bar/123123/
                                  habrahabr.ru/?=foobar=123123
                                  Какая более нагружает сервер — очевидно.
                          +11
                          Все пришедшие с контекстной рекламы тоже попадут под нож…
                          ?from=google
                          ?from=dir
                          и т.п.
                            0
                            могут. а могут и не попадать, если нож настраивать с учётом особенностей сайта
                            +1
                            nginx поддерживает регулярки, так вот, чтобы не нароком не забанить валидных юзеров, лучше использовать регулярку которая выявляет рандомный URL.
                              +2
                              пример в студию!
                                +5
                                Это очень просто: /^[random]+$/

                                Случайная строка «oandonrm» соответствует.
                                «hello world» — не соответствует.
                              0
                              А можно ли выделить список аргументов, которые должны пропускаться?
                              Если урлы преобразованы через htaccess c i.php?h=h.jpg -> /i/hjpg
                              эти урлы тоже будут резаться этим правилом?
                                0
                                Да, т.к. nginx работает до apache.
                                Такие преобразования стоит выкинуть, и статику (/i/h.jpg) отдавать nginx-ом. Но если у Вас много денег и 2 теребайта оперативной памяти, то необязательно.
                                  0
                                  вопрос не в статике был. Со статикой и так все ясно.
                                  Вот другой пример:
                                  index.php?page=news&num=2 -> /news/2/
                                +2
                                Насколько я понимаю, данный метод добавления мусора эффективен когда на сервере кэшируются страницы по ключу URL. Таким образом, кэш очень быстро забивается и сайт падает.
                                  +15
                                  Самое полезное в этой статье я узнал из коментов. Про код 444 =)
                                  а обрезать всех кто с аргументами, это такая временная мера дабы главная страница работала несмотря на ддос.
                                    0
                                    Не впервый раз на хабре число светится)
                                    Когдато помогло остановить небольшую толпу китайцев.
                                    0
                                    Парсите access_log-и и в случае необходимости на стороне nginx выдавайте captcha
                                      0
                                      При хорошей атаке канал будет забит этими капчами.
                                      0
                                      а как же отслеживание кампаний googe_analytics, контекстная реклама итп?
                                        +2
                                        на момент ддос глубоко пофигу…
                                          0
                                          а после? боты-то могут никуда и не деться…
                                        0
                                        тип ботнета не новый.
                                        рассчет атакующих понятен — пробить кэши.
                                        бьется вполне просто и прозрачно стандартными приемами с анализом поведения.
                                          0
                                          Для меня был новый
                                          ~30k ботов успешно забанены, атаку остановил
                                          Про 444 поправил, реально помогает
                                          0
                                          Интересное решение, (write on brain)
                                          • UFO just landed and posted this here
                                              0
                                              Какая-нибудь однодневка на ворпдрессе. А какой еще сайт может позволить себе обрубать аргументы?
                                            • UFO just landed and posted this here
                                                0
                                                >ЧПУ сейчас является стандартом де-факто

                                                microformats.org/wiki/rest/urls — обратите внимание на эмуляцию методов PUT и DELETE в браузерах

                                                Конечно, всё зависит от ресурса, но в некоторых случаях важнее, чтобы отправленный и дошедший до сервера клиентский запрос был обработан, пускай и ответа на него не будет.
                                                  0
                                                  надо бы ещё отделять внутренние подзапросы. они часто с "?".
                                                    +1
                                                    Используйте регекспы. У меня был подобный ддос, лечил правилом
                                                    ##
                                                    if ($query_string ~ "\w+\d+=\d+") {
                                                    access_log /opt/www/temp/log/nigerz;
                                                    return 444; break;
                                                    }
                                                    ##
                                                      –1
                                                      количество запросов на секунду не спасет?

                                                      limit_req_zone $binary_remote_addr zone=one:20m rate=5r/s;

                                                      Ваше решение выглядит — как из пушки по воробьям по моему…
                                                        0
                                                        Спасибо!.. спасло… :)

                                                        Only users with full accounts can post comments. Log in, please.