【问题标题】:Detect apache reverse proxy programmatically以编程方式检测 apache 反向代理
【发布时间】:2014-09-17 10:45:11
【问题描述】:

我想通过 Apache 2.4 使用两个具有不同主机名(虚拟主机)的不同反向代理来代理一个网站——我们称之为“APP”。我们将这些代理称为“Alfa”和“Beta”。我希望 Alfa 成为“公共代理”,它将显示网站的正常版本。 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 是我想要避免的。

感谢任何 cmets 或建议。

【问题讨论】:

    标签: apache security proxy reverse-proxy


    【解决方案1】:

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

    【讨论】:

    • 我已经尝试了您的建议,这似乎是一个可行的选择。非常感谢!我什至尝试使用浏览器插件 Modify Headers (Chrome/Firefox) 自己“篡改”自定义标头,并且根据您的 cmets 状态,任何以前的同名标头都将被覆盖。
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多