電子商務 DoS

以mod_dosblock防禦拒絕服務攻擊

2012-01-31
自電子商務蓬勃發展起來後,相關的攻擊事件即層出不窮的出現,而其中最常見的攻擊手法莫過於拒絕服務攻擊。為抵禦拒絕服務攻擊,IT人員耗費了許多時間與精力,但仍成效不彰。其實,利用本文介紹的Apache網路伺服器的外掛模組mod_dosblock,就可以輕鬆獲得非常好的防禦效果。
拒絕服務攻擊(Denial of Service,DoS)是一種古老的攻擊,早在2000年時就曾因成功狙擊雅虎、亞馬遜等大型的商務網站而聲名大噪。

也由於拒絕服務攻擊具有簡單(只要具有夠多的主機資源能發送封包)及難以追蹤(攻擊封包的來源IP欄位可隨意更改)的特性,而使得此類攻擊有越來越多的趨勢。而擔負電子商務發展重責大任的網站伺服器,自然也是此類攻擊最大的目標。

以往,當網站管理員發現網站服務有不穩的情況時,在確認為攻擊事件後,僅能利用調整防火牆的設定,封鎖發送大量封包的來源IP,然後寄望能夠因此阻擋攻擊而使得網站漸漸穩定下來,因為此類封包的來源IP通常是假造的。

如果能有一個機制直接依附在網站伺服器上,當發現HTTP服務有遭受攻擊的跡象時,就即時地將該連結中斷,以保護網站伺服器,避免遭受更進一步的危害,相信將會是每個網站管理者不可或缺的工具。

在本文中,筆者將介紹mod_dosblock模組,這是最有名的網站伺服器Apache所支援的外掛模組,顧名思義,此模組主要的功能即是用來偵測阻斷拒絕服務攻擊的事件。

一旦發現,可即時阻斷該攻擊,以確保網站伺服器不受該攻擊的影響。本解決方案所需的套件如下:

1.Apache 2.2.16
官方網址:http://httpd.apache.org/
2.mod_dosblock
官方網址:http://code.google.com/p/mod-dosblock/

什麼是拒絕服務攻擊

在此先簡單介紹拒絕服務攻擊的概念。可以將網路視為一條高速公路,相同的車道即使用相同的通訊協定,但由於通訊協定先天設計不良,允許車流量(封包量)在極短時間內可以大量地湧上高速公路(並未設定任何的管制),一旦高速公路在短時間內接收到超過負荷的車流量,則會讓所有的車量卡在公路上而動彈不得。

這類似網路服務因為短時間之內接收到大量的要求封包無法消化,而暫時停止服務。拒絕服務攻擊即是使用類似的概念,利用通訊協定設計的瑕疵,在短時間之內發出大量的封包來攻擊某個受害主機,直至該主機因為無法有效處理而停擺。一般來說,拒絕服務攻擊可以利用下列的攻擊方式達成攻擊的目的。

暴力攻擊法原理

這是最簡單也是最直接的攻擊方式,攻擊者利用短時間內發送大量的封包至被攻擊的主機,造成受害主機因無法負荷而停擺,以下說明暴力攻擊法中最經典的攻擊手法——SYN Flood攻擊。

在TCP通訊協定連線時,須先經由進行三向式握手(Three-way Handshake)建立連線後,才開始進行真正的資料傳輸。下圖為TCP連線的範例。當來源端電腦要與目的端電腦進行通訊連線時,會先經由下列步驟進行連線:

STEP 1:來源端電腦發送SYN封包至目的端電腦,告知「我想跟你連線」。

STEP 2:如果目的端電腦允許此連線,就會回傳SYN-ACK封包,回應來源端電腦,並在系統上建立半連接表,記錄此尚未完成連線的記錄。

STEP 3:當來源端電腦接收到目的端電腦回覆的SYN-ACK封包後,即再回覆ACK封包,告知目的端電腦,已經準備好可以連線了。

STEP 4:在「三向式握手」完成後即建立連線,開始雙方的資料傳輸。

