Глеб Гончаров

Системный администратор в ФанБоксе. Автоматизирую и сопровождаю инфраструктуру для проектов мобильных операторов.

Блокировка Tor в NGINX

Защитная стратегия защиты от DDoS атаки из TOR на уровне веб-приложения — блокировка HTTP-запросов из луковых подсетей. Сделать это несложно: проект Tor Project регулярно обновляет списки выходных узлов сети.

[...]
ExitNode FF0D1841086637CA0920E21AFA4C6A43905EA2BD
Published 2017-01-02 11:00:24
LastStatus 2017-01-02 12:03:41
ExitAddress 45.76.159.203 2017-01-02 12:12:29
ExitNode FFB8575D7C8E40AC6E48C1B7AA32AC7701E04AB9
Published 2017-01-01 16:10:32
LastStatus 2017-01-01 20:03:40
ExitAddress 80.15.98.127 2017-01-01 18:10:35
ExitNode FFB94702D023B6F824D8B3BC68F33EA02AFA70D8
Published 2017-01-02 08:37:56
LastStatus 2017-01-02 09:02:40
ExitAddress 51.15.39.2 2017-01-02 09:07:51

Обрабатываем реестр в формате TorDNSEL и сохраняем узлы в список:

curl -Ls https://check.torproject.org/exit-addresses | grep ExitAddress | awk '{print $2}' | sort | uniq > tor.list

Результирующий файл и включаем опцией include в секции geo (ngx_http_geo_module):

geo $is_tor {
  default 0;
  include /etc/nginx/conf.d/tor.list;
}

В секции server виртуального хоста указываем условие с кодом возрата:

Переменную ещё можно залогировать. Такие журналы интересно потом читать или разбирать.

if ($is_tor) {
  return 403;
}

Готово. Рекомендую также поэкспериментировать со ответами веб-сервера: иногда атакующий прекращает DDoS при получении статус-кодов 5XX. Как вариант, завершать запрос с внутренним кодом 444 для разрыва TCP-сессии.

Профилирование CS-Cart в XHProf

Инженерный подход анализа производительности веб-приложений лежит через профилирование. Иерархический профилировщик XHProf от Facebook помогает разработчикам измерять и оценивать производительность PHP-кода. Чтобы начать его использовать для исследования проблемных мест в магазине CS-Cart:

Шаг 1. Установите XHProf из PECL

[sudo] pecl install xhprof-0.9.4

Не забудьте перезапустить процесс веб-сервера или демона FPM.

Шаг 2. Перейдите в каталог с проектом

cd /var/www/html

Шаг 3. Склонируйте репозиторий XHProf

git clone https://github.com/phacility/xhprof.git

Шаг 4. Вставьте следующий код в начало файла index.php

if (isset($_GET['debugging'])) {
    xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
}

Шаг 5. Найдите функцию fn_dispatch в файле app/functions/fn.control.php. Поместите следующий код после вызова хука complete

if (isset($_GET['debugging'])) {
    $xhprof_data = xhprof_disable();

    include_once DIR_ROOT . "/xhprof/xhprof_lib/utils/xhprof_lib.php";
    include_once DIR_ROOT . "/xhprof/xhprof_lib/utils/xhprof_runs.php";

    $xhprof_runs = new \XHProfRuns_Default();
    $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

    echo "<!--\n" . "/xhprof/xhprof_html/index.php?run=$run_id&source=xhprof_foo\n" . "--!>\n";
}

Закомментируйте вызов exit в теле функции, чтобы XHProf сохранил отчёт.

Готово. Откройте любую страницу веб-сайта. Допишите к адресу магазина xhprof/xhprof_html, чтобы просмотреть отчёт профилировщика. Отсортируйте строки таблицы по полю “Exclude Wall Time” для поиска медленных функций.

К сожалению, Facebook приостановили развитие расширения в феврале 2015 года — тогда, когда PHP 7.0 ещё не вышел. Энтузиасты развивают форк с поддержкой 7-й ветки, но использовать его в бою не рекомендую.