本篇文章更新時間:2022/05/16
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
現在只要一開站,就有無數的「機器人(爬蟲、Bot)」來光臨,而一個內容網站機器人通常應該要比真人瀏覽來得少,如果這比例失衡,滿有可能「網站正在被攻擊」。
面對這種「可能的」攻擊,就要做出防範,以免問題擴大。
後果:
- 因為太多機器人請求網站,導致網站主機資源不足,停止服務(DDoS攻擊)。
- 網站已經有漏洞被打穿,攻擊者持續利用網站漏洞來幹壞事。
Nginx 防範惡意請求的作法
if ($http_user_agent ~* (....){ return 403; }
其實就是一行,寫在 server
的 block 裡,就可以讓惡意瀏覽的來源被阻擋,而不經過其他資源請求。
惡意名單來源
上面的作法如圖參考:
做法不難,難的是「怎麼知道他是惡意?」以及「有沒有現成的惡意名單可以取得?」
惡意請求如果不討論他送什麼內容給網站執行,那就是「請求的頻率」,因為頻率過高,會造成網站主機的負載過高。
這塊可以搭配 Nginx 的 limit_req_zone
限制請求 與 limit_conn_zone
限制連線數的設定,本篇不多介紹。
回到惡意名單,可以參考這個專案 Nginx Ultimate Bad Bot Blocker 的 這份清單 。
要使用這個名單然後產出如上圖使用在 Nginx 裡的設定,可以使用這個指令:
wget -q -O- "https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list" | uniq | sed -e 's/\\\\ / /g' | sed -e 's/\./\\\./g' | tr '\n' '|'
取得組合好的設定後就可以放到 Nginx 裡使用。
上述就是一個基礎的操作,實際上要注意兩件事:
-
自己的名單
上述提供的名單可以作為一個「你如果還沒有開始」的人使用,實際上建議是自己維護一個清單,然後搭配這份去整合(去除重複)。很多情況下你的網站正在遭受攻擊,而前面那份名單沒有列出來的最新即時名單,你就可以趕快補上,讓主機得到即時保護。
-
如果前方還有使用 Cloudflare CDN 的情境
如果網站有使用 Cloudlfare CDN 的話,這份阻擋的方法會失效,除非去串 Cloudlfare 的 API 完成更進階的整合,不然就是要把這個阻擋的名單實作在 Cloudlfare 的 WAF 中。參考如下圖:
後記
網站架設好只是個開始,後續的維護工作才是真的考驗啊~
本篇是針對有帶入「自我識別」 User-Agent
標頭的 Bot 才有用,如果今天就是故意模擬瀏覽器的通用識別,那這種只能從阻擋 IP 下手了。