44
Защита от парсинга под нагрузкой Дмитрий Бархатов 2gis.ru @rnd2gis

«Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

  • Upload
    2-

  • View
    1.330

  • Download
    3

Embed Size (px)

DESCRIPTION

Когда в базе 1.3 млн. контактов компаний по всей России, неудивительно, что её периодически кто-то пытается распарсить. Здесь возникает проблема: как отличить добропорядочных пользователей от ботов? В своем докладе мы расскажем, как эволюционировала наша система защиты от парсинга. Мы рассмотрим следующие этапы и подходы: — особая локация в Nginx; — PHP + Redis (счетчик по ключу); — Nginx + Redis (конфигурационный файл); — Nginx + Lua + Redis : усложнение логики защиты без снижения скорости ответа. Также мы собираемся рассказать про язык Lua в связке с Nginx не только в случае защиты от парсинга, но и в других частых кейсах, когда не хочется «поднимать» тяжёлое основное приложение. Справочный API 2ГИС — крупнейший REST API в Рунете. Более 300 партнёров, среди которых 2ГИС-Онлайн, Mail.ru, НГС, Е1.ru. Месячная аудитория — 14 млн. Сервис предоставляет информацию об 1.3 млн. фирм и 1.8 млн. POI в 200 городах России, Падуе (Италия), нескольких городах в Украине и Казахстане.

Citation preview

Page 1: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Защита от парсинга поднагрузкой

Дмитрий Бархатов

2gis.ru @rnd2gis

Page 2: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

2ГИС

Page 3: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Данные

• 5 стран

• 10 тыс. населенных пунктов

• 5 млн. гео-объектов

• 2 млн. организаций

• 15 тыс. маршрутов

3

Page 4: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Нас парсят

Page 5: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

5

Page 6: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Проблемы

Мусорная нагрузка +

Плохая карма

Page 7: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Что делать?

Page 8: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

1. IP

Page 9: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

NAT

• Студенческая сеть

• Сотовая вышка

9

Page 10: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС
Page 11: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

2. API-ключhttp://api.2gis.ru/search?what=Пиво&where=Москва&key=1234

Ограничение по referer

11

Page 12: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

› curl --referer 2gis.ru

Page 13: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Кийя!

Page 14: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

3. Аналитикана лету

Page 15: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Анализируем нагрузку• RPS

• Нагрузка в динамике

15

Page 16: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Нагрузка за длительный периодНормальная ситуация

16

Page 17: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Нагрузка за длительный периодПарсер

17

Page 18: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Анализ активности на проекте• Хостинг

• Прачечные

• Школы каскадёров

• Матрасы

• Алмазное бурение

18

Page 19: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Итого по аналитике• Текущая нагрузка

• Кратковременная нагрузка

• Долговременная нагрузка

• Поведение

19

Page 20: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Как делать?

Page 21: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Каменный век — локация в NginX

geo $ban {

213.180.193.49 1;

}

01.

02.

03.

21

Page 22: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Средневековье — PHP + Redis22

Page 23: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Современность — Lua

openresty.org

23

Page 24: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

ngx_lua

location / {

content_by_lua '

ngx.say("hello, highload++")

';

}

01.

02.

03.

04.

05.

24

Page 25: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Lua: считаем RPS

http {

lua_shared_dict RPS 10m;

...

01.

02.

03.

25

Page 26: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Lua: считаем RPS

ip = ngx.var.remote_addr

rps = ngx.shared.RPS:incr(ip, 1)

if rps > X then

ngx.shared.BANNED:set(ip, 1)

ngx.exit(444)

end

01.

02.

03.

04.

05.

06.

26

Page 27: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Lua: смотрим динамику

for i = -60, 0 do

-- смотрим данные в хранилище

-- принимаем решение

end

01.

02.

03.

04.

27

Page 28: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Нагрузка в течение сутокLua как поставщик данных

location /get_bad_guys {

content_by_lua '

-- отдаем данные из хранилища

';

}

01.

02.

03.

04.

05.

28

Page 29: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Отстреливаем негодяевif ngx.shared.BANNED:get(ip) then

ngx.exit(444)

end

01.

02.

03.

29

Page 30: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Скорость?

Page 31: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Бенчи голосуют за Lua

http://openresty.org/#Benchmark

http://benchmarksgame.alioth.debian.org/u64/benchmark.php

http://attractivechaos.github.io/plb/

31

Page 32: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

1 мс

Page 33: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Да ладно!

Page 34: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

1 мс

Page 35: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

16000 RPS

Page 36: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Lua (1 мс) vs PHP (15 мс)

Page 37: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Попался, голубчик!

Page 38: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Бан или не бан• Уверены → Бан

• Не уверены → Помогите, люди добрые

38

Page 39: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Когда снимать бан?

Page 40: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС
Page 41: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Минусы всего подхода• Нет однозначной идентификации

• Бот может замаскироваться

41

Page 42: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Результат

В связи с временными техническими проблемами онлайн-версии

2GIS, мы решили предложить Вам выгодные условия по

приобретению нашей программы: успейте купить парсер организаций

2GIS по цене 2000 рублей вместо 4000 рублей

42

Page 43: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Просто и быстроИспользуйте простые скриптовые языки в связке с NginX с

алгоритмами анализа статистики в реальном времени.

43

Page 44: «Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС

Вопросы?

Дмитрий Бархатов

[email protected]

44