如何阻止配置AD认证的Apache Tomcat JNDI Realm跳转至云域控制器
问题背景
使用供应商提供的Apache Tomcat配置,通过JNDI Realm对接本地Active Directory(AD)做用户认证,配置中明确指定connectionURL和alternateURL指向本地域控制器。但在Tomcat 9.0.68 + Eclipse Adoptium 11.0.17+8环境下,认证请求会意外跳转到AWS/Azure的云域控制器,而企业防火墙未开放该流量的进出权限。
WireShark抓包显示应用服务器确实向配置的本地域控制器636端口发起了出站流量,但Panorama防火墙日志却记录流量实际发往云域控制器的636端口,应用日志报错如下:
Aug 03, 2023 2:55:27 PM org.apache.catalina.realm.JNDIRealm authenticate SEVERE: Exception performing authentication javax.naming.PartialResultException [Root exception is javax.naming.CommunicationException: cpr.ca:636 [Root exception is java.net.SocketTimeoutException: connect timed out]]
已尝试排查动作
- 与供应商研发团队协作排查配置逻辑
- 联系域管理员确认AD架构与域控制器配置
- 和网络/防火墙团队核对流量规则
以上均未找到根因,现需:
- 阻止流量跳转到云域控制器的方案
- 更多排查手段(如调试日志、Realm配置参数等)
现有server.xml中JNDI Realm配置片段
<Realm className="com.bmc.bcan.catalina.realm.BNALockOutRealm" failureCount="5" lockOutTime="86400" cacheSize="1000" cacheRemovalWarningTime="3600"> <Realm className="com.bmc.bcan.catalina.realm.BNAJNDIRealm" connectionURL="ldaps://<FQDN1>:636" alternateURL="ldaps://<FQDN2>:636" connectionName="CN=*****,OU=*****,OU=*****,OU=*****,OU=*****,OU=*****,DC=**,DC=**" connectionPassword="<password>" userBase="DC=**,DC=**" userSearch="(sAMAccountName={0})" userSubtree="true" referrals="follow" /> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false"> <Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" /> </Host> </Engine>
排查与解决建议
一、阻止跳转的核心配置调整
关闭LDAP引用跟随
当前配置中referrals="follow"是导致跳转的关键:AD查询时可能返回指向云域控制器的引用,Tomcat会自动跟随。将该参数改为referrals="ignore",强制只使用配置的本地域控制器:referrals="ignore"注意:若AD架构确实需要跨域查询,此调整可能影响正常认证,需结合实际AD结构判断。
硬绑定本地域控制器DNS解析
临时修改应用服务器的hosts文件,将<FQDN1>和<FQDN2>绑定到本地域控制器IP,验证是否还会跳转:# 示例hosts条目 192.168.1.100 <FQDN1> 192.168.1.101 <FQDN2>
二、开启调试日志获取详细信息
开启Tomcat JNDI Realm调试日志
在conf/logging.properties中添加以下配置,获取JNDI连接、查询、引用处理的详细日志:org.apache.catalina.realm.JNDIRealm.level = FINE org.apache.catalina.realm.JNDIRealm.handlers = java.util.logging.ConsoleHandler javax.naming.level = FINE javax.naming.handlers = java.util.logging.ConsoleHandler重启Tomcat后,查看
localhost.log或控制台输出,可追踪LDAP连接的每一步操作,包括是否触发引用跳转及跳转来源。排查BMC自定义Realm日志
由于使用的是com.bmc.bcan.catalina.realm.BNAJNDIRealm(非原生Tomcat JNDIRealm),需查看供应商文档,开启BMC相关组件的调试日志,排查是否存在自定义跳转逻辑。
三、额外排查点
- 直接验证LDAPS连接
用ldp.exe(Windows)或ldapsearch(Linux)从应用服务器测试连接配置的<FQDN1>:636,确认返回的是本地AD数据,无云域引用。 - 检查AD站点配置
联系域管理员,确认本地AD站点是否配置正确,是否存在指向云域控制器的自动站点跳转规则。 - 清空LDAP连接池
若启用了LDAP连接池,可能存在旧连接指向云节点的情况。可添加connectionPool="false"到BNAJNDIRealm配置关闭连接池,或重启Tomcat清空连接池。
内容的提问来源于stack exchange,提问作者Greg M

