Перейти к содержанию

Получение TLS-отпечатков

Отпечаток TLS-соединения (JA4) характеризует клиента независимо от заявленного User-Agent. Библиотеки автоматизации и утилиты могут иметь узнаваемые отпечатки даже при подмене User-Agent.

Отпечаток используется на двух уровнях защиты:

  • Проверка по чёрному списку отпечатков.
  • Привязка токена к соединению. Токен, выданный одному клиенту, отклоняется при предъявлении с другим TLS-отпечатком.

Отпечаток вычисляется там, где терминируется TLS-соединение. Способ настройки зависит от места терминации TLS. Все три варианта обеспечивают одинаковый результат.

Вариант 1. Терминация на ноде

Если веб-сервер ноды самостоятельно терминирует TLS, включите сбор отпечатков директивой в блоке http:

antibot_fingerprinting on;

Отпечатки собираются для всех SSL-серверов конфигурации.

HTTP/3 не поддерживается. Соединения QUIC обрабатываются без отпечатка.

Вариант 2. Приём соединений без терминации

Если терминацию TLS выполнять нельзя, соединения принимаются модулем stream без расшифрования и передаются HTTP-серверам приложений. Отпечаток вычисляется на этапе TLS-рукопожатия, до расшифрования.

Пример конфигурации:

stream {
    server {
        listen 443;
        tls_fingerprint on;
        pass 127.0.0.1:8443;
    }
}

HTTP-серверы в этой схеме слушают порт 8443.

Для работы требуется nginx версии 1.25.5 или выше с модулем ngx_stream_pass_module.

Вариант 3. Терминация до ноды

Если TLS терминируется на предшествующем оборудовании – балансировщике, прокси или облачном терминаторе, отпечаток вычисляется на нём и передаётся на ноду в заголовке.

Нода использует полученный отпечаток для проверки по чёрному списку и привязки токена к соединению.

Требования к передаче отпечатка:

  1. Отпечаток должен передаваться при каждом обращении на всех путях трафика, включая программные интерфейсы и страницу проверки.

  2. Балансировщик должен перезаписывать входное значение заголовка. Клиент не должен иметь возможности задать его самостоятельно, иначе отпечаток можно подделать.

  3. Значение должно передаваться без изменений, поскольку сравнение выполняется посимвольно.

Вместе с отпечатком на ноду должен передаваться исходный IP-адрес клиента. Он используется для формирования отпечатка HTTP-запроса и проверки адресов.

Если терминатор выполняет подмену адреса (NAT), передайте исходный адрес в заголовке и настройте на ноде механизм real_ip с помощью директив set_real_ip_from и real_ip_header.

Без этой настройки все клиенты будут определяться по адресу балансировщика, и привязка токена к клиенту потеряет различимость.

Имя заголовка задаётся параметром blacklists.tls.field_map. По умолчанию принимаются заголовки x-ja4-fingerprint и ja4. Подробнее – в Параметрах конфигурации ноды.

Значение вычисляется Lua-модулем haproxy-ja4 и передаётся в заголовке X-JA4-Fingerprint.

Согласованность отпечатка

Токен сохраняет TLS-отпечаток в момент выдачи и сверяет его при каждом обращении.

Способ получения отпечатка должен быть единым для всего трафика. Если отпечаток передаётся только на части путей или изменяется при прохождении трафика, запросы блокируются с основанием Токен другого клиента (TLS Fingerprint).

Порядок анализа таких блокировок описан в Мониторинге и анализе заблокированных запросов.

Сравнение выполняется по настраиваемой маске. По умолчанию сопоставляются первые 22 позиции JA4, а нестабильная часть отпечатка игнорируется. Это исключает влияние различий, не связанных с клиентом.

Маска также позволяет использовать разные источники отпечатка, значения которых различаются в отдельных позициях.

Параметр tls_fingerprint_compare описан в Параметрах конфигурации ноды.

Если отпечаток недоступен

Отсутствие TLS-отпечатка не приводит к блокировке запроса. Проверки, использующие отпечаток, не выполняются:

  • Чёрный список TLS-отпечатков не срабатывает.
  • Токен не привязывается к TLS-соединению.

Остальные уровни защиты продолжают работать.

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

Проверить получение отпечатка можно по журналу ноды и переменной $antibot_check_result. Порядок проверки описан в Журналах и метриках ноды.