Como registrar chaves de sessão TLS no HAProxy ala SSLKEYLOGFILE

Como registrar chaves de sessão TLS no HAProxy ala SSLKEYLOGFILE

Estou tentando evitar o uso de uma LD_PRELOADsolução baseada em -, e a documentação do haproxy parece sugerir que é possível criar um arquivo sslkeylog sem realmente dizer como.

Eu sei que a informação pode ser “disponibilizada” comtune.ssl.keylogque contém documentos que falam sobre todos os exemplos necessários para um arquivo de keylog padrão como ssl_fc_server_traffic_secret_0for SERVER_TRAFFIC_SECRET_0.

Mas então o que? Como configuro uma saída de “log” que colocará cada coisa em sua própria linha no formato correto?

Responder1

Esta é a maneira hackeada e estranha com que descobri como fazer isso. Não é ótimo:

Crie um arquivo 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)

Isto é modificado deo originalque não tenho certeza se funcionou. Ele registra todas as chaves de sessão como avisos, que devem ir para os logs normais do HAProxy.

Na configuração do HAProxy:

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

frontend foobar
  http-request lua.sslkeylog

Em seguida, você precisará capturar os logs (se estiverem no systemd journalctl -u haproxy) e filtrar apenas as linhas de log relevantes e remover quaisquer carimbos de data e hora ou outras informações anteriores a EXPORTER_SECRETe tal. Não posso ser mais específico porque depende da configuração do log. Depois de fazer isso, você terá um arquivo que poderá fornecer ao wireshark em combinação com um despejo de pacotes para obter os dados.

informação relacionada