在 apache 上使用 ldap auth 调试超时

在 apache 上使用 ldap auth 调试超时

几个月来,我一直在尝试调试 Apache 的超时问题。

该模式如下所示:

每次新会话的第一次请求时(或上次请求后的一段时间),浏览器都会立即要求输入凭证,然后发送带有基本身份验证的请求。然后服务器会等待整整 1 分钟,然后再发送结果。

在此处输入图片描述

后续请求会立即得到答复,但这只会发生在一段时间后的请求中(目前无法准确确定,在 5 到 15 分钟之间)。

等待时间可重复精确到 60 秒,这对我来说就像是超时了。如果我取消请求并点击重新加载,我会立即获得请求的 URL。

由于密码提示也会立即出现,因此我可以排除客户端和服务器之间的 SSL 握手问题或该段上的 DNS 问题。无论我请求的是 PHP 脚本还是空白文本文件,这都无关紧要,这也排除了服务器上的脚本问题。我猜身份验证过程的结果会被缓存一段时间,因此后续请求不需要缓存。

请注意,身份验证始终会成功,因此我也可以排除“域控制器没有应答”的问题。

Apache 2.4 在 Windows Server 2012 R2 上运行。它配置为 LDAP 身份验证:

<Location />
    AuthType Basic
    AuthName "AD Login"
    AuthBasicProvider ldap
    LDAPReferrals Off
    #AuthLDAPUrl ldap://dc01.domain.de:3268/dc=ad,dc=domain,dc=de?sAMAccountName?sub?(objectClass=*)
    #AuthLDAPUrl ldap://ad.domain.de:389/dc=ad,dc=domain,dc=de?sAMAccountName?sub?(objectClass=*) STARTTLS
    AuthLDAPUrl ldap://ad.domain.de:389/dc=ad,dc=domain,dc=de?sAMAccountName?sub?(objectClass=*) TLS
    AuthLDAPBindDN "[email protected]"
    AuthLDAPBindPassword "secret"
    Require valid-user
    Require all denied
</Location>

正如您所看到的,我尝试了与域控制器的不同类型的连接,但使用哪种加密方法或是否传递加密似乎并不重要。

ad.domain.de 解析为多个域控制器,但如果我连接到特定的 DC,行为是相同的。

错误日志中没有条目LogLevel info,我仍然犹豫是否将其增加到debug,因为我从经验中知道我很难筛选生成的调试信息。

我是否遗漏了什么可以用来调试问题的内容,或者我是否必须进行调试级别的日志记录?

答案1

增加模块的日志级别后authnz_ldapldap错误日志中出现以下错误消息:

ldap_simple_bind() 在重用连接时超时,被防火墙丢弃?

这让我此 mod_ldap 错误报告,虽然结果证明是配置错误,但它向​​我指出了实际问题:

据其他地方报道,Windows 会在 900 秒后关闭 LDAP 连接,但默认的 Apache 行为似乎是尝试无限期地重新使用该连接。如果 Apache 在 Windows 关闭连接后尝试重新使用,则需要等待 60 秒才能等待连接超时 [...]

做一些快速检查来确认这一点:

默认值MaxConnIdleTime在 Microsoft LDAP 策略中是 900 秒,这与我的观察结果相符,即问题在 15 分钟后再次出现。60 秒的延迟也与我的问题完全吻合。

根据该错误报告,该问题应通过设置来解决LDAPConnectionPoolTTL设置为低于默认值 -1 的值MaxConnIdleTime,但这对我来说不起作用。我必须将值设置为0,以禁用现有连接的重用。

LDAPConnectionPoolTTL 0

我预计这不会出现任何性能问题,因为 ldap 结果无论如何都会被缓存。

唯一仍是个谜的是,为什么这个问题只发生在我们在 Windows 上运行的 Apache 实例上,而不会发生在在 Linux 上运行的 Apache 实例上。

相关内容