我有一个在 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==";
}
}
可以通过来自请求标头的其他检查进行扩展。