使用 Apache 在 Varnish 記憶體後面保護對某些頁面/目錄的訪問?
我有一個公共網站,其中包含一些僅供私人/內部使用的 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 本身上,它不需要每次我想要更改 Varnish 的 VCL 文件添加或修改限制?
您絕對可以通過編寫以下 VCL 在 Varnish 中做到這一點:
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 語句中添加每個使用者。
確保繞過預設的 VCL 行為
Authorization
在 Varnish 中處理標頭時,重要的是不要依賴預設行為。預設情況下,當Authorization
標頭存在時,Varnish 不會在記憶體中查找項目。因此,在您的邏輯中的某個時刻,您必須執行
return (hash);
我在範例中執行的操作。否則,您將使用預設行為,並且不會在記憶體中查找項目。Vmod_basicauth 作為替代
如果事實證明這是一個交易破壞者,您可以編譯以下 Varnish 模組,該模組允許您載入
.htpasswd
文件並為您執行身份驗證。仍然在 Apache 中做這一切
如果您決定繼續在 Apache 中執行此操作,則還需要更改 VCL。
Authorization
我解釋說,當標題存在時,預設行為將阻止 Varnish 在記憶體中查找項目。如果您再次查看預設行為,則必須確保
return (hash);
在遇到預設行為之前執行 a ,或者您必須通過添加必要的if 語句來自己重新實現其中的一部分