РАЗБОР
Статья
Как защититься от скрапинга данных: гайд SOC
[ обложка статьи ]
Режим чтения
Chess.com в 2023 году подтвердила: данные профилей утекли не через SQLi и не через компрометацию инфраструктуры. Атакующий тупо перебирал публичный API-эндпоинт, подставляя юзернеймы из готовых словарей, и складывал ответы в базу. Каждый запрос - валидный GET к эндпоинту профиля. Ничего подозрительного, если смотреть на единичный запрос. За последний год я разбирал три аналогичных инцидента на проектах с аудиторией от 50 тысяч пользователей - паттерн один и тот же: предсказуемые идентификаторы, одинаковый throttling на всех эндпоинтах и ноль алертов в SIEM до момента, когда дамп уже в продаже.
Бизнес-логика скрапера: зачем атакующему профили пользователей
Прежде чем строить детектирование скрапинга, стоит разобрать мотивацию. Без этого невозможно приоритизировать защитные меры и объяснить бизнесу, почему "просто чтение профилей" требует бюджета. Подробнее - в нашем подробном разборе bola idor уязвимость.Обогащение баз для credential stuffing. Скрапер собирает email, username, дату регистрации, привязанные соцсети. Эти данные обогащают существующие утечки паролей: если у атакующего есть пара
email:password из другого сервиса, а скрапнутый профиль подтверждает, что email активен на вашей платформе - credential stuffing (T1110.004, Credential Access) становится на порядок эффективнее.Таргетированный фишинг. Имя пользователя, email, рейтинг, дата последнего входа - готовый контекст для персонализированного письма. «Поздравляем с достижением рейтинга 1800 - подтвердите аккаунт» выглядит убедительнее массовой рассылки.
Перепродажа и конкурентная разведка. Базы профилей продаются на теневых площадках. Для сервисов с платной подпиской данные о tier-статусе пользователей имеют прямую коммерческую ценность.
По классификации OWASP API Security Top 10 (2023) массовый скрапинг попадает сразу под два риска:
- API4:2023 - Unrestricted Resource Consumption: API принимает неограниченное количество запросов без лимитов.
- API6:2023 - Unrestricted Access to Sensitive Business Flows: бизнес-процесс просмотра профиля доступен для автоматизированного злоупотребления.
Kill chain скрапера по MITRE ATT&CK
Скрапинг - не одноходовка. Типичная цепочка для массового сбора данных пользователей раскладывается по MITRE ATT&CK:| Этап | Техника MITRE ATT&CK | Что делает атакующий |
|---|---|---|
| Разведка | Search Open Websites/Domains (T1593, Reconnaissance) | Изучает Swagger/OpenAPI-спецификации, ищет эндпоинты через Google dorks типа site:target.com inurl:api |
| Сканирование | Active Scanning (T1595, Reconnaissance) | Перебирает эндпоинты, тестирует лимиты, определяет формат ответов |
| Начальный доступ | Exploit Public-Facing Application (T1190, Initial Access) | Использует публичный API без аутентификации или с минимальным API-ключом |
| Сбор | Data harvesting через HTTP GET | Последовательные запросы к /api/user/{id} с инкрементом ID или перебором словаря юзернеймов |
| Вывод данных | Automated Exfiltration (T1020, Exfiltration) | Автоматическая выгрузка и агрегация ответов в локальную БД |
Если API требует аутентификации, атакующий берёт купленные или украденные API-ключи - вариант с Cloud Accounts (T1078.004, Initial Access). В кейсе Chess.com аутентификация для чтения публичных профилей не требовалась вовсе.
Ключевой момент для SOC: каждый отдельный запрос в цепочке - легитимный. Алерт должен срабатывать на паттерн, а не на единичное событие. По данным Cequence, HTTP GET-запросы составляют до 99% всех транзакций типичного домена, и именно через них идёт скрапинг. Инструменты bot mitigation, заточенные под анализ POST-запросов, этот вектор просто не видят.
Детектирование скрапинга: от логов до SIEM-правил
Аномалии в API-трафике: сценарий из практики
Понедельник, 9:15 утра. В Grafana-дашборде по API-метрикам вижу аномалию: эндпоинт/api/v2/users/{id} за выходные обработал в 40 раз больше запросов, чем в среднюю неделю. RPS с одного /24-подсета - стабильные 12 запросов в секунду, ровно на 2 ниже порога rate-limiter'а. Кто-то аккуратно подобрал скорость. User-Agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) без единой вариации за 48 часов. Время между запросами - 83+-2 мс, идеальная периодичность, невозможная для человека.Что выдаёт скрапера в логах:
- Постоянный интервал между запросами. Человек кликает с разбросом 0.5-30 секунд. Скрипт на
requests+time.sleep(0.08)даёт разброс в миллисекунды. Эту ровную "пилу" видно невооружённым глазом на графике. - Один User-Agent без вариаций. Реальный браузер обновляется, меняет minor-версию. Скрапер использует захардкоженную строку.
- Последовательный перебор ID. Запросы к
/api/user/1001,/api/user/1002,/api/user/1003- инкремент на 1, или перебор по алфавитному словарю. - Отсутствие навигационного контекста. Нормальный пользователь заходит на главную, кликает в профиль, переходит в другой раздел. Скрапер бьёт только в один эндпоинт - как дятел.
- IP из хостинг-подсетей. 95% запросов с DigitalOcean, Hetzner, OVH - не из резидентных подсетей.
- Доля 404-ответов выше 30%. Перебор несуществующих ID или юзернеймов генерирует массу 404. При нормальном использовании такого не бывает.
Скомпрометированные легитимные аккаунты: слепая зона SOC
Отдельная головная боль - скрапинг через скомпрометированные легитимные аккаунты или партнёрские API-интеграции, которые превышают заявленный scope. Когда атакующий использует реальный API-ключ сотрудника, rate-limiter по IP и репутационные списки бесполезны. То же самое с инсайдером, который выгружает данные через штатный доступ.Детектировать такие случаи можно только через anomaly detection по конкретному аккаунту: если партнёрская интеграция, которая обычно делает 200 запросов в день, внезапно начинает генерировать 20 000 - это сигнал. SIEM-правило должно учитывать исторический baseline каждого API-ключа, а не только глобальные пороги. На практике этот baseline мало кто ведёт - и зря.
Sigma-правила для корреляции в SIEM
Для обнаружения автоматизированного сбора данных нужны правила, работающие на агрегации:
YAML:
title: API Scraping - High Volume Profile Enumeration
description: Detects high-volume requests to user profile endpoint
logsource:
category: webserver
product: nginx
detection:
selection:
cs-uri-stem|contains: '/api/user/'
timeframe: 5m
condition: selection | count(cs-uri-stem) by c-ip > 200
level: high
tags:
- attack.collection
- attack.t1020
Защита API от скрапинга: rate limiting и поведенческий анализ
Подход "только по IP" предсказуемо проваливается. Скрапинг-боты используют ротацию через residential proxy, где каждый IP делает единичные запросы - rate limiter их не ловит. Я видел скраперов, которые распределяли нагрузку на 10 000+ IP - по 2-3 запроса с каждого. Формально - обычные пользователи.
WAF от ботов и скрапинга: уровни детекции
Статические правила WAF (блокировка по User-Agent, geo-фильтры, IP-репутация) - необходимый минимум, но не более того. Современные anti-scraping решения добавляют три уровня поведенческого анализа:TLS/HTTP-fingerprinting. JA3/JA4-хеш TLS-хендшейка идентифицирует библиотеку запроса. Python
requests и Go net/http дают характерные JA3-отпечатки, отличные от Chrome или Firefox. Против скриптов работает отлично, против headless-браузеров - бесполезно.Browser fingerprinting. Canvas rendering, WebGL, список шрифтов, Audio API создают уникальный отпечаток посетителя. Headless-браузеры (Puppeteer, Playwright) оставляют артефакты:
navigator.webdriver === true, отсутствие плагинов, характерные viewport-размеры. По данным Firecrawl, несоответствие между заявленным User-Agent и реальными capabilities - основной сигнал детекции автоматизации.Поведенческий анализ сессии. Реальный пользователь скроллит, кликает, перемещает мышь. Скрапер делает только API-запросы без навигационного контекста. Graduated response - мониторинг, greylist, CAPTCHA-challenge, блок - минимизирует false positives и не мешает легитимным пользователям (A07:2021 - Identification and Authentication Failures по OWASP Top 10). Не надо сразу рубить - сначала присмотритесь.
Honeypot-эндпоинты и канареечные данные
Honeypot-подход - один из самых недооценённых методов предотвращения массового скрапинга. Защита персональных данных пользователей API здесь работает на опережение: вы не просто блокируете, а идентифицируете атакующего.Три приёма, которые реально работают:
- Скрытый эндпоинт через robots.txt. Добавьте
Disallow: /api/v2/internal/users-export. Легитимные краулеры его пропустят, а скрапер, который читает robots.txt как карту сокровищ, отправит запрос. Любое обращение к этому URL - немедленный алерт (RS.AN-01 по NIST CSF v2.0). - Канареечные записи в ответах API. Встройте фейковые профили с уникальными email-адресами на домене-ловушке. Если такой email всплывёт в утёкшей базе - подтверждение скрапинга и точка для расследования. Простой, но элегантный трюк.
- CSS-скрытые ссылки. Элемент с
display:none, содержащий ссылку на API-эндпоинт: человек его не увидит, но бот, парсящий DOM - перейдёт.
Мониторинг аномальной активности API: чек-лист для SOC
| Проверка | Инструмент | Приоритет |
|---|---|---|
| Baseline RPS по каждому API-эндпоинту | Grafana/Prometheus, ELK | Критический |
| Алерт на аномальный RPS с одного IP/подсети | SIEM (Sigma-правило выше) | Критический |
| Дифференцированный rate limiting по типу эндпоинта | nginx/Kong/Cloudflare | Критический |
| Проверка предсказуемости ID (IDOR-аудит) | DAST-сканер, ручной пентест | Критический |
| Мониторинг JA3/JA4-хешей входящего трафика | nginx + ja3 module, WAF | Высокий |
| Соотношение 200/404-ответов по IP | ELK/Splunk | Высокий |
| Аудит публичных API-спецификаций (Swagger/OpenAPI) | Ручной review | Высокий |
| Baseline запросов по каждому API-ключу | SIEM / custom dashboard | Высокий |
| Honeypot-эндпоинт в robots.txt | Кастомный handler + SIEM | Средний |
| Канареечные записи в API-ответах | Кастомная логика в backend | Средний |
Чек-лист покрывает DE.AE-01 по NIST CSF v2.0 (установка baseline и мониторинг аномалий) и RS.AN-01 (расследование алертов от систем детектирования). Начинайте с критических пунктов - они закрывают 80% вектора при минимальных затратах.
Массовый скрапинг - единственная категория API-атак, которую большинство SOC-команд до сих пор не мониторит вообще. Credential stuffing детектируют, DDoS отбивают, SQL injection WAF ловит. А когда бот тихо выкачивает профили со скоростью 5 RPS - это ниже радара, потому что формально ничего не ломает. Последствия проявляются позже: данные месяцами лежат на теневых площадках, потом возвращаются в credential stuffing-атаках уже против вас. И когда регулятор спрашивает, почему API с персональными данными работал без rate limiting на уровне эндпоинта - "мы не считали это угрозой" звучит как признание халатности.
На каждом втором проекте вижу одну и ту же картину: API-gateway настроен, rate-limiter стоит, но лимиты одинаковые для всех эндпоинтов. Поиск товаров и выдача PII пользователя живут с одним порогом в 100 RPS. Разделение лимитов по чувствительности данных - нулевые затраты на внедрение и кратный рост устойчивости. Отсутствие baseline по API-ключам партнёрских интеграций - вторая типичная дыра: инсайдер или скомпрометированный партнёр выкачивает данные штатным доступом, а SOC узнаёт об этом из Telegram-канала с утечками. Если вы строите мониторинг API-трафика с нуля или адаптируете правила под свой WAF-стек - на codeby.net коллеги ведут тред с разбором кейсов детектирования API-скрапинга и обменом конфигами под разные платформы.
AI-выжимка
по разделам
Тезисы статьи скоро
Статья читается полностью. Тезисы со ссылками на разделы появятся позже.
Содержание
Codeby Academy
Практика и мастерство
От основ до продвинутого — программы для практиков Codeby.
Перейти к курсу →
Продолжить чтение
Следующий разбор
Обход ACL через парсинг URL на реверс-прокси
Комментарии
0