如何将proxypass与身份验证一起使用?

时间:2015-02-18 21:42:41

标签: apache authentication proxypass

我正在使用Drupal 7在Archlinux上运行Apache 2.4。我正在使用PKI_authentication模块对drupal进行智能卡身份验证。  注意:这只是我在家中使用的测试设置,试图弄清楚如何使这项工作。除了在Windows 2008 R2上运行外,生产设置基本相同。

我还将Apache设置作为使用proxypass的两个内部服务器的反向代理。我试图限制只有授权用户访问内部服务器。最初我尝试使用“SSLVerifyClient require”,它不限制对授权用户的访问,但至少要求他们使用公认的智能卡。

问题是两个内部服务器在它们之间来回引用浏览器,甚至打开内部其他服务器的帧。每次浏览器重定向到另一台服务器时,用户都必须重新进行身份验证。

由于drupal使用会话cookie并将此cookie的值存储在sql数据库中,但我可以使用mod_session_dbd来验证用户是否已经过身份验证。但是mod_session_dbd上的文档非常无用。

在继续之前,如果有人可以提出更好的方法来实现上述目标,我将非常感激。我宁愿这样做而不必安装任何新软件,因为批准过程相当漫长。

Apache的mod_session_dbd文档(除了混合数据库名称和会话名称)在“DBD配置”块中给出了一个示例:

DBDPrepareSQL“更新会话设置值=%s,到期=%lld,密钥=%s其中key =%s”updatesession

但它没有描述这些变量是什么。基于名称,它们看起来像是指'key','value',&来自cookie的'到期'。但这没有任何意义,因为访问该网站的每个人都将拥有一个完全相同的“密钥”(cookie的名称)的cookie,因此我无法仅使用cookie名称更新特定会话,除非这是预期的将每个打开的会话更新为与当前用户相同的“值”等?

我正在使用基本库存Drupal设置,但有以下更改(不起作用):

在httpd.conf中:


 LoadModule session_module modules/mod_session.so 
 LoadModule session_cookie_module modules/mod_session_cookie.so 
 LoadModule dbd_module modules/mod_dbd.so 
 LoadModule session_dbd_module modules/mod_session_dbd.so 

 DBDriver sqlite3 
 DBDParams "/srv/www/drupalDB/drupal.db" 

 DBDPrepareSQL "select uid from sessions where ssid = %s" selectsession 
 #uis is the userid of current user and ssid is the value in the cookie. 
 #Not sure what selectsession is expected to return. 
 #also tried DBDPrepareSQL "select ssid from sessions where ssid = %s" selectsession, but that didn't work either 
 #Not using deletesession, insertsession, etc at this time since I don't want to mess up the database 

在httpd-ssl.conf中:

 <Location /site1> 
 # SSLRequireSSL 
 AuthType Basic 
 AuthName "Internal" 
 Session On 
 SessionDBDCookieName SSESS0ea0798a41d3d84e7bbc0af79a07cd87 
 SessionDBDPerUser On 
 SessionDBDSelectLabel selectsession 
 Require valid-user 
 ErrorDocument 401 /sites/default/misc/pki_authentication/index.php 

 </Location> 
 ProxyPass /site1 http://192.168.0.3/site1 
 ProxyPassReverse /site1 http://192.168.0.3/site1 

我很感激任何帮助。感谢。

1 个答案:

答案 0 :(得分:0)

我不确定你是否可以在内部服务器上执行此操作 - 这取决于它们是什么 - 但是使用JBOSS和Tomcat,我们设置了粘性,然后在JBOSS / Tomcat配置中,我们给它们一个路线名称。这可以防止平衡器来回交换节点并始终强制重新进行身份验证。

在Apache(httpd.conf)中:

# ***** HA CONFIGURATION FOR JBOSS & TOMCAT WEB APPLICATIONS *** SSL BACKEND

SSLProxyEngine On
SSLProxyVerify On
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off


SSLProxyVerifyDepth 2
SSLProxyCACertificateFile /path/to/server-ca.crt

ProxyRequests Off

ProxyPass / balancer://mycluster/ stickysession=JSESSIONID
ProxyPassReverse / balancer://mycluster/

<Proxy balancer://mycluster>
BalancerMember https://XXX.XX.XXX.XX:XXX1 route=node1 loadfactor=1 ping=10 ttl=600
BalancerMember https://XXX.XX.XXX.XX:XXX2 route=node2 loadfactor=1 ping=10 ttl=600
</Proxy>

ProxyTimeout 300
ProxyStatus On

然后在Tomcat中:(在辅助服务器上它的节点2)

  <Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">

我现在无法访问JBOSS配置,但他们也做了类似的事情。