Cómo registrar claves de sesión TLS en HAProxy ala SSLKEYLOGFILE

Cómo registrar claves de sesión TLS en HAProxy ala SSLKEYLOGFILE

Estoy tratando de evitar el uso de una LD_PRELOADsolución basada en -, y la documentación de haproxy parece implicar que es posible crear un archivo sslkeylog sin decir realmente cómo.

Sé que la información puede "ponerse a disposición" en cierto modo contune.ssl.keylogque tiene documentos que hablan sobre todos los ejemplos necesarios para un archivo de registro de teclas estándar ssl_fc_server_traffic_secret_0como SERVER_TRAFFIC_SECRET_0.

¿Pero entonces, qué? ¿Cómo configuro una salida de "registro" que colocará cada elemento en su propia línea en el formato correcto?

Respuesta1

Esta es la forma complicada e incómoda en la que descubrí cómo hacer esto. No es genial:

Crea un archivo 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)

Esto se modifica deel originallo cual no estoy seguro de que haya funcionado alguna vez. Registra todas las claves de sesión como advertencias, que deberían ir a los registros habituales de HAProxy.

En la configuración de HAProxy:

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

frontend foobar
  http-request lua.sslkeylog

Luego, deberá tomar los registros (si están en systemd journalctl -u haproxy) y filtrar solo las líneas de registro relevantes, y eliminar cualquier marca de tiempo u otra información que preceda a EXPORTER_SECRETetc. No puedo ser más específico porque depende de la configuración del registro. Después de hacer eso, tendrá un archivo que puede entregar a Wireshark en combinación con un volcado de paquetes para obtener los datos.

información relacionada