На этой странице мы представляем несколько способов смягчения DoS-атак, доступных в настоящее время.
Все эти подходы можно комбинировать.
Однако на данный момент не существует единого универсального решения этой проблемы.
Защита сайта, подвергающегося атаке, требует творчества и индивидуального подхода.
Обзор реализованных средств защиты на демоне tor приведен в разделе Overview из спецификации Denial-of-service prevention mechanisms in Tor, а здесь мы дадим несколько практических советов.
Ограничение скорости в точках введения
С момента реализации Предложения 305 в файл torrc
было добавлено несколько опций, чтобы помочь смягчить DoS-атаки на точках входа:
HiddenServiceEnableIntroDoSDefense
: Включите защиту от DoS на уровне точек входа.
При включении опции значения параметров rate (скорость) и burst (пакет) будут отправлены на входную точку, которая затем будет использовать их для ограничения скорости запросов на подключение к ресурсу.
HiddenServiceEnableIntroDoSBurstPerSec
: допустимое количество пакетов клиента в секунду в точке входа.
Если этот параметр равен 0, он считается бесконечным, и, если HiddenServiceEnableIntroDoSDefense установлен таким образом, он эффективно отключает защиту.
HiddenServiceEnableIntroDoSRatePerSec
: Допустимая скорость входа клиентов в секунду в точке входа.
Если этот параметр равен 0, он считается бесконечным, и, если HiddenServiceEnableIntroDoSDefense установлен таким образом, он эффективно отключает защиту.
Более подробную информацию о том, как они работают, можно найти на странице руководства tor(1)
и в разделе Denial-of-Service defense extension (DOS_PARAMS) спецификации Onion Services v3.
Доказательство работы (PoW) перед созданием цепей рандеву
Механизм защиты Proof of Work (PoW) подробно описан в PoW FAQ, и может быть настроен для каждого Onion Service с помощью следующих опций torrc
:
HiddenServicePoWDefensesEnabled
: включение предотвращения DoS атак на основе доказательства работы.
Если этот параметр включен, tor будет включать параметры для дополнительной клиентской головоломки в зашифрованную часть дескриптора этого скрытого сервиса.
Приоритет входящих запросов на рандеву будет определяться в зависимости от количества усилий, которые клиент решит приложить при вычислении решения головоломки.
Служба будет периодически обновлять рекомендуемое количество усилий в зависимости от нагрузки атаки и полностью отключать головоломку, если служба не перегружена.
HiddenServicePoWQueueRate
: постоянная скорость отправки запросов на рандеву в секунду из приоритетной очереди.
HiddenServicePoWQueueBurst
: максимальный размер пакета для запросов на рандеву, обрабатываемых из приоритетной очереди одновременно.
Следующий глобальный параметр применим как к луковым сервисам, так и к их клиентам:
CompiledProofOfWorkHash
: когда активно предотвращение DoS-атак с доказательством работы, как сами службы, так и подключающиеся клиенты будут использовать динамически создаваемую хеш-функцию как часть вычислений головоломки.
PoW включен по умолчанию в C Tor версий 0.4.8.1-альфа и выше (но его можно отключить, если скомпилировать с помощью --disable-module-pow
).
Базовую поддержку PoW можно проверить, выполнив эту команду:
tor --list-modules
relay: yes
dirauth: yes
dircache: yes
pow: yes
Если у вас есть pow: yes
, то у вас есть механизм защиты PoW, встроенный в C Tor.
В соответствии с лицензионными требованиями клиентские библиотеки головоломок PoW v1 (Equi-X и HashX от tevador, оба в соответствии с LGPL-3.0) включены, только если tor скомпилирован с параметром --enable-gpl
.
Это можно подтвердить, выполнив следующую команду:
tor --version
Тор версия 0.4.8.3-rc.
На эту сборку Tor распространяется Стандартная общественная лицензия GNU (https://www.gnu.org/licenses/gpl-3.0.en.html)
Tor работает в Linux со стабильной версией Libevent 2.1.12, OpenSSL 3.0.9, Zlib 1.2.13, Liblzma 5.4.1, Libzstd N/A и Glibc 2.36 в качестве libc.
Tor скомпилирован с помощью GCC версии 12.2.0
Если ваш установленный C Tor не поддерживает PoW или не поддерживает GNU GPL, вам придется искать другие пакеты или скомпилировать его самостоятельно.
Ограничения потоков в установленных схемах рандеву
Для ограничения соединений в цепях встречи можно использовать следующие параметры конфигурации:
HiddenServiceMaxStreams
: максимальное количество одновременных потоков (соединений) на канал встречи.
Максимально допустимое значение — 65535. (Установка значения 0 позволит использовать неограниченное количество одновременных потоков.)
HiddenServiceMaxStreamsCloseCircuit
: если установлено значение 1, то превышение HiddenServiceMaxStreams приведет к отключению нарушающего канала встречи, в отличие от запросов на создание потока, которые превышают лимит, которые молча игнорируются.
Onionbalance
Onionbalance позволяет операторам обеспечить высокую доступность Onion-ресурсов, позволяя нескольким машинам обрабатывать поступающие запросы.
Вы можете использовать Onionbalance для горизонтального масштабирования.
Чем больше вы масштабируете, тем сложнее злоумышленникам сокрушить вас.
Onionbalance доступен для Onion-ресурсов v3.
Ограничение скорости веб-сервера
Если злоумышленники перегружают вас агрессивными цепочками, которые выполняют слишком много запросов, попробуйте обнаружить это чрезмерное использование и исключить их, используя опцию torrc HiddenServiceExportCircuitID
.
Вы можете использовать свою собственную эвристику или модуль ограничения скорости вашего веб-сервера.
Приведенные выше советы должны помочь вам удержаться на плаву в неспокойные времена.
В то же время мы работаем над более продвинутыми средствами защиты для снижения нагрузки на операторов onion-ресурсов в части ручной настройки.
Кэширование
Еще один способ снизить нагрузку на ваш сервис — реализовать кэширование контента либо непосредственно во внутреннем приложении, либо путем настройки внешнего кэширующего прокси-сервера.
Авторизация клиента или множество onion-адресов для разделения пользователей
Для обеспечения постоянного доступа пользователям, которым вы доверяете, вы можете предоставить им выделенные учетные данные Onion-ресурса и авторизацию клиента.
Для пользователей, которым вы не доверяете, разделите их на несколько адресов.
Тем не менее, наличие большого количества onion-адресов снижает уровень вашей безопасности (из-за использования большего количества сторожевых (guard) узлов), поэтому по возможности используйте авторизацию клиента.
Captchas и cookies
Если вам нужно дополнительно ограничить скорость пользователей, разделите свою инфраструктуру на слои и установите Captchas.
Таким образом, злоумышленники должны будут ввести Captchas, прежде чем атаковать глубже вашу инфраструктуру.
Captchas — это способ смягчения DDoS-атак.
При поступлении запроса от клиента выполняется проверка, содержит ли клиент правильный безопасный файл cookie, в противном случае идет перенаправление на страницу recaptcha.
Клиент вводит символы captcha.
Nginx отправляет введенные символы на сервер recaptcha для проверки.
Правильный ответ от сервера recaptcha содержит начало "true...", в противном случае – "false...".
Добавьте безопасный файл cookie для проверенного клиента и перенаправьте его на запрашиваемую им страницу.
Можно реализовать Captchas непосредственно на вашем веб-сервере с Nginx и OpenResty, используя Lua для генерации и проверки изображений captcha.
Однако настройка Captchas непростая.
Альтернативой может быть просто реализация вызова тестового cookie.
Веб-сервер проверяет возможность установки допустимых файлов cookie клиентами, вредоносные клиенты часто не имеют этой опции.
В Nginx Cloudflare предоставляет библиотеку для взаимодействия с файлами cookie.
Другие методы включают проверку клиентов, подключающихся к вашему .onion, на предмет того, что заголовок User-Agent имеет допустимое значение и значение заголовка Referer не может быть ассоциировано с атакой.