Python 跑 Flask 的實驗性質小網站丟到 Internet 上跑,由於 Debug 模式會即時顯示每筆 HTTP 存取,我活生生看到一堆噁心的存取記錄:

喵的,這個沒公開的網站,上線沒幾分鐘馬上招來一堆惡意機器人上門,四處翻找想看你是不是有犯什麼低級錯誤,有沒有檔案可以偷回家,有沒有漏洞可以鑽。

老司機都知道,網路上無時無刻有成堆的惡意機器人在巡邏,一旦發現有活著的 IP,便會每個 Port 試試會不會通,若發現是網站還會掃瞄整理網站結構,再用經典漏洞 Pattern 試一輪撿漏。要是剛好你犯了低級錯誤,對方便可能不費吹灰之力拿到你的帳號密碼 API Key、裝滿個資信用卡號的偵錯 Log,或是下載程式碼回家研究怎麼入侵。

【延伸閱讀】

這點我很早前就體會過,但第一次現場目擊有人臉貼在你家窗戶東看西看,雖然沒什麼損失,就一句話,噁心!

於是我想研究有沒有方法讓 Nginx 在第一時間將這些煩人的存取擋掉,完全不需要導到網站來。我找到一個好方法。

在 Nginx 的 .conf 加入以下設定,可以至少擋掉對 .log/.ini/.sh/.conf/.env 的存取嘗試:

回應方式有兩種 deny all;return 444; 選擇。

使用 deny all; 時,呼叫端會得到 Nginx 給的 HTTP 403 回應:

但我更愛 return 444;,Nginx 會直接切斷連線,連傳回 HTTP 回應的頻寬都省下來,Nice!

不過,使用這招要確認你的網站沒用到上述附檔名結尾的網址(正常情況下不應該有),而實務上也可以觀察惡意程式都愛嘗試哪些路徑自行增減阻擋項目。

若要更專業阻擋非法存取,可以考慮Secure Link Module、建置 WAF (Web Application Firewall,Nginx 有免費的 WAF ModSecurity 是不錯的選擇),但這些都有額外的建置、管理甚至採購成本,修改 conf 只是舉手之勞卻簡單有效,我找不到不試的理由,哈。

但是但是,必須強調上面說的這些額外保護手法全部都只是治標,別把任何不該對外的東西放上網站才是根本之道,再把限定身分及來源 IP 存取的資源確實鎖好,才能徹底防範有人亂看偷資料。

This blog post share methods to block malicious bots using Nginx configurations, specifically with deny all; and return 444; directives, to prevent access to sensitive files.


Comments

# by pupuliao

我是使用fail2ban 直接在防火牆環節就阻擋

# by GarryLai

二手的Fortigate 50E License未過期甚至帶AP功能只要不到1000元,過期也只是不能更新不會關閉功能,買一台來當家用路由器CP值很高。 開了IPS和WAF看記錄才發現這世界的可怕,每天大概都有幾十筆在踹各種CVE漏洞

Post a comment