Security

使用 Apache 在 Varnish 記憶體後面保護對某些頁面/目錄的訪問?

  • March 26, 2020

我有一個公共網站,其中包含一些僅供私人/內部使用的 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 語句來自己重新實現其中的一部分

引用自:https://serverfault.com/questions/1008448