2013-10-08 34 views
1

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

更为复杂的是:

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

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

我希望我可以配置Apache:

1)使用身份验证对LDAP传入连接mod_authnz_ldap (as per here。)这看起来相当直接,有很多例子,我认为我可以处理这一点!

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

3)应用的mod_rewrite到:

3a)中删除“User.Name = foo”的参数,如果用户已提供它,因为我们不能相信他们提供的值。

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

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条目)。

希望有人已经“在那里,这样做”足以知道怎么回事,或者即使,这是可能的.....

回答

1

在我的httpd.conf我有一个定位块具有以下。 请注意,我使用的是队友的apache服务器,因此我有一个位置而不是虚拟服务器。我已经去了两个不同的块,而不是一个非常复杂的块,只是因为清晰度和工作和elegent击败了更少的复杂的不可读代码行(恕我直言)。

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

我能得到的回答我的问题了奖?