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