Apache 2 无需通过 IPS 进行身份验证

Apache 2 无需通过 IPS 进行身份验证

我有一个在 varnish 后面部署了 apache 2.2.22 服务器。

我想要实现的是使用 htpasswd 密码保护一个目录,但让来自 ips 的某些用户无需身份验证就可以访问该目录。

AuthType Basic
AuthName "test"
AuthUserFile /www/.htpasswd
Require valid-user
order deny,allow 
deny from all 

SetEnvIF X-Forwarded-For "1.2.3.4" AllowIP
Allow from env=AllowIP 
Satisfy any 

我现在做的是这个,这是一个变通方法,但很有效。如果 X-Forwarded-For IP(客户端)是 1.2.3.4,那么让他无需身份验证即可观看页面。

这个问题是不安全的,客户端只需设置 X-Forwareded-For 标头并绕过身份验证。

我已经尝试过 Apache RPAF 模块:

<IfModule rpaf_module>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 varniship
</IfModule>

从理论上讲,这应该会限制来自代理的 X-Forwarded-For 请求,我甚至不确定在这种情况下是否需要这个模块,因为代理将始终将 X-Forwarded-For 客户端 IP 放在其后面。因此请求将如下所示:

X-Forwarded-For: <varniship>, clientip

客户端可以再次操作客户端 IP。有没有更好的方法来实现这一点?

答案1

    <Directory "/var/www/html/docroot">
    AuthName "Restricted Access"
    AuthType Basic
    AuthUserFile /usr/local/.htpasswd
    Order allow,deny
    Allow from x.x.x.x
    Require  valid-user
    Options Indexes FollowSymLinks
    satisfy any
    </Directory>

虽然我使用的是 2.4.10 版本并且没有旧版本可以测试,但是这对我来说非常有效。

答案2

或者你也可以在 Varnish vcl 端执行此操作:

    sub vcl_recv {
        # whitelist ip 10.10.10.10
        if (req.http.X-Forwarded-For ~ "^10\.10\.10\.10") {
           # where dXNlcjpwYXNzd29yZA== is user:password in base64
           set req.http.Authorization = "Basic dXNlcjpwYXNzd29yZA==";
        }
    }

可以通过来自请求标头的其他检查进行扩展。

相关内容