SSLKEYLOGFILE を使用して HAProxy で TLS セッション キーを記録する方法

SSLKEYLOGFILE を使用して HAProxy で TLS セッション キーを記録する方法

私は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 に渡してデータを取得できるファイルが作成されます。

関連情報