IIS 網站突然狂丟403錯誤!原來是安全性設定在搞鬼

前言

某一天,系統突然開始出現詭異的現象:使用者報告網站時好時壞,重新整理一次可能好,但下一秒又壞了。查看錯誤日誌發現大量的 403 Forbidden 錯誤,但最讓人困惑的是 ,同一個檔案,有時候能載入,有時候卻被封鎖。這到底是怎麼回事?
然後就開始尋找問題可能的原因

1. 檔案/資料夾權限設定問題:

  1. 確認網站資料夾的 NTFS 權限是否正確
  2. IIS_IUSRS 和 IUSR 使用者需要有讀取權限
  3. Application Pool 身份對網站目錄需要有讀取權限

2. IIS 設定檢查:

  1. 在 IIS 管理員中確認網站的身份驗證設定
  2. 檢查是否啟用了正確的驗證方式(如匿名驗證)
  3. 確認網站綁定設定是否正確

結果確認之後都無法解決。

問題的關鍵:動態 IP 限制設定

上面的問題可能原因都檢查之後還是沒發現問題,只能在網站上重新整理了幾次,然後去看IIS的LOG,只能看到有很多403錯誤,但不知道原因,不過發現,原本403的檔案忽然正常了,反而其他的檔案變成403,又重整了幾次,發現每次被影響的都有不同,於是,到這裡大概就知道原因了,這個問題的源頭是 IIS 的「動態 IP 限制」功能。這個原本用來防止DDOS的安全機制,結果反而擋了一般人使用。

讓我用一張圖來說明這個機制是如何運作的:

使用者請求 動態 IP 限制 網站資源 403 Forbidden

為什麼會發生這個問題?

現代網站通常需要載入大量的 JavaScript 檔案和其他資源。當使用者訪問網站時,瀏覽器會在短時間內發出多個請求來載入這些資源。如果動態 IP 限制設定太嚴格,這些正常的請求就可能被誤認為是攻擊行為。

解決方案

1. 調整動態 IP 限制設定



這是我原先的設定,可是這樣設定有可能擋到一般人使用,所以基於安全性和可用性的平衡,我修改為以下設定:

  1. 「同時要求的動態 IP 位址」:50
    原因:考慮到現代網站首次載入通常需要20-30個並發請求
    設50可以給予足夠緩衝,避免誤判正常使用行為

  2. 「要求的最大數目」:100
    原因:一般使用者很少在短時間內產生大量請求
    設100允許正常的頁面切換和操作

  3. 「時間週期」:5秒(5000毫秒)
    原因:這個時間週期較短,可以更快偵測到異常行為
    DDOS通常會在短時間內發送大量請求

2. 設定 IP 白名單

  • 開啟 IIS 管理器

  • 在左側選擇您的網站

  • 找到「IP 位址和網域限制」功能並雙擊

  • 在右側「動作」面板點選「新增允許項目」

  • 輸入要允許的 IP 或 IP 範圍:

  • 單一 IP:直接輸入 IP(如:192.168.0.1)

  • IP 範圍:輸入網段和遮罩(如:192.168.0.0,遮罩:255.255.255.0)

3. 實作差異化的安全策略

為不同類型的請求設定不同的安全規則:

  • 靜態資源:較寬鬆的限制
  • API 呼叫:中等程度的限制
  • 敏感操作:嚴格的限制

最佳實踐建議

1. 資源優化

  • 合併 JavaScript 檔案
  • 啟用瀏覽器快取
  • 使用 CDN 分流

2. 監控機制

  • 定期檢查 IIS 日誌
  • 設置異常警報
  • 建立緊急應變流程

3. 安全性平衡

  • 根據實際需求調整限制
  • 定期檢討安全策略
  • 保持系統更新

結論

這次的經驗告訴我們,系統安全性設定雖然重要,但過度限制反而可能影響正常運作。找到安全性和可用性之間的平衡點是關鍵。透過適當的配置和監控,我們可以在保護系統的同時,確保使用者有良好的體驗。

參考資源

  1. Configure Dynamic IP Security in IIS
  2. IIS Security Best Practices
  3. Web Application Security Guidelines