在 Shibboleth 的审计日志中记录 X-Forwarded-For IP

在 Shibboleth 的审计日志中记录 X-Forwarded-For IP

这是我之前关于捕捉X-Forwarded-For 跨多个代理的 IP 地址。现在,我希望在应用程序(Shibboleth 的 IdP)日志中捕获客户端的 IP。

以下内容:

Client > Load Balancer > Apache httpd server > Tomcat server (running Shibboleth's IdP)

我可以使用server.xmlClientIP在 Web 服务器的日志中捕获负载均衡器上客户端 IP 的变量:LogFormat "%{ClientIP}i ... " and similarly in Tomcat's access logs using these in

<Valve className="org.apache.catalina.valves.RemoteIpValve" 
remoteIpHeader="ClientIP" 
protocolHeaderHttpsValue="https" />

<Valve className="org.apache.catalina.valves.AccessLogValve" 
directory="logs" 
prefix="localhost_access_log." 
suffix=".txt"
pattern="%{ClientIP}i %h %l %u %t %r %>s %b %{Referer}i %{User-Agent}i" resolveHosts="false"/>

现在,我希望在 Shibboleth 的 IdP 审计日志中捕获此 IP。这次讨论讨论了如何使用mod_rpafApache,但没有详细介绍。我希望无需安装其他模块即可完成。

看起来我这里漏掉了几个(小的?)部分。有什么想法吗?非常感谢!

答案1

在研究了 LogBack 的关于记录客户端 IP 的文档MDCInsertingServletFilter servlet 的对应代码,事实证明您必须使用X-Forwarder-For标题。

我们在负载均衡器中用 替换,将 更新ClientIP为日志,然后更新 Shibboleth 的文件,如下所示,以用于审计日志:X-Forwarder-Forhttpd.confLogFormatX-Forwarder-Forlogging.xml

<appender name="IDP_AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <File>/app/shibboleth-idp/logs/idp-audit.log</File>

  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <FileNamePattern>/app/shibboleth-idp/logs/idp-audit-%d{yyyy-MM-dd}.log</FileNamePattern>
  </rollingPolicy>
  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <charset>UTF-8</charset>
  <Pattern>%msg|%X{req.xForwardedFor}|%n</Pattern>
  </encoder>
</appender>

我们对 idp 进程也做了类似的修改,并且没有必须更新 Tomcat 的日志记录

希望这对其他人有帮助。

编辑1:Tomcat 日志

事实证明,过了一段时间,X-Forwarded-ForIP 地址不再出现在 Shib 的 IdP 日志中。我们最终RemoteIpValve在 tomcat 中添加并重新启动。看来它毕竟是必要的:

  <Valve className="org.apache.catalina.valves.RemoteIpValve"
   remoteIpHeader="X-Forwarded-For"
   trustedProxies="--IPs here--"
   protocolHeaderHttpsValue="https" />

相关内容