Как регистрировать ключи сеанса TLS в HAProxy с помощью SSLKEYLOGFILE

Как регистрировать ключи сеанса TLS в HAProxy с помощью SSLKEYLOGFILE

Я пытаюсь избежать использования LD_PRELOADрешения на основе , а документация haproxy, похоже, подразумевает, что можно создать файл sslkeylog, не говоря уже о том, как это сделать.

Я знаю, что информация может быть своего рода «доступной» с помощьюtune.ssl.keylogв котором есть документы, в которых рассказывается обо всех образцах, необходимых для стандартного файла кейлога, например, ssl_fc_server_traffic_secret_0для SERVER_TRAFFIC_SECRET_0.

Но что тогда? Как мне настроить вывод "журнала", который будет размещать каждую вещь на отдельной строке в правильном формате?

решение1

Вот такой хакерский, неуклюжий способ я придумал, как это сделать. Он не очень хорош:

Создайте lua-файл sslkeylogger.lua:

local function sslkeylog(txn)
    local fields = {
        CLIENT_EARLY_TRAFFIC_SECRET     = function() return txn.f:ssl_fc_client_early_traffic_secret()     end,
        CLIENT_HANDSHAKE_TRAFFIC_SECRET = function() return txn.f:ssl_fc_client_handshake_traffic_secret() end,
        SERVER_HANDSHAKE_TRAFFIC_SECRET = function() return txn.f:ssl_fc_server_handshake_traffic_secret() end,
        CLIENT_TRAFFIC_SECRET_0         = function() return txn.f:ssl_fc_client_traffic_secret_0()         end,
        SERVER_TRAFFIC_SECRET_0         = function() return txn.f:ssl_fc_server_traffic_secret_0()         end,
        EXPORTER_SECRET                 = function() return txn.f:ssl_fc_exporter_secret()                 end,
        EARLY_EXPORTER_SECRET           = function() return txn.f:ssl_fc_early_exporter_secret()           end
    }

    local client_random = txn.c:hex(txn.f:ssl_fc_client_random())

    -- ensure that a key is written only once by using a session variable
    if not txn:get_var('sess.sslkeylogdone') then
        for fieldname, fetch in pairs(fields) do
            if fetch() then
                core.Warning(string.format('SSLKEYLOG:: %s %s %s\n', fieldname, client_random, fetch()))
            end
        end

        txn:set_var('sess.sslkeylogdone', true)
    end
end

core.register_action('sslkeylog', { 'http-req' }, sslkeylog)

Это изменено соригиналкоторый, я не уверен, когда-либо работал. Он регистрирует все сеансовые ключи как предупреждения, которые должны идти в обычные журналы HAProxy.

В конфигурации HAProxy:

global
  tune.ssl.keylog on
  lua-load path/to/sslkeylogger.lua

frontend foobar
  http-request lua.sslkeylog

Затем вам нужно будет взять логи (если они в systemd, journalctl -u haproxy) и отфильтровать только соответствующие строки журнала, а также удалить любые временные метки или другую информацию, предшествующую EXPORTER_SECRETи т. п. Я не могу быть более конкретным, потому что это зависит от настройки ведения журнала. После этого у вас будет файл, который вы можете передать wireshark в сочетании с дампом пакетов для получения данных.

Связанный контент