
私はLD_PRELOAD
ベースのソリューションの使用を避けようとしていますが、haproxy のドキュメントでは、実際に方法を説明することなく sslkeylog ファイルを作成できることを示唆しているようです。
情報は「利用可能」になる可能性があるとわかっていますチューン.ssl.キーログssl_fc_server_traffic_secret_0
これには、 のような標準のキーログ ファイルに必要なすべてのサンプルについて説明したドキュメントがありますSERVER_TRAFFIC_SECRET_0
。
しかし、その後はどうするのでしょうか? それぞれの項目を適切な形式で独自の行に配置する「ログ」出力を設定するにはどうすればよいでしょうか?
答え1
これは私が考え出した、ハッキーで不格好な方法です。あまりいい方法ではありません。
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)
これは、オリジナルこれが機能したかどうかはわかりません。すべてのセッション キーが警告としてログに記録されますが、これは通常の 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 に渡してデータを取得できるファイルが作成されます。