SYN Flood攻擊手法即是利用上述第二個步驟來進行,當目的端電腦回覆SYN-ACK封包後,即會在其系統內保存一份「半連接(half)列表」,並定時詢問此半連接列表中的主機是否有回覆ACK封包,而執行這些動作都需要大量的系統資源。也因此,一個惡意的來源端電腦可利用大量發送SYN封包至受害的主機,而後等到受害主機回覆SYN-ACK封包後即不回覆ACK封包,迫使受害主機必須消耗系統資源來建立「半連接列表」並維護此表。一旦受害主機的資源消耗殆盡後,主機系統即完全停擺,而達到拒絕服務攻擊的目的。

利用通訊協定的漏洞

使用暴力攻擊法的方式,攻擊端必須具備大量的資源,才有可能讓受害主機停止服務,而達到拒絕服務攻擊的目的。但如果是通訊協定造成的危害,往往只需一台主機即可完成。有點像打蛇打七吋,只要打中要害,一點力量也可癱瘓一台主機。

例如去年8月發布的「Apache killer」漏洞,即是利用HTTP通訊協定先天上的漏洞,只要一台攻擊主機即可能癱瘓線上服務的網站伺服器,進而讓網站伺服器停止服務。以下簡單說明「Apache killer」的攻擊原理。

HTTP通訊協定是使用者發出一個HTTP要求(Request)訊息給網站伺服器。網站伺服器接收到使用者的要求,在進行處理後,再以HTTP回覆(Response)訊息回覆給使用者。

通常,預設是一個要求訊息會回覆一整個網頁的資訊,但當初設計HTTP通訊協定的設計者,非常貼心地為使用者考慮到,也許使用者只要求網頁的某個範圍的資訊,而無須每次都回覆一整個網頁(這在過去沒有寬頻的時代是很重要的,因為可大量減少資料的傳輸量),於是設計了Range這個欄位,一旦網站伺服器看到這個欄位,即知道不必傳回整個網頁,而只要傳輸Range所設定的網頁範圍內容即可。

譬如,使用者僅想要網頁資料中的第10至第20個字元,即可設定「Range: bytes=10-20」,網站伺服器一看到此設定,就會將第10至20個字元回覆給使用者。

從好的方向想,此欄位的設定可減少資料的傳輸量,因為使用者只獲得所需的資料,而不必每次都取得頁面全部的資訊。

從另外一個角度想,在一般預設情況下,若沒有指定Range欄位,針對一個HTTP要求,網站伺服器就會回覆一整個網頁,系統也僅須消耗掉一份資源。

但如果惡意的使用者故意發送一個指定傳送多個範圍的Range欄位資訊,譬如設定「Range: bytes=1000-2000,1000-2001?」,表示此一HTTP要求請求網站伺服器回傳網頁第1000至2000及1000至2001?範圍的網頁內容。

在此情況下,網站伺服器為了處理此要求,所消耗的系統資源將倍數於正常未設定Range的要求,也藉此消耗網站伺服器所在的主機系統資源。

等到資源耗盡,網站伺服器即停止服務,進而達到拒絕服務攻擊的目的。這也是Apache Killer攻擊方法的基本原理。

接下來利用Telnet來實作HTTP的存取,相信會有更深一層的體會。以下為一個正常存取網頁的步驟:

▲網站伺服器預設回覆一整個網頁,網站伺服器僅需消耗掉一份系統資源即可完成此次的要求。

從上圖中可看出網站伺服器預設回覆一整個網頁,網站伺服器僅需消耗掉一份系統資源即可完成此次的要求。

接下來,如果在HTTP要求加上range欄位,網站伺服器會如何回應要求,相關指令如下:

如下圖,可發現網站伺服器會根據HTTP要求中的Range設定,回覆多個部分網頁內容,這也就意謂著在預設的情況下,一個HTTP要求僅為消耗掉系統一份資源,但如果有心人士送出一個含有Range欄位資訊的惡意HTTP要求,即會讓網站伺服器重複消耗掉多份的系統資源。從圖中,還可發現網站伺服器回覆了多個網頁內容。

▲網站伺服器會根據HTTP要求中的Range設定,回覆多個部分網頁內容。

在了解拒絕服務攻擊的基本原理後,接下來,繼續說明可預防此類攻擊的Apache外掛模組mod_dosblock。

mod_dosblock介紹

mod_dosblock是Apache網站伺服器的一個外掛模組,主要的功能在於偵測與網站伺服器往來的HTTP封包存取是否有異常的狀況,主要的是用來偵測是否有惡意攻擊者利用拒絕服務攻擊手法正在攻擊網站伺服器。

