我在防火墙后面有一个使用“简单”身份验证(Hadoop JobTracker UI)的Web UI。这意味着URL包含用户的名称作为参数,并且Web服务器信任浏览器是它所声称的人。它侦听非标准端口(50030)并且没有任何“应用程序”标识符(因此URI部分实际上是随机的)。
因此,我的目标网址可能类似于:https://actual_web_server:50030/jobqueue_details.jsp?queueName=default&User.Name=foo
使事情变得复杂:
因此,我希望在浏览器上显示上述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)用目标主机名和端口(actual_web_server:50030)替换漂亮的主机名和端口(JobTracker.Cluster1.MySite.com)
3d)使用此新URL将请求代理到目标Web服务器
3e)浏览器中显示的URL(以及页面上的任何链接)也会被修改为使用正确的“漂亮”主机名。
3f)理想情况下,浏览器中显示的URL未显示“User.Name = foo”参数。如果它被展示,这不是一个大戏,但我宁愿没有。
注意我不能简单地重定向,因为我无法从浏览器直接连接到“actual_web_server”。此外,这一个Apache安装将提供与此配置相同的多个Web UI(每个UI的自定义DNS条目)。
希望有人“在那里,做到了”足以知道如何,甚至是否可能......
答案 0 :(得分:1)
在我的httpd.conf中,我有一个包含以下内容的位置块。 请注意,我正在使用配偶的apache服务器,因此我有一个位置而不是虚拟服务器。我已经选择了两个不同的块而不是一个非常复杂的块,只是因为清晰度和工作以及elegent击败了更复杂的不可读的代码行(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>
我是否因为回答自己的问题而获奖?