我一直在研究为什么即使用户和密码正确,mod_authnz_ldap/mod_auth_basic 也会发出身份验证失败的消息。
我意识到,当 URL 结尾没有文件名(即以斜杠 - / 结尾)时,mod_dir 必须遍历 DirectoryIndex 条目,LDAP authnz 模块会尝试对每个条目进行身份验证,直到找到存在的文件。即使凭据有效,它也会为每个丢失的文件发出“凭据无效”的消息。仅当找到第一个有效的索引文件时它才会成功。
问题在于用户可能会提供无效的凭证一次Apache 连续多次验证失败,可能会因为安全策略导致密码被锁定,在我的测试中就出现过这种情况。
系统:Linux SLES 15.5,Apache 2.4.58
网址: https://example.com/this/folder/
我为了测试而包含的带有虚假条目的 httpd.conf 代码片段:
DirectoryIndex fail_here.html index.html index.php home.php
Apache 错误日志的摘录(日志级别 trace2):
[authnz_ldap:info] AH01695: auth_ldap authenticate: user jerry authentication failed; URI /this/folder/fail_here.html [ldap_simple_bind() to check user credentials failed][Invalid credentials]
[auth_basic:error] AH01617: user jerry: authentication failure for "/this/folder/fail_here.html": Password Mismatch
[rewrite:trace1] mod_rewrite.c(493): [perdir /srv/www/htdocs/this/folder/] pass through /srv/www/htdocs/this/folder/index.html
LDAP 模块配置(在 .htaccess 中):
<IfModule mod_authnz_ldap.c>
AuthType Basic
AuthName "My System Authentication"
AuthBasicProvider ldap
AuthLDAPURL ldap://example.com/DC=example,DC=com?sAMAccountName?sub?(objectClass=person)
AuthLDAPBindDN USERFORLDAP
AuthLDAPBindPassword "passwordforldap"
AuthBasicFake %{REMOTE_USER} **************
LDAPReferrals Off
AuthUserFile /dev/null
Require valid-user
</IfModule>
到达index.html后(存在)认证/授权成功。
是否可以配置某些东西来绕过身份验证,直到找到 DirectoryIndex 的现有条目?有没有办法重新排序模块执行以避免此行为?(例如 mod_dir、mod_auth_basic、mod_authnz_ldap)
我尝试加入更深的调试级别,但没有帮助。
更新:
从 .htaccess 中删除该行AuthBasicFake %{REMOTE_USER} **************
会使所有 DirectoryIndex 条目访问被授予,即使文件不存在。出于安全目的,这是一项重要的配置。我想知道这里可能存在错误?