Информация Как защитить сервер при помощи кук

Тема в разделе "Защита от DDOS своими силами", создана пользователем X-Shar, 5 июл 2016.

↑ ↓
  1. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.807
    Симпатии:
    426
    Пол:
    Мужской
    Репа:
    +959 / 152 / -29
    Jabber:
    Skype:
    ICQ:

    638294628

    Nginx-logo.

    Способ не нов, но я совсем недавно про это узнал !

    Да есть ботнеты, которые могут моделировать поведение посетителя, но не у всех дудосеров такие ботнеты, также немногие стрессеры как понимаю могут обходить предложенной в этой теме способ ! :)

    Итак смысл:

    Мы проверяем всех посетителей на возможность принимать куки, если посетитель не может принять наш кук, то скорей-всего это бот и блокируем доступ к сайту ! :)

    Как сделать это средствами nginx !

    На самом деле ничего такого сложного нет, расписываю всё по шагам (Будем считать что вы поставили чистый nginx с офф. сайта):

    1)Установка модуля Testcookie-nginx-module. в nginx:

    К сожалению, в офф. сборке нет этого модуля, поэтому сделаем всё как реальные пацаны, а именно соберём модуль из исходников и динамически подключим его !

    Как это сделать:

    Ставим Nginx из репозитория с офсайта.

    Проверяем его версию:
    Код:
    nginx -V 2>&1|grep "nginx version"
    nginx version: nginx/1.9.12 
    Потом там же берем опции компиляции:
    Код:
    nginx -V
    Стягиваем модуль:
    Код:
    cd /usr/src
    git clone https://github.com/kyprizel/testcookie-nginx-module.git 
    Ставим зависимости:
    Код:
    apt-get install -y libxml2-dev libxslt-dev libgd2-xpm-dev libgeoip-dev  
    Собираем модуль (Версия нужна nginx, та-которая установлена на нашем сервере, т.е. не-та которая в примере):
    cd /usr/src
    wget 'http://nginx.org/download/nginx-1.9.12.tar.gz'
    tar -xzvf nginx-1.9.12.tar.gz
    cd nginx-1.9.12/

    # configure параметры берем из выдачи nginx -V выше, не забудьте добавить
    --add-dynamic-module=/usr/src/testcookie-nginx-module
    (ХОТЯ МОЖНО И ЭТИ,ТО-ЧТО НИЖЕ, ЕСЛИ БУДЕТ ОШИБКА)

    ./configure --add-dynamic-module=/usr/src/testcookie-nginx-module --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/etc/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_v2_module --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,--as-needed' --with-ipv6
    Собираем:
    Код:
    make
    Потом берем бинарик:
    Код:
    mkdir /etc/nginx/modules
    cp ./objs/ngx_http_testcookie_access_module.so /etc/nginx/modules 
    И добавляем в nginx.conf в самом верху:
    Код:
    load_module "modules/ngx_http_testcookie_access_module.so";
    Перезагружаем nginx и всё далее идём настраивать!

    2)Настройка нашего модуля:

    Основная настройка сводится к правке nginx.conf, где особое внимание уделяется параметрам testcookie_secret и testcookie_arg. Генерируем значения самостоятельно. Входные строки можно брать любые, главное получить на выходе славный набор символов.
    Код:
    # echo label |md5sum
    41cc0e4945e162021cfdd993f4c1104d  -
    # echo defcon |md5sum
    15dbedaeabc7f0c09f0fe834e4a3b46a  -
    Полученные значения подставляем в качестве аргументов для testcookie_secret и testcookie_arg.
    значение для testcookie_name также можно установить произвольное.
    Код:
    # vi /etc/nginx/nginx.conf
    http {
            ...
            testcookie off;
            testcookie_name XSAE;
            testcookie_secret 15dbedaeabc7f0c09f0fe834e4a3b46a;
            testcookie_session $remote_addr;
            testcookie_arg label_41cc0e4945e162021cfdd993f4c1104d;
            testcookie_max_attempts 3;
            testcookie_get_only on;
            testcookie_internal off;
            # используем белые списки
            include /etc/nginx/testcookie_whitelist.conf;
            ...
    }

    Создаем движок rewrite'ов в /etc/nginx/testcookie.conf
    Cуть в следующем, необходимо делать реврайт конечного урла, но не делать это так чтобы светился параметр редиректа (?label_*)
    Код:
    # vi /etc/nginx/testcookie.conf
    set $do_rewrite 0;
    # проверяем наличие выданной куки
    if ($http_cookie ~ "XSAE=[0-9a-f]+") {
            set $do_rewrite 1;
    }
    # если в аргументах присуствует метка выданная модулем, выкусываем её
    if ($args ~ "^((.*)(label_41cc0e4945e162021cfdd993f4c1104d=1&|&label_41cc0e4945e162021cfdd993f4c1104d=1(.*))|label_41cc0e4945e162021cfdd993f4c1104d=1)$") {
            set $target "$2$4";
            set $do_rewrite "1${do_rewrite}";
    }
    # делаем правильный реврайт, подставляем только урл и другие возможные параметры (без метки)
    if ($do_rewrite = 11) {
            set $args $target;
            rewrite ^.*$ http://$host$uri break;
    }

    Белый список (для краткости сократил до двух адресов)
    Код:
    # vi /etc/nginx/testcookie_whitelist.conf
    testcookie_whitelist {
    # Yandex
    77.88.0.0/18;
    87.250.224.0/19;
    }
    Изменения в /etc/nginx/proxy_headers.conf
    Код:
    # vi /etc/nginx/proxy_headers.conf
    testcookie         on;
    proxy_redirect     off;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; 
    Затем в каждый из конфигурационных файлов виртуальных хостов прописываем в начало секции server. Таким образом в каждом виртуальном хосте мы подгружаем rewrite-движок, и белые списки. Сам механизм testcookie будет работать в случаях когда запросы проксируются на бэкенды и подгружается proxy_headers.conf
    Код:
    server {
            ...
            include /etc/nginx/testcookie.conf;
            include /etc/nginx/testcookie_whitelist.conf;
            ...
    # пример локейшена
    location / {
            include /etc/nginx/proxy_headers.conf;
            proxy_pass http://upstream;
    }

    Перезапускаем.
    Код:
    # nginx -t -c /etc/nginx/nginx.conf
    # /etc/init.d/nginx restart
    Также прилагаю во вложении конфиги + белый список поисковых систем (файл testcookie_whitelist.conf), рекомендую туда добавить также айпи своего сервера и монеторинг ! :)
     

    Вложения:

    • TstCookie.zip
      Размер файла
      2,1 КБ
      Просмотров:
      1
    Последнее редактирование: 5 июл 2016
  2. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.807
    Симпатии:
    426
    Пол:
    Мужской
    Репа:
    +959 / 152 / -29
    Jabber:
    Skype:
    ICQ:

    638294628

    Забыл сказать, вот собрал этот модуль для самой последней nginx 1.11.1, у кого возникнет сложности со сборкой, попробуйте просто закинуть в папку /usr/lib/nginx/modules и подключить в конфиге nginx.conf:
    Код:
    load_module "modules/ngx_http_testcookie_access_module.so";
    Может и попрёт, если-же нет, то придётся собирать ! :(
     

    Вложения:

  3. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.807
    Симпатии:
    426
    Пол:
    Мужской
    Репа:
    +959 / 152 / -29
    Jabber:
    Skype:
    ICQ:

    638294628

    Вложения:

  4. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.807
    Симпатии:
    426
    Пол:
    Мужской
    Репа:
    +959 / 152 / -29
    Jabber:
    Skype:
    ICQ:

    638294628

  5. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.807
    Симпатии:
    426
    Пол:
    Мужской
    Репа:
    +959 / 152 / -29
    Jabber:
    Skype:
    ICQ:

    638294628

    После подключения этого модуля, яндекс выкинул более половины страниц и обнулил ТИЦ, а не прошло и двух недель !

    Написал им в ТП, предварительно отключив модуль, вот-что ответили:

    Здравствуйте, Олег!

    Приведенные Вами страницы были исключены из поиска, поскольку ранее на запросы робота они отвечали HTTP-кодом 307. Для выяснения причин появления проблемы Вы можете обратиться к администратору Вашего сайта. Сейчас ошибка не возникает, страницы будут беспрепятственно индексироваться роботом и смогут вернуться в поиск с последующими обновлениями поисковой базы по мере их переобхода роботом.

    Вы можете ускорить индексацию наиболее важных страниц Вашего сайта с помощью инструмента «Переобход страниц» в Яндекс.Вебмастере (Авторизация ). Добавленные через этот сервис страницы смогут появиться в поиске через 1-2 недели.
     

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