So protokollieren Sie TLS-Sitzungsschlüssel in HAProxy ala SSLKEYLOGFILE

So protokollieren Sie TLS-Sitzungsschlüssel in HAProxy ala SSLKEYLOGFILE

Ich versuche, die Verwendung einer LD_PRELOAD-basierten Lösung zu vermeiden, und die Haproxy-Dokumentation scheint anzudeuten, dass es möglich ist, eine SSL-Keylog-Datei zu erstellen, ohne tatsächlich zu sagen, wie.

Ich weiß, dass die Informationen sozusagen „zur Verfügung gestellt“ werden können mittune.ssl.keylogDas Dokument enthält alle Beispiele, die für eine Standard-Keylog-Datei wie beispielsweise erforderlich ssl_fc_server_traffic_secret_0sind SERVER_TRAFFIC_SECRET_0.

Aber was dann? Wie richte ich eine „Log“-Ausgabe ein, die jedes Element im richtigen Format in eine eigene Zeile setzt?

Antwort1

So habe ich es auf eine etwas umständliche und umständliche Art und Weise herausgefunden. Sie ist nicht besonders gut:

Erstellen Sie eine Lua-Datei 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)

Dies ist geändert vondas Originalvon dem ich nicht sicher bin, ob es jemals funktioniert hat. Es protokolliert alle Sitzungsschlüssel als Warnungen, die in die regulären HAProxy-Protokolle aufgenommen werden sollten.

In der HAProxy-Konfiguration:

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

frontend foobar
  http-request lua.sslkeylog

Dann müssen Sie die Protokolle abrufen (sofern sie in systemd vorhanden sind journalctl -u haproxy) und nur nach relevanten Protokollzeilen filtern und alle Zeitstempel oder andere davor stehende Informationen EXPORTER_SECRETusw. entfernen. Genauer kann ich nichts sagen, da es von der Protokollierungskonfiguration abhängt. Danach haben Sie eine Datei, die Sie in Kombination mit einem Paket-Dump an Wireshark übergeben können, um die Daten abzurufen.

verwandte Informationen