【问题标题】:Yet another Apache Reverse Proxy and mod_rewrite challenge另一个 Apache 反向代理和 mod_rewrite 挑战
【发布时间】:2013-10-15 10:11:00
【问题描述】:

我在防火墙后面有一个 Web UI,它采用“简单”身份验证(Hadoop JobTracker UI)。这意味着 URL 包含用户名作为参数,并且 Web 服务器相信浏览器就是它所说的那个人。它侦听非标准端口 (50030) 并且没有任何“应用程序”标识符(因此 URI 部分实际上是随机的)。 因此,我的目标 URL 可能类似于:https://actual_web_server:50030/jobqueue_details.jsp?queueName=default&User.Name=foo

把事情复杂化:

  • 我想使用 Apache 作为反向代理,以减少防火墙中的漏洞数量。
  • 我希望 Apache 对用户进行身份验证(即针对 LDAP)。
  • 我想为我们的最终用户提供一个很好的 URL,以区分我拥有的几个不同的 Hadoop 集群。
  • 我必须使用加密。

因此,我希望上述 URL 在浏览器上显示为: https://JobTracker.Cluster1.MySite.com/jobqueue_details.jsp?queueName=default

我希望我可以将 Apache 配置为:

1) 使用 mod_authnz_ldap 对 LDAP 的传入连接进行身份验证 (as per here.) 这看起来比较简单,有很多例子,我想我可以处理这个!

2) 在 Apache 上使用 DNS 条目 (JobTracker.Cluster1.MySite.com) 和虚拟主机条目来启用更漂亮的 URL。同样,这不是真正的挑战,而是使配置复杂化。

3) 使用 mod_rewrite 来:

3a) 如果用户提供了“User.Name=foo”参数,则删除它,因为我们无法信任他们提供的值。

3b) 将参数“User.Name={Authenticated LDAP Username}”添加到 URL。

3c) 将漂亮的主机名和端口 (JobTracker.Cluster1.MySite.com) 替换为目标主机名和端口 (actual_web_server:50030)

3d) 使用这个新 URL 将请求代理到目标 Web 服务器

3e) 浏览器中显示的 URL(以及页面上的任何链接)也被修改为使用正确的“漂亮”主机名。

3f) 理想情况下,浏览器中显示的 URL 未显示“User.Name=foo”参数。演的话不算大戏,但我宁愿不演。

注意我不能简单地重定向,因为我不能从浏览器直接连接到“actual_web_server”。此外,这一 Apache 安装将提供与这一配置相同的多个 Web UI(每个自定义 DNS 条目)。

希望有人“去过那里,做过那个”足以知道如何,或者即使,这是可能的.....

【问题讨论】:

    标签: apache mod-rewrite configuration reverse-proxy mod-proxy


    【解决方案1】:

    在我的 httpd.conf 中,我有一个包含以下内容的位置块。 请注意,我使用的是伙伴的 apache 服务器,因此我有一个位置,而不是虚拟服务器。我选择了两个不同的块,而不是一个非常复杂的块,仅仅是因为清晰、工作和优雅比更少的过于复杂的不可读的代码行 (恕我直言)。

    <Location /ldap>
        Order Allow,Deny
        Allow from all
        Options FollowSymLinks
    
        #
        #       Authenticate the user
        #
    
        AuthName "LDAP"
        AuthType Basic
        AuthBasicProvider ldap
        AuthLDAPURL "ldap://my_active_directory_box:389/ou=Human,ou=Users,dc=my_company?sAMAccountName?sub?(objectClass=*)"
        AuthLDAPBindDN cn=my_service_account,ou=Non-Human,ou=Admin,dc=my_company
        AuthLDAPBindPassword very_secure_password
        AuthUserFile /dev/null
        Require valid-user
    
        #
        #       ENSURE user.name is set by us, using mod_rewrite
        #
        RewriteEngine on
        RewriteBase /ldap
    
        # PREVENT USER SUPPLYING THE USER NAME PARAMETER
        RewriteCond %{QUERY_STRING} ^(.*)user.name=.*$ [nocase]
        RewriteRule ^(.*)$ - [F]
    
        # If the URL has a Query String, then append our login with &
        RewriteCond %{QUERY_STRING} ^.+$ [nocase]
        RewriteRule ^(.*)$ $1%1&user.name=%{REMOTE_USER}
    
        # If the URL does NOT have a Query String, then append our login with a ?
        RewriteCond %{QUERY_STRING} ^$ [nocase]
        RewriteRule ^(.*)$ $1?user.name=%{REMOTE_USER}
    
        #
        #       Now Proxy the request through
        #
    
        ProxyPass http://s011qpol2342.s2.chp.cba:8080/docs
        ProxyPassReverse http://s011qpol2342.s2.chp.cba:8080/docs
    </Location>
    

    回答我自己的问题会获得奖励吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 2015-08-19
      相关资源
      最近更新 更多