接下來,繼續說明如何安裝mod_dosblock,將以DSO(Dynamic Shared Object)的方式來編譯mod_dosblock模組,在此先簡單說明DSO機制。

Apache是一種模組化的系統,可隨意地掛載如mod_dosblock等等所需的模組來增加相關的功能,而不必重新編譯整個Apache的程式碼。

而Apache提供兩種方式來掛載模組,第一種為靜態(Static)的模組掛載,此種方式在編譯原始碼的階段時,即將所需的模組編譯進來,若使用「configure--enable-so」命令,即表示在編譯階段就會將so模組掛載進來(靜態模組)。

此種方式優點在於,由於內嵌在網站伺服器中,所以效能較好,但其最大的缺點是較無彈性,每次要為網站伺服器新增功能時,就必須重新編譯所有的原始碼,也因此Apache提供另外一種較有彈性的掛載方式,稱為動態掛載模組。

Apache須支援so模組,方可使用動態掛載的功能,在編譯Apache時須加上--enable-so參數才可使用DSO機制。讀者可利用「httpd -l」命令來檢查是否有支援DSO機制,如果有出現mod_so.c等字句,即表示支援DSO機制。

Apache並提供apxs(Apache extension)程式來編譯Apache動態模組。接著,簡單說明apxs的使用方法(在此僅說明編譯及安裝的相關選項,其餘選項請自行查閱相關的文件說明),編譯選項如下:

-c:此選項表示執行編譯。將原始碼編譯成動態模組。
-o:指定編譯後的動態模組檔名。
-D name=value:可指定相關的編譯變數。
-I incdir:可用於增加自訂的包含(include)目錄。
-L libdir:可用於增加自訂的程式庫(lib)目錄。
-l libname:可用於增加自訂的程式庫檔案。
-Wc,compiler-flags:可增加編譯器特有的選項。
-Wl,linker-flags:可增加連接器(linker)特有的選項。

而apxs的安裝選項如下所示:
-i:執行安裝,將相關的動態模組安裝至Apache安裝路徑下的modules目錄中。
-a:自動在httpd.conf內加上LoadModule來載入相關的動態模組。
-A:功能類似-a選項的用法,但此選項除了會自動在httpd.conf檔案內加上LoadModule來載入相關的動態模組外,還會在該行首加上#,表示該動態模組已準備就緒,但暫時不啟用該動態模組。

在理解DSO機制相關的說明後,接下來,繼續安裝mod_dosblock模組。先至mod_dosblock官方網址取得最新版本(這裡所取得的版本為1.0),而下載解壓縮後,利用下列指令編譯:

在編譯成功後,可檢查httpd.conf檔內是否有新增下列的設定:

確認一切無誤後,便須要重新啟動Apache伺服器來開啟相關的動態模組功能。接下來,說明mod_dosblock模組相關的設定資訊。

mod_dosblock模組主要是利用解析HTTP通訊協定中的網址(URL)資訊及相關標頭(Header)的資訊來判別是否為拒絕服務攻擊,通常拒絕服務攻擊的判斷方式,大多為計算在一個單位時間內有多少的存取次數(即設立一個門檻值,當單一來源存取不合理超過此門檻值時,即判別為異常)來決定是否遭受拒絕服務攻擊。

mod_dosblock模組也不例外,它定義一個qps來作為判別為拒絕服務攻擊的門檻值,例如queries per second為每秒多少個存取(Query)單位。然後,繼續介紹mod_dosblock模組的設定選項,mod_dosblock模組提供四個設定選項,如上頁表所示。至此,就完成一個可抵擋拒絕服務攻擊手法的網站伺服器。

結語

一般企業在思考防禦Web攻擊事件如SQL Inject、X.S.S等,或是本文所介紹的拒絕服務攻擊時,往往傾向於購買網站應用防火牆(Web Application Firewall,WAF)等相關設備。

但是動輒七位數的網站應用防火牆,不是一般中小企業所能負擔得起。其實,在開源碼社群中都有相關的解決方案,如之前所介紹過的mod_security模組即是預防Web攻擊的不二人選。

而本文所介紹的mod_dosblock模組更可以有效防禦有心人士的拒絕服務攻擊。只要發揮一點創意,加上相關的開源碼資源,即可實作出一套防禦能力不亞於商業網站應用防火牆的網站伺服器。


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!