java - 在 Tomcat 的访问日志中记录 HAProxy 特定的密码
问题描述
我在 HAProxy 负载均衡器后面有一个 Web 应用程序,设置为 SSL 终止模式来处理/解密 SSL 连接。haproxy.cfg 的前端和后端部分如下:
frontend web_applications
mode http
option httplog
option forwardfor
capture request header Referer len 2000
capture request header User-Agent len 250
capture request header Host len 100
capture request header X-Forwarded-For len 50
reqadd X-Forwarded-Proto:\ https
default_backend web_applications
bind *:443 ssl crt /etc/haproxy/certs/cert.pem ciphers AES256
backend web_applications
mode http
balance roundrobin
server web_applications webappserver.net:80 check
现在,我需要增强后端应用程序的 tomcat 访问日志以记录与 HAProxy 绑定的密码。所以在这种情况下'AES256'。我正在寻找一种方法来访问在 tomcat 服务器配置文件的 AccessLogValve 中定义的模式中的这些信息。这是当前模式的片段:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="/var/cps"
prefix="access_log"
suffix=".txt"
locale="en_US"
rotatable="false"
maxLogMessageBufferSize="512"
pattern="%{X-Forwarded-For}i %a %{begin:yyyy-MM-dd-HH:mm:ss.SSSZ}t %{end:yyyy-MM-dd-HH:mm:ss.SSSZ}t "%r" %s %b" />
有没有办法从后端应用程序收到的 HTTP 请求中访问此密码信息?我在想是否有一种方法可以使用自定义过滤器将其作为属性放入 HttpServetRequest 并添加 %{xxx}r 模式代码以将其注销。当然,我也愿意接受更好的解决方案。
谢谢!
解决方案
通过将 ssl_fc_cipher 设置为haproxy.cfg中的自定义 HTTP 标头,我能够在 Tomcat 的访问日志中获取 SSL 密码:
frontend web_applications
mode http
option httplog
option forwardfor
capture request header Referer len 2000
capture request header User-Agent len 250
capture request header Host len 100
capture request header X-Forwarded-For len 50
reqadd X-Forwarded-Proto:\ https
default_backend web_applications
bind *:443 ssl crt /etc/haproxy/certs/cert.pem ciphers AES256
http-request set-header X-SSL-Cipher %[ssl_fc_cipher]
backend web_applications
mode http
balance roundrobin
server web_applications webappserver.net:80 check
在 AccessLog Valve 中捕获 X-SSL-Cipher 自定义标头:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="/var/cps"
prefix="access_log"
suffix=".txt"
locale="en_US"
rotatable="false"
maxLogMessageBufferSize="512"
pattern="%{X-Forwarded-For}i %a %{begin:yyyy-MM-dd-HH:mm:ss.SSSZ}t %{end:yyyy-MM-dd-HH:mm:ss.SSSZ}t "%r" %s %b %X-SSL-Cipher}i" />
推荐阅读
- java - 如何停止/不需要 JS 覆盖我的“脚本”——有可能吗?
- python - 如何根据条件在多索引数据框中添加缺失的日期行
- javascript - 当 Promise 的解析依赖于 setTimeout 时,JS 事件循环如何表现?
- javascript - express-typescript 项目的文件夹结构
- javascript - 在 jQuery 中设置时间后自动显示和 Div
- c# - 如何仅打开 .dat 文件。在 C# 中
- javascript - 使用 DynamoDB 扫描重复项
- python - Django Apache 错误:没有名为“编码”的模块。Windows 服务器 2008 R2 标准
- javascript - 在没有jquery的javascript中逐字母淡入
- c# - System.Data.SqlClient.SqlException:EF 中的对象名称无效-但在表属性中设置了正确的名称