以编程方式检测apache反向代理

时间:2014-09-17 10:45:12

标签: apache security proxy reverse-proxy

我想代理一个网站 - 让我们称之为“APP” - 通过Apache 2.4使用两个不同的反向代理和不同的主机名(虚拟主机)。让我们称这些代理为“Alfa”和“Beta”。我希望阿尔法成为“公共代理人”,它将显示该网站的正常版本。 Beta代理将限制对某些客户端IP的公共访问,但在这里我想在网站的每个页面上显示某种类型的敏感信息。让我们将敏感信息的那些部分称为“SENS”。

这是我当前的apache配置。

Listen 443
NameVirtualHost *:443
SSLStrictSNIVHostCheck off

## Virtual host for the Alfa Proxy
<VirtualHost *:443>

    ServerName alfa.mysite.org
    RewriteEngine On

    <Location /app/>    
        ProxyPass http://x.x.x.x:8080/app/
        ProxyPassReverse http://x.x.x.x:8080/app/
    </Location>

    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile conf/alfa.crt
    SSLCertificateKeyFile conf/alfa.key
</VirtualHost>

## Virtual host for the Beta Proxy
<VirtualHost *:443>

    ServerName beta.mysite.org
    RewriteEngine On

    <Location /app/>
        Require ip 192.168.0
        ProxyPass http://x.x.x.x:8080/app/
        ProxyPassReverse http://x.x.x.x:8080/app/
    </Location>

    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile conf/beta.crt
    SSLCertificateKeyFile conf/beta.key
</VirtualHost>

为了仅向Beta用户显示SENS,我需要以编程方式检测哪些代理请求来自。现在,我已经研究了反向代理请求标头的使用,例如“X-Forwarded-Server”。假设我在APP中定义了某种安全过滤器(例如Spring Filter),只有当X-Forwarded-Server等于“beta.mysite.org”时才允许在页面上呈现SENS。这应该可以正常工作。

但我的问题是:我可以确定不会发生某种篡改代理标题,这会让alfa.mysite.org的用户真正查看我网站的SENS部分吗?

如果是这样,有没有其他方法可以做到这种“安全的方式”。 有两个不同版本的APP或在两个不同的容器上部署APP是我想避免的。

感谢任何意见或建议。

1 个答案:

答案 0 :(得分:0)

根据Apache文档,当使用多个代理时,x-forwarded-server头可以是逗号分隔列表。因此,从安全角度来看,我不认为这是安全的。

假设您的后端服务器无法直接访问,您可以尝试以下操作。 设置您自己的HTTP标头,其值根据它传递的VirtualHost而变化。 您只需要检查后端是否存在标题。

ServerName alfa.mysite.org
RewriteEngine On

<Location /app/>    
 #Set - The request header is set, replacing any previous header with this name
 RequestHeader set MyCustomHeader "remote"

</Location>

ServerName beta.mysite.org
RewriteEngine On

<Location /app/>
    Require ip 192.168.0
    #The request header is set, replacing any previous header with this name
    RequestHeader set MyCustomHeader "local"
    ..
</Location>