У меня есть общедоступный веб-сайт с некоторыми URL-адресами / каталогами, которые предназначены только для частного / внутреннего использования. Доступ к этим частным областям можно получить только через определенные IP-адреса или с известным именем пользователя / паролем.
В настоящее время я достигаю этого с помощью файлов .htaccess, например:
AuthType Basic
AuthName "Protected Area"
AuthUserFile /path/to/.htpasswd
SetEnvIf Remote_Addr 1.2.3.4 trusted
SetEnvIf X-Forwarded-For 1.2.3.4 trusted
# (Note I am aware X-Forwarded-For can be spoofed)
<RequireAny>
Require env trusted
Require valid-user
</RequireAny>
Проблема в том, что я хочу добавить Varnish перед своим сервером, чтобы обеспечить кеширование. Очевидно, что существующая установка не будет работать с Varnish, потому что она не может кэшировать содержимое, ограниченное таким образом файлами .htaccess.
Могу ли я продолжать использовать мои файлы .htaccess для защиты моих внутренних страниц, или есть аналогичный подход, который я могу использовать, чтобы возложить ответственность за безопасность на сам Varnish, который не требует изменения файлов VCL Varnish каждый раз, когда я хочу добавить или изменить ограничения?
Вы определенно можете сделать это в Varnish, написав следующий VCL:
vcl 4.0;
acl allowed {
"1.2.3.4";
}
sub vcl_recv {
if(!client.ip ~ allowed && req.http.Authorization != "YWRtaW46YWRtaW4K") {
return (synth(401, "Restricted"));
}
return (hash);
}
sub vcl_synth {
if (resp.status == 401) {
set resp.http.WWW-Authenticate =
{"Basic realm="Restricted area""};
}
}
Хотя это нормально работает, проверка имени пользователя и пароля выполняется вручную. Если у вас несколько имен пользователей / паролей, вам придется добавить каждого пользователя в оператор if.
При обращении Authorization
заголовки в Varnish, важно не возвращаться к поведению по умолчанию. По умолчанию Varnish не будет искать элементы в кеше, когда Authorization
заголовок присутствует.
Итак, в какой-то момент вашей логики вам придется выполнить return (hash);
, что я и сделал в примере. В противном случае вы вернетесь к поведению по умолчанию, и элементы не будут просматриваться в кеше.
Если это окажется препятствием, вы можете скомпилировать следующий модуль Varnish, который позволяет загружать .htpasswd
файл и выполните аутентификацию за вас.
Если вы решите продолжить делать это в Apache, вам также необходимо изменить VCL. Я объяснил, что поведение по умолчанию не позволит Varnish искать элементы в кеше, когда Authorization
заголовок присутствует.
Если вы снова посмотрите на поведение по умолчанию опять же, вам нужно убедиться, что return (hash);
выполняется до того, как вы нажмете на поведение по умолчанию, или вам придется заново реализовать его часть самостоятельно, добавив необходимые if-утверждения