善用開源工具阻擋網站惡意流量


現今網路世界包含一般網頁/社群媒體/影片等眾多資訊讓人們的注意力非常分散,一個新網站要上線能夠穩定取得流量相當不容易。網站有流量代表有目標的客戶群在瀏覽,但有了流量別高興太早,實際上扣除正常流量及搜尋引擎的流量有一大部分是惡意流量正想入侵你的網站。但是多數公司將網站上線後,就只在意網站內容,鮮少對網站產生的 log 做安全分析,長久下來,駭客就會找到入侵網站的方法,最後成爲攻撃的下手目標,不可不慎。

觀察 client 端下的 URI 就知道是惡意流量。nginx 顯示為 400 bad request

圖一: 觀察 client 端下的 URI 就知道是惡意流量。nginx 顯示為 400 bad request

提到網站的log 分析你可能會聯想到 google analytics,但那不是安全分析,google analytics 主要是對正常網頁行為做分析,例如哪個網頁在哪段時間有多少人看過。真正的安全分析就是你可以在連續的log 記錄內找到異常的地方或是你建立了安全儀表板,一旦有異常的流量進來,就會收到通知。

Linux web server 主要是 Apache 或是 Nginx 。雖然在server 上都有 access log 及 error log ,但是要長時間做搜尋分析,卻因為格式關係無法有效執行。商業上的解決方案如 splunk ,非常昂貴,而開源的替代方案就是 ELK (Elastic Stack)。爲了達成可搜尋的目標,我們在 web server  上裝上 filebeat 將 log format 轉換成 JSON format 傳送給 Elastic Search ,這樣你就可以在上面看到所有網頁進來的記錄了。

使用 Elastic Stack 搜尋 400 bad request 產生的事件,分析來源 IP

圖二: 使用 Elastic Stack 搜尋 400 bad request 產生的事件,分析來源 IP

一般我們要注意的是暴衝的事件數。如果不是有特別的行銷活動在網站上進行,十之八九都是惡意流量。簡單的惡意流量來自單一 IP,只要確定傳送進來的 URI 是惡意的,就可以立即在防火牆阻擋。進階的惡意流量會使用眾多分散式 IP ,這時就需要搭配其他工具做警報及阻擋。

藍框的流量與 Elastic Stack 比對確定是惡意流量。黃色的線圖是追蹤可疑的特定惡意流量

圖三: 藍框的流量與 Elastic Stack 比對確定是惡意流量。黃色的線圖是追蹤可疑的特定惡意流量

Elastic Stack 本身的警報機制叫做 X-pack,但那是企業版的付費功能。原則上我們可以使用 Grafana 儀表板將 Elastic Search 當做 data source,然後在 Grafana 定義 Alert rule。例如當進來的事件在五分鐘內數量超過2000,將發送警報給系統管理員。使用Grafana 儀表板的另外一個好處是比較容易根據波形判斷是正常流量還是惡意留量。我也可以在同一時間做不同的搜尋,並且可以同時顯示在同一張圖表上,方便做比較。

針對網站應用程式防火牆 WAF ,你可以使用mod_security 來做規則過濾。也就是 mod_security 可以因爲觸發某項規則,導至 403 forbidden。一般來說 Apache 與 mod_security 整合的比較好,Nginx 大部分惡意流量會顯示 400 bad request。為了達到自動阻擋,你可以使用 fail2ban 程式來即時封鎖攻撃 IP。例如十分鐘內有五次 400 或 403/404,就會自動封鎖該 IP。有時會有誤判的狀況,也可加入 fail2ban 白名單內。

fail2ban 將 判斷為 403 的事件來源 IP 做封鎖

圖四: fail2ban 將 判斷為 403 的事件來源 IP 做封鎖


使用了上述開源工具後,基本上可以將惡意流量降低到不用理會的程度。網管人員有更多時間處理其他事情,網站也能健全的運作,這不是很好嗎?

小而美的三節點 Proxmox VE replication HA 高可靠性叢集