HAProxy ala SSLKEYLOGFILE에서 TLS 세션 키를 기록하는 방법

HAProxy ala SSLKEYLOGFILE에서 TLS 세션 키를 기록하는 방법

나는 LD_PRELOAD기반 솔루션을 사용하지 않으려고 노력하고 있으며 haproxy 문서는 실제로 방법을 말하지 않고도 sslkeylog 파일을 만드는 것이 가능함을 암시하는 것 같습니다.

나는 정보가 일종의 "이용 가능"할 수 있다는 것을 알고 있습니다.tune.ssl.keylogssl_fc_server_traffic_secret_0와 같은 표준 키로그 파일에 필요한 모든 샘플에 대해 설명하는 문서가 있습니다 SERVER_TRAFFIC_SECRET_0.

그런데 그러면 어쩌죠? 각 항목을 올바른 형식으로 한 줄에 표시하는 "로그" 출력을 어떻게 설정합니까?

답변1

이것이 내가 이 작업을 수행하는 방법을 알아낸 해키적이고 어색한 방법입니다. 별로 좋지 않다:

루아 파일을 생성합니다 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에 제공할 수 있는 파일이 생성됩니다.

관련 정보