我想添加额外的日志记录,特别是来自 TLS 连接详细信息的样本。我正在运行 haproxy v2.0,但我实在想不出如何捕获除一些请求标头之外的任何内容。根据http 请求捕获(重点是我的):
http 请求捕获 [ len | id ] [ { if | except } ]
这将从请求缓冲区捕获示例表达式,并将其转换为最多包含 100 个字符的字符串。生成的字符串将存储在下一个请求“捕获”槽中,因此它可能会出现在某些捕获的 HTTP 标头旁边。然后它将自动出现在日志中,并且可以使用示例提取规则提取它以将其输入到标头或任何其他内容中。长度应该受到限制,因为将在整个会话生命周期内为每次捕获分配此大小。请查看第 7.3 节(获取样本)和“捕获请求标头”以了解更多信息。
需要注意的是,整个 7.3 节列出了许多可用的样本/提取类型。因此,我期望使用一些随机的第 5 层提取可以实现以下功能:
frontend https
bind :443 accept-proxy alpn h2,http/1.1 ssl crt-list /usr/local/etc/haproxy/https.cfg
log-format "... %hr %hs ..."
# Inform our downstreams of the client connection deets
http-request set-header X-SSL-Version %{+Q}[sslv]
# Add some additional logging infromation
# errors: unknown fetch method 'sslv'
http-request capture sslc len 64 # ECDHE-ECDSA-AES256-GCM-SHA384
# errors: unknown fetch method '%[sslv]'
http-request capture %[sslc] len 64 # ECDHE-ECDSA-AES256-GCM-SHA384
# works
http-request capture req.hdr(Host) len 253 # foo.example.com
我期望发生的是获得类似以下内容的日志行:
... {ECDHE-ECDSA-AES256-GCM-SHA384|foo.example.com} ...
如果有人能指出我做错的地方,我将不胜感激。感觉就像我“拿错了”,但我根本没注意到。
谢谢
PS 我还想知道是否可以在连接失败(例如 TLS 客户端连接被拒绝)的情况下添加 L5 样本。像这样不透明的错误消息https/1: SSL handshake failure
很难诊断。
答案1
sslc 和 sslv 似乎都没有被列为第 7.3 节。它们可能是日志格式化宏或类似的东西。您必须使用带有 的提取http-request capture
,而不是日志变量。
使用的 SSL/TLS 密码是ssl_fc_cipher
(假设您想要客户端的密码)。版本是ssl_fc_protocol
...但文档很糟糕,我确认这一点的唯一方法是HAProxy Technologies 的博客文章关于如何检查您是否容易受到 POODLE 的攻击。
换句话说,你需要这样做:
http-request capture ssl_fc_protocol len 8
http-request capture ssl_fc_cipher len 64
我认为不可能得到比它给你的更好的错误消息,因为那只是 OpenSSL 像往常一样没用。