我们的内联网使用 mod_ldap 向我们的内部 Active Directory 服务器验证用户身份,如下所示:
<Location /***/>
AuthType Basic
AuthName "***"
AuthBasicProvider ldap
AuthLDAPUrl "***"
require valid-user
</Location>
我们希望允许用户通过互联网访问我们的网站,但不幸的是基本的身份验证纯文本,这会在网络上暴露我们的 AD 凭证。
我意识到我可以使用 ssl 保护整个网站,但我真正关心的是凭证本身。
在不对整个网站使用 https:// 的情况下保护我的 AD 凭据的最佳方法是什么?
注意:我尝试用“Digest”代替“Basic”,但是没有效果。
答案1
您将永远无法使用 LDAP 摘要式身份验证,因为摘要式身份验证会(通过 MD5)模糊密码,因此无法将其与 ldap 密码进行比较。
您可以使用 cookies 而不是基本身份验证来解决此问题。例如,请参阅 pubcookiehttp://www.pubcookie.org/或 Apache2::AuthCookiehttp://search.cpan.org/~mschout/Apache-AuthCookie-3.15/lib/Apache2/AuthCookie.pm
但实际上,到处使用 SSL 有什么问题呢?消除安全性就是在浪费精力。
答案2
我在这里回复https://stackoverflow.com/questions/6458398/apache-2-2-redirect-to-ssl-then-do-auth-with-solution-but-is-it-crap/7822709#7822709,一个使用的解决方案SSLRequireSSL
,以及ErrorDocument 403
返回一个包含 JavaScript 的 html 403 错误页面,该页面会将页面重新加载到 HTTPS ...我发现最好的解决方案是无需将配置文件分成两个,一个通过VirtualHost
端口 HTTP 加载,另一个通过端口 HTTPS 加载。
答案3
答案是,你不能。一旦用户使用基本身份验证进行身份验证,他或她的浏览器将在每次后续请求中发送一个授权标头,其中包含他或她的密码(仅 Base64 编码)。因此,保护密码的唯一方法是在整个网站上强制使用 HTTPS,至少在他们进行身份验证之后。
答案4
使用重写规则将所有经过身份验证的页面定向到 https:。这将在身份验证请求发生之前发生。还要求所有经过身份验证的页面都使用 SSL。
编辑:您可以使用重写规则强制将 http: 请求转换为 https: 请求。所有与您正在匹配的模式匹配的请求都会发生这种情况。这通常会在需要身份验证的页面发生之前发生。这可以在位置或目录定义内。除非使用 https 访问,否则网站的其余部分将位于 http 上。重写条件非常灵活,因为匹配的内容以及重写的内容。
# 强制互联网上的客户端使用 HTTPS RewriteEngine 开启 重写条件 %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+$ RewriteCond %{HTTPS} !=on 重写规则 .* - [F]
在安全方面,您需要 SSL。与密码验证一样,这会在访问页面之前发生。请确保在您的安全规则中使用满足所有条件。添加
SSLRequireSSL
到经过验证的区域的条件中。
更多详细信息请参阅Apache SSL 操作指南。