建立 WAF 規則(WAF Rules)

延續 4. 建立域名(Domain),這篇文章將會說明如何配置 WAF(Web Application Firewall) 規則。你可以把 WAF 想像成用戶訪問網站前必須符合的條文或規範,符合規則的人可以訪問你的網站,不符合的人則要呈現錯誤頁面或拒絕存取的資訊……等等。

目前範例網頁 http://nindomain.ninja.tw 的畫面如下:

範例網頁 / 設置 WAF 前的畫面

如果我想要拒絕所有用戶存取範例網頁 https://nindomain.ninja.tw ,我可以在平台上配置一條 WAF 規則。這篇文章將會完成下圖第 6 點,在 EDGE 上新增名為deny_all 的 WAF 規則。

範例網頁 / 建立 WAF 規則

進入域名管理 / WAF 規則的頁面,並按下左上角的「創建」。

域名管理 / WAF 規則

以示範新增 WAF 規則 deny_all 來說:

  1. 找到「規則名稱」的欄位,填寫 deny_all。
  2. 接著找到「動作」的欄位,選擇「Deny」。
  3. 按下儲存。
WAF 規則 / 建立WAF 規則的步驟

完成後,就會看到剛剛創建的 WAF 規則 deny_all 顯示出來了。

WAF 規則 / 成功創建一條 WAF規則 deny_all

接下來,切換到域名管理 / 域名物件 / 域名配置的頁面,找到操作的欄位,按下修改 nindomain.ninja.tw。

域名配置 / 修改 nindomain.ninja.tw

往下滑動修改的表單,找到「WAF 規則」的欄位,選擇剛剛建立的 deny_all,把該條 WAF 規則從「可用規則」移動到「應用規則」,並按下儲存。

域名配置 / 套用 WAF 規則的步驟

再度瀏覽範例網頁 https://nindomain.ninja.tw,出現錯誤頁面,說明如下:

  1. 錯誤:01 - 01 - 000 是平台的請求日誌狀態碼,代表「平台主動斷開 - 命中 WAF 規則裡的 deny 動作 - Lua API」。
  2. 錯誤碼:代表這一次請求的事件 ID。
  3. 時間軸:請求當下的日期與時間。
  4. 識別:請求者的 IP。
  5. 狀態:HTTP 狀態碼,此處的 403 表示伺服器有成功解析請求,但用戶沒有權限可以訪問。
範例網頁 / 設置 WAF 後的畫面

另外,有了上面提到的錯誤碼 82399288746156f9558040f57dce2728,你還可以切換到事件查詢 / 事件查詢 / 原始數據的頁面,並將錯誤碼貼到中間的「 Search 事件 ID」,就可以看到該次請求被 WAF 規則擋下的紀錄囉!

事件查詢 / 查詢事件 82399288746156f9558040f57dce2728
💡
1. 如果你想要把 WAF 規則套用到域名管理 / 域名物件 / 應用配置的頁面,可以參考建立應用配置(App Profile),修改專案的域名參數喔!
2. WAF 規則可以應用的場景與情況非常多元,可以參考 INODENINJA WAF 物件說明,了解更多 WAF 參數的用途。
3. 有關平台的請求日誌狀態碼,可以延伸閱讀 iNODE NINJA 請求日誌狀態碼
4. 如果你想套用自己撰寫的錯誤頁面,可參考建立 HTML 頁面(HTML Pages)

延伸應用

除了在 EDGE 阻擋用戶訪問域名,也可以在 SLB 攔截特定用戶的請求嗎?

回到域名管理 / WAF 規則頁面,找到操作的欄位,按下修改 deny_all。

WAF 規則 / 修改 deny_all

以示範修改 WAF 規則 deny_all 來說:

  1. 找到「觸發 Period 阻擋」的欄位,開啟開關。
  2. 接著找到「使用 L3 阻擋」的欄位,開啟開關。
  3. 按下儲存。
WAF 規則 / 修改 WAF 規則 deny_all 的步驟

完成上述設定後,請求會如下圖所示:第一次會先經由 EDGE 阻擋(L7 阻擋),倘若用戶在阻擋時間內(平台預設是 300 秒,即上圖的「阻擋時間」欄位)再度訪問該域名,就會直接由 SLB 攔截(L3 阻擋)。

建立 WAF 規則 / L3 阻擋

當請求是直接由 SLB 攔截,瀏覽範例網頁 https://nindomain.ninja.tw 時,出現錯誤頁面會與由 EDGE 阻擋的錯誤頁面不同。

範例網頁 / 修改 WAF 後的畫面
💡
上文提到的 L3 和 L7,是 OSI 模型(Open Systems Interconnection Model)的七個分層。封包及 IP 主要是由 Layer 3 處理,而 Layer 7 則負責處理應用程式。