繁体   English   中英

另一个Apache反向代理和mod_rewrite挑战

[英]Yet another Apache Reverse Proxy and mod_rewrite challenge

我在采用“简单”身份验证的防火墙后面有一个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 : https://JobTracker.Cluster1.MySite.com/jobqueue_details.jsp?queueName=default

我希望可以将Apache配置为:

1)使用mod_authnz_ldap( 根据此处 。)验证LDAP的传入连接。看起来很简单,有很多示例,我可以处理!

2)使用DNS条目(JobTracker.Cluster1.MySite.com)和Apache上的虚拟主机条目来启用更漂亮的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相同配置的多个Web UI(每个Web UI的自定义DNS条目)。

希望某人“去过那里,做了那件事”足以知道如何,甚至,这是可能的.....

在我的httpd.conf中,我有一个以下位置块。 请注意,我使用的是伴侣的apache服务器,因此我有一个Location而不是一个虚拟服务器。 我选择了两个截然不同的块,而不是一个非常复杂的块,这仅仅是因为清晰度,工作和精巧程度减少了过于复杂的不可读代码行(IMHO)。

<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>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM