Назад | Перейти на главную страницу

Как безопасно перехватывать или дублировать входящие запросы к веб-серверу

Мы взяли на себя устаревшее веб-приложение, которое мы не можем изменить (исходный код поврежден и развертывание не удается), и в конечном итоге мы его перепишем. В идеале мы должны переносить его поэтапно, но это невозможно, так как мы не можем эффективно изменять приложение.

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

Что за самый легкий и самый безопасный способ захвата входящих HTTP-запросов со всеми связанными данными? Решение должно быть прозрачным для пользователей API. Сервер работает на Ubuntu Linux, и у нас есть доступ к нему по SSH. Веб-приложение работает на Apache 2 на Ruby.

Как сравнить вышеперечисленные решения с точки зрения:

Пожалуйста, не стесняйтесь предлагать любые другие / лучшие альтернативы.

Опция сниффера пакетов хороша, пока в соединении не используется шифрование, тогда вы будете SOL. В этом случае вам понадобится модель прокси для захвата, где пользователи подключаются к прокси с помощью SSL, принимают сертификат прокси, а затем соединение с прокси снова выполняется по протоколу SSL на целевой хост. Инструменты тестирования, такие как LoadRunner, Jmeter или подобные, были бы хороши для записи разговора через прокси для одного пользователя, чтобы вы могли изучить структуру передаваемой информации, но были бы непрактичными для производственного использования несколькими пользователями.

Я бы поискал пакет прокси-сервера, в котором вы могли бы настроить прокси для сброса запросов в журнал для целей анализа. Таким образом, у вас будет необработанное представление запроса за пределами SSL и необходимость повторной сборки пакетов из трассировки уровня пакетов.

Самый простой и безопасный способ его перехвата - просто запустить анализатор пакетов, как вы предложили. Если вы просто выполните поиск в Интернете по запросу «воспроизвести HTTP-запросы», вы получите любое количество программ, которые могут захватывать, а затем воспроизводить ваши запросы. Для этого есть и профессиональные инструменты, например «LoadRunner», который я использую на работе.

Если вы не хотите устанавливать дополнительное программное обеспечение, вы можете использовать tcpdump -s0 -w /path/to/output.file для захвата трафика. Это даст вам файл, из которого вы сможете читать, используя «tcpdump -A -r /path/to/output.file», предположительно используя такие фильтры, как «dst = ip.to.webserver». Но тогда вам понадобится что-нибудь, чтобы воспроизвести это.

Вот пример того, как я использую tcpdump на localhost:

$ tcpdump -i lo0 -s0 -w /tmp/tcpdump.out

тем временем я захожу на веб-сайт на локальном хосте из другого окна; как только это закончится, я нажму ctrl-c, чтобы остановить tcpdump

$ sudo tcpdump -r /tmp/tcpdump.out  -t -q -n -A 'tcp dst port 80 and  (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
reading from file /tmp/tcpdump.out, link-type EN10MB (Ethernet)
IP 127.0.0.1.57499 > 127.0.0.1.http: tcp 122
E.....@.@.P............P.zE................
.9...9..GET /~dyho01/ HTTP/1.0
User-Agent: Wget/1.11.4 Red Hat modified
Accept: */*
Host: localhost
Connection: Keep-Alive

Вероятно, вы могли бы получить ту же информацию, открыв необработанный файл tcpdump в программе Windows, такой как wirehark.

я хотел бы использовать tcpdump или ngrep, было бы неплохо, если бы порт на коммутаторе, подключенный к веб-серверу, был зеркальным, но в противном случае вы можете запустить ngrep или tcpdump на самом сервере.

Для запуска любой из этих программ вам потребуется доступ суперпользователя.

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

ngrep -l -q -d eth0 "^POST " tcp and port 80 -O dump.file

Это доставит вам любые HTTP-данные, отправленные на порт 80 на eth0. Возможно, вы сможете выбрать что-нибудь более конкретное. Если вы собираетесь читать трафик прямо из файла, вы можете добавить -W byline поскольку он делает пакеты более читаемыми, поскольку учитывает разрывы строк, поэтому вы можете видеть, что пакет записан более логично (для людей). -O dump.file запишет результат захвата вашего пакета в файл. Вывод может быть сколь угодно подробным, чтобы воспроизвести пакеты, посмотрите на tcpreplay