前段時間,本站遭遇了一次CC攻擊,具體攻擊的原因未知,攻擊期間大概在1天左右,攻擊器使用了大量IP對本站進行了CC攻擊,使得本站一度過載出現無法訪問的情況,通過一番努力,在攻擊開始後一段時間以後成功封堵了攻擊者,本文簡要記述了當日的攻擊和防禦過程,謹以為戒。
首先給出本站的基本構架,本站採用asp.net mvc 1.0開發,基於sqlite資料庫系統,部署在win2008+IIS7的系統上,本次攻擊是典型的CC攻擊,攻擊者使用大量肉雞發起大量無效http請求,而導致程式過載。
攻擊大概在某天上午開始了,由於本站採用的sqlite為單檔案資料庫,在大並發情況下負載能力較低,對於一般blog程式自然是綽綽有餘,但是在大量攻擊的情況下,該資料庫就無法充分利用系統資源了,在伺服器cpu佔用率在30%左右的時候,本站開始變得極為緩慢甚至出現程式執行錯誤,正常訪問出現問題。
出現問題後,我進入伺服器,發現流量達到5M左右,活動http串連在200以上,在此情況下,sqlite負載下的本程式顯然已經無法正常服務,於是開始考慮應對方法。
對付CC攻擊,一般採用防火牆封鎖或者負載平衡的方式處理,負載平衡顯然不太現實,因此,我們考慮採用防火牆系統封堵大量非法請求IP,win2008中內建了功能極為強大的防火牆系統,因此,我們使用它來封鎖非法請求。
由於訪問IP量巨大,因此,手動處理和辨別非法ip是不現實的,因此,我考慮使用程式分析攻擊ip的方式,對iis日誌訪問記錄進行詳細分析,分析方法如下:
1.對當日的訪問ip進行統計
2.攻擊者的典型特徵是短時間多次串連,通過該方式,篩選出大量可疑IP
3.對可疑IP進行分析,剔除搜尋引擎蜘蛛IP
5.最後剩下的基本上就是攻擊者IP
通過以上方法,我們可以在較高精確度的情況下找出攻擊者IP,通過對本次攻擊的日誌分析,在封堵大量攻擊者IP之前,找到嫌疑度很高的IP988個。
然後需要做的就是在防火牆封堵這些IP,規則採用入站規則,這樣,防火牆封堵將獲得很高的效率,經過實驗發現,windows防火牆一條規則大概可以封堵600多個單一IP,因此,我建立了兩條規則,通過指令碼,將這些可疑度很高的ip全部加入拒絕ip列表,完成之後,伺服器流量和cpu佔用率馬上下降到正常水平。
在攻擊過程中,經常出現攻擊者攻擊一段時間,停止一段時間,因此,我採用系統通知的方式,在伺服器負載或者流量突然很大的時候進行通知,這樣就可以在第一時間得知攻擊情況並進行封堵。
在一天以後,攻擊停止,我解開了這兩條規則,由於攻擊者經常使用合法ip進行攻擊,因此這些ip的使用者也很可能訪問本站,因此在攻擊停止之後需要解開規則。
本次規則,共出現攻擊ip998個,在封堵之前,攻擊次數最多的ip202.108.xxx.xxx進行了1401此攻擊串連,最少的攻擊IP189.31.xxx.xxx進行了11次攻擊串連,在攻擊停止之後,再次對日誌進行分析,共產生116494次攻擊訪問請求,同時將系統最高線上人數重新整理到331人,考慮在攻擊不久之後便封堵了大量攻擊IP,因此本次攻擊量還是比較大的。