使用 Apache 和 LDAP 重定向用户

使用 Apache 和 LDAP 重定向用户

在工作中我们遇到一个问题,当用户访问通过 Apache2 管理的 URL 时,我们希望根据用户是否是特定 LDAP 组的成员来重定向用户。

有三种情况:

  • 用户提供有效的凭证并且是 LDAP 组的成员 => 重定向到应用程序 ABC(有效)
  • 用户提供了有效的凭证,但不是 LDAP 组的成员 => 重定向到维护页面(不起作用,这是问题所在)
  • 用户提供无效的凭证或点击取消 => 重定向至维护(有效)

我们的问题是:如果用户有效并且不是 LDAP 组“THE-GROUP”的成员,我们如何重定向用户?

现在,输入凭据的覆盖层会无限期地显示,除非您单击取消或成为“THE-GROUP”的成员。

我们的应用程序 ABC 托管在我们的场所,在 Ubuntu 上运行。我们的反向代理是运行在 Ubuntu 16.04 上的 Apache 2.4.18-2ubuntu3.10。客户将使用来自世界各地的各种浏览器和操作系统,因此按 IP 进行过滤不是一种选择。反向代理位于我们的 DMZ 中,而应用服务器位于外部。创建了 NAT 规则,以便两个系统都可以通过 8080(ABC 正在运行的端口)进行通信。

我们的(测试)配置如下所示:

<VirtualHost *:443>
    ServerName testabc.company.com

    SSLProxyEngine On
    SSLEngine On
    SSLCertificateKeyFile  /etc/ssl/private/our_company.key
    SSLCertificateFile /etc/ssl/certs/company_com/fullchain.cer


    ErrorLog ${APACHE_LOG_DIR}/LDAP_test_error.log
    CustomLog ${APACHE_LOG_DIR}/LDAP_test_access.log combined

    # error document shown to unauthorized users
    DocumentRoot /var/www/Maintenance_Page
    ErrorDocument 401 /TTT/index.html

        <Location />
            ProxyPass http://internal-vm-name:8080/
            ProxyPassReverse http://internal-vm-name:8080/
        </Location>

    # the following block applies to all proxied content
    <Proxy "*">
        AuthType Basic
        AuthBasicProvider ldap
        AuthUserFile /dev/null
        AuthName "Auth with our LDAP Server"

        # configuration of the mod_authnz_ldap module
        AuthLDAPURL "ldap://SOMETHING"
        AuthLDAPBindDN "FOO,BAR "
        AuthLDAPBindPassword "FOOBAR"

        # Only users belonging to group THE-GROUP can access ABC,
        # all others will see the error document specified above.
        Require ldap-group CN=THE-GROUP,OU=Company,DC=ad,DC=Company,DC=com
    </Proxy>
</VirtualHost>

# virtual host required to access images and style-sheets from the error document
<VirtualHost *:80>
    ServerName maintenance.company.com
    DocumentRoot /var/www/Maintenance_Page

    ErrorLog ${APACHE_LOG_DIR}/maintenance -error.log
    CustomLog ${APACHE_LOG_DIR}/maintenance.log combined
</VirtualHost>

# redirection from HTTP to HTTPS
<VirtualHost *:80>
    ServerName abc.company.com
    Redirect Permanent /  https://abc.company.com/
    Redirect /  https://abc.company.com/
</VirtualHost>

答案1

您的问题没有好的解决办法。您正在使用 HTTP Basic Auth,这意味着浏览器正在尝试打开一个页面,并发送了 WWW-Authenticate: Basic realm="Whatever" 标头,从而获取 401 状态。

此时浏览器会显示身份验证对话框,输入用户和密码后,它们就会通过授权标头发送到网络服务器。

如果服务器拒绝请求,它将再次发送带有 WWW-Authenticate 标头的 401 状态。浏览器将无限次再次弹出对话框。服务器绝不会说密码被永久拒绝。

如果您使用的是 mod_dbd 支持的数据库,则可以使用 mod_rewrite 对组执行 SQL 查询并进行相应的重定向。我不认为 LDAP Auth 处理程序可以做到这一点。

相关内容