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

Зеркало отладки nginx post-ssl-termination

Как я могу сказать nginx выводить весь входящий трафик для данного server{} в конкретное / дополнительное / избыточное место после расшифровывая это (например, зеркалирование портов на маршрутизаторах), чтобы его можно было проанализировать в целях устранения неполадок?

Мне нужно отладить трафик, поступающий на веб-сайт, поддерживающий только https. Сервер безголовый, и я бы предпочел

  1. Не устанавливайте графический интерфейс только для wirehark
  2. Не перемещать мои закрытые ключи с сервера для последующего анализа в моем локальном графическом интерфейсе с помощью wirehark

Так что wirehark (наиболее часто упоминаемое решение для расшифровки https-потока) не является решением. Я хочу что-то, что работает только с интерфейсом командной строки и требует минимальных инструментов, работающих на сервере. Я проверил tcpdumpподдержка https; его нет, но вы можете объединить массу других инструментов и сделать его работоспособным, но это не совсем идеально.

Мой веб-сервер - nginx. Мне интересно, есть ли способ настроить nginx так, чтобы - помимо того, как он обычно обрабатывает свой трафик для данного server{} block - отправить расшифрованный трафик на какое-то зеркало (только для отладки), которое я затем могу проанализировать напрямую с помощью tcpdump, в идеале в режиме реального времени.

Можно ли добавить proxy_pass зеркало для nginx server{} block, чтобы nginx обрабатывал трафик, как обычно плюс отправка дешифрованного трафика в какое-то «отладочное» место (которое может быть просто nc -l 8080 или что-то)?

Я могу придумать два способа делать то, что вы хотите. Либо с помощью SSLKEYLOG и tshark, либо путем установки обратного прокси TLS.

ВАРИАНТ 1: SSLKEYLOG + TSHARK

Первый вариант - записать главные секреты SSL в SSLKEYLOGFILE, захватите зашифрованный трафик с помощью tcpdump и проанализируйте его с помощью tshark (версия Wireshark для командной строки).

ВАРИАНТ 2: ОБРАТНЫЙ ПРОКСИ TLS

Второй вариант - установить прокси-сервер проверки TLS, который поддерживает режим «обратного прокси», который расшифровывает входящий трафик, а затем повторно шифрует его перед пересылкой на веб-сервер. Прокси-сервер также должен каким-то образом поддерживать отправку копии трафика в РАСШИФРОВАННОМ режиме на внешний интерфейс.

Возможно, вы сможете выполнить "ВАРИАНТ 2" с SSLsplit, но я не уверен. Я знаю, что ты можешь сделать это с PolarProxy хотя (отказ от ответственности: PolarProxy разработан нами в Netresec). У нас есть сообщение в блоге под названием Обратный прокси и завершение TLS это объясняет, как настроить обратный прокси. Затем вы можете использовать tcpreplay для передачи дешифрованного трафика на сетевой интерфейс.

Недавно я узнал, что nginx действительно имеет эту функцию, начиная с версии 1.13.4. Используя mirror директиве вы можете пересылать копию каждого запроса на другой HTTP-сервер. Ответ, если таковой имеется, игнорируется.

в server или location для которых вы хотите, чтобы запросы отражались, добавьте mirror директива с URL-путем, который никогда не будет встречаться на вашем веб-сайте. Затем добавьте новый location который обслуживает именно этот путь и передает запросы на другой сервер.

Упрощенный пример:

server {
    location / {
        mirror /Jahg3bioshes;
        # ... the rest of your directives
    }

    location = /Jahg3bioshes {
        internal;
        proxy_pass http://sink.server.example$request_uri;
    }
}

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

nginx поддерживает lua в качестве языка сценариев. Таким образом, вы можете написать свои собственные функции для управления и сохранения данных, вызвав ngx.var.request_body и ngx.var.echo_request_body, или использовать тот, который уже есть, например https://github.com/thinkinside-LQ/httpdump