左衛(wèi)剛 ,王耀紅
DDoS(Distributed Denial of Service,分布式拒絕服務(wù))攻擊是目前威脅網(wǎng)絡(luò)安全的重要因素之一,其主要目的是讓指定目標(biāo)無法提供正常服務(wù),甚至從互聯(lián)網(wǎng)上消失,是目前最強(qiáng)大、最難防御的攻擊之一。
按照發(fā)起的方式,DDoS可以簡(jiǎn)單分為三類。第一類以力取勝,海量數(shù)據(jù)包從互聯(lián)網(wǎng)的各個(gè)角落蜂擁而來,堵塞IDC入口。第二類以巧取勝,利用協(xié)議或者軟件的漏洞,每隔幾分鐘發(fā)一個(gè)包甚至只需要一個(gè)包,就可以讓高級(jí)配置的服務(wù)器不再響應(yīng),例如Slowloris攻擊、Hash沖突攻擊等。第三類是上述兩種的混合,既利用了協(xié)議、系統(tǒng)的缺陷,又具備了海量的流量,例如SYNFlood攻擊、DNSQuery Flood攻擊,是當(dāng)前的主流攻擊方式。本文將一一描述這些最常見、最具代表性的攻擊方式,并介紹對(duì)它們的防御方案。
SYNFlood是互聯(lián)網(wǎng)上最經(jīng)典的DDoS攻擊方式之一,其攻擊利用了TCP三次握手的缺陷,能夠以較小代價(jià)使目標(biāo)服務(wù)器無法響應(yīng)。標(biāo)準(zhǔn)的TCP三次握手過程如下:(1)客戶端發(fā)送一個(gè)包含SYN標(biāo)志的TCP報(bào)文,SYN即同步(Synchronize),同步報(bào)文會(huì)指明客戶端使用的端口以及TCP連接的初始序號(hào);(2)服務(wù)器在收到客戶端的SYN報(bào)文后,將返回一個(gè)SYN+ACK(即確認(rèn)Acknowledgement)的報(bào)文,表示客戶端的請(qǐng)求被接受,同時(shí)TCP初始序號(hào)自動(dòng)加1;(3)客戶端也返回一個(gè)確認(rèn)報(bào)文ACK給服務(wù)器端,同樣TCP序列號(hào)被加1。經(jīng)過這三步,TCP連接就建立完成。TCP協(xié)議為了實(shí)現(xiàn)可靠傳輸,在三次握手的過程中設(shè)置了一些異常處理機(jī)制。第三步中如果服務(wù)器沒有收到客戶端的最終ACK確認(rèn)報(bào)文,會(huì)一直處于SYN_RECV狀態(tài),將客戶端IP加入等待列表,并重發(fā)第二步的SYN+ACK報(bào)文。另一方面,服務(wù)器在自己發(fā)出了SYN+ACK報(bào)文后,會(huì)預(yù)分配資源為即將建立的TCP連接儲(chǔ)存信息做準(zhǔn)備,這個(gè)資源在等待重試期間一直被保留。而服務(wù)器資源有限,可以維護(hù)的SYN_RECV狀態(tài)超過極限后就不再接受新的SYN報(bào)文,也就是拒絕新的TCP連接建立。SYN Flood正是利用了上文中TCP協(xié)議的設(shè)定,達(dá)到攻擊的目的。
作為互聯(lián)網(wǎng)最基礎(chǔ)、最核心的服務(wù),DNS自然也是DDoS攻擊的重要目標(biāo)之一。DNSQuery Flood就是攻擊者操縱大量傀儡機(jī)器,對(duì)目標(biāo)發(fā)起海量的域名查詢請(qǐng)求。消耗DNS服務(wù)器的CPU資源,解析無法正常響應(yīng)。
HTTPFlood是針對(duì)Web服務(wù)在第七層協(xié)議發(fā)起的攻擊。HTTPFlood攻擊是通過端口掃描程序在互聯(lián)網(wǎng)上尋找匿名的HTTP代理或者SOCKS代理,攻擊者通過匿名代理對(duì)攻擊目標(biāo)發(fā)起HTTP請(qǐng)求。這種攻擊會(huì)引起嚴(yán)重的連鎖反應(yīng),不僅是直接導(dǎo)致被攻擊的Web前端響應(yīng)緩慢,還間接攻擊到后端的Java等業(yè)務(wù)層邏輯以及其后端的數(shù)據(jù)庫(kù)服務(wù),增大它們的壓力,甚至對(duì)日志存儲(chǔ)服務(wù)器都帶來影響。
慢速連接攻擊以慢著稱,最具代表性的是Slowloris。HTTP協(xié)議規(guī)定,HTTPRequest以 結(jié)尾表示客戶端發(fā)送結(jié)束,服務(wù)端開始處理。Slowloris就是利用永遠(yuǎn)不發(fā)送 來做DDoS攻擊的。攻擊者在HTTP請(qǐng)求頭中將Connection設(shè)置為Keep-Alive,要求WebServer保持TCP連接不要斷開,隨后緩慢地每隔幾分鐘發(fā)送一個(gè)key-value格式的數(shù)據(jù)到服務(wù)端,如a:b ,導(dǎo)致服務(wù)端認(rèn)為HTTP頭部沒有接收完成而一直等待。如果攻擊者用多線程或者傀儡機(jī)來做同樣的操作,服務(wù)器的Web容器很快就被攻擊者占滿了TCP連接而不再接受新的請(qǐng)求。
前面的攻擊方式,多多少少都需要一些傀儡機(jī),即使是HTTPFlood也需要搜索大量的匿名代理。而來自P2P網(wǎng)絡(luò)的攻擊,只需要發(fā)出一些指令,就有機(jī)器自動(dòng)上來執(zhí)行?,F(xiàn)如今,互聯(lián)網(wǎng)上的P2P用戶和流量都是一個(gè)極為龐大的數(shù)字。如果他們都去一個(gè)指定的地方下載數(shù)據(jù),將成千上萬的真實(shí)IP地址連接過來,被攻擊網(wǎng)絡(luò)將會(huì)癱瘓。
談到DDoS防御,首先要知道到底遭受了多大的攻擊。以SYNFlood為例,為了提高發(fā)送效率在服務(wù)端產(chǎn)生更多的SYN等待隊(duì)列,攻擊程序在填充包頭時(shí),IP首部和TCP首部都不填充可選的字段,因此IP首部長(zhǎng)度恰好是20字節(jié),TCP首部也是20字節(jié),共40字節(jié)。
對(duì)于以太網(wǎng)來說,最小的包長(zhǎng)度數(shù)據(jù)段必須達(dá)到46字節(jié),而攻擊報(bào)文只有40字節(jié),因此,網(wǎng)卡在發(fā)送時(shí),會(huì)做一些處理,在TCP首部的末尾,填充6個(gè)0來滿足最小包的長(zhǎng)度要求。這個(gè)時(shí)候,整個(gè)數(shù)據(jù)包的長(zhǎng)度為14字節(jié)的以太網(wǎng)頭,20字節(jié)的IP頭,20字節(jié)的TCP頭,再加上因?yàn)樽钚“L(zhǎng)度要求而填充的6個(gè)字節(jié)的0,一共是60字節(jié)。
但這還沒有結(jié)束。以太網(wǎng)在傳輸數(shù)據(jù)時(shí),還有CRC檢驗(yàn)的要求。網(wǎng)卡會(huì)在發(fā)送數(shù)據(jù)之前對(duì)數(shù)據(jù)包進(jìn)行CRC檢驗(yàn),將4字節(jié)的CRC值附加到包頭的最后面。這個(gè)時(shí)候,數(shù)據(jù)包長(zhǎng)度已不再是40字節(jié),而是變成64字節(jié)了,這就是常說的SYN小包攻擊,數(shù)據(jù)包結(jié)構(gòu)如下:
到64字節(jié)時(shí),SYN數(shù)據(jù)包已經(jīng)填充完成,準(zhǔn)備開始傳輸了。攻擊數(shù)據(jù)包很小,遠(yuǎn)遠(yuǎn)不夠最大傳輸單元(MTU)的1500字節(jié),因此不會(huì)被分片。以太網(wǎng)在傳輸時(shí),還有前導(dǎo)碼(preamble)和幀間距(inter-frame gap)。其中前導(dǎo)碼占8字節(jié)(byte),即64比特位。前導(dǎo)碼前面的7字節(jié)都是10101010,1和0間隔而成。但第八個(gè)字節(jié)就變成了10101011,當(dāng)主機(jī)監(jiān)測(cè)到連續(xù)的兩個(gè)1時(shí),就知道后面開始是數(shù)據(jù)了。在網(wǎng)絡(luò)傳輸時(shí),數(shù)據(jù)的結(jié)構(gòu)如下:
也就是說,一個(gè)本來只有40字節(jié)的SYN包,在網(wǎng)絡(luò)上傳輸時(shí)占的帶寬,其實(shí)是84字節(jié)。通過以上分析,可以計(jì)算攻擊流量和網(wǎng)絡(luò)設(shè)備的線速問題。當(dāng)只填充IP頭和TCP頭的最小SYN包跑在以太網(wǎng)絡(luò)上時(shí),100Mbit的網(wǎng)絡(luò),能支持的最大PPS(Packet Per Second)是100×106/(8×(64+8+12))=148809,1000Mbit的網(wǎng)絡(luò),能支持的最大PPS是1488090。
前文描述過,SYN Flood攻擊大量消耗服務(wù)器的CPU、內(nèi)存資源,并占滿SYN等待隊(duì)列。相應(yīng)地,我們修改內(nèi)核參數(shù)即可有效緩解。主要參數(shù)如下:
分別為啟用SYNCookie、設(shè)置SYN最大隊(duì)列長(zhǎng)度以及設(shè)置SYN+ACK最大重試次數(shù)。SYNCookie的作用是緩解服務(wù)器資源壓力。啟用之前,服務(wù)器在接到SYN數(shù)據(jù)包后立即分配存儲(chǔ)空間,并隨機(jī)化一個(gè)數(shù)字作為SYN號(hào)發(fā)送SYN+ACK數(shù)據(jù)包。然后保存連接的狀態(tài)信息等待客戶端確認(rèn)。啟用SYNCookie之后,服務(wù)器不再分配存儲(chǔ)空間,而且通過基于時(shí)間種子的隨機(jī)數(shù)算法設(shè)置一個(gè)SYN號(hào),替代完全隨機(jī)的SYN號(hào)。發(fā)送完SYN+ACK確認(rèn)報(bào)文之后,清空資源不保存任何狀態(tài)信息。直到服務(wù)器接到客戶端的最終ACK包,通過Cookie檢驗(yàn)算法鑒定是否與發(fā)出去的SYN+ACK報(bào)文序列號(hào)匹配,匹配則通過完成握手,失敗則丟棄。
還有一種常見做法是TCP首包丟棄方案,利用TCP協(xié)議的重傳機(jī)制識(shí)別正常用戶和攻擊報(bào)文。當(dāng)防御設(shè)備接到一個(gè)IP地址的SYN報(bào)文后,簡(jiǎn)單比對(duì)該IP是否存在于白名單中,存在則轉(zhuǎn)發(fā)到后端。如不存在于白名單中,檢查是否是該IP在一定時(shí)間段內(nèi)的首次SYN報(bào)文,不是則檢查是否重傳報(bào)文,是重傳則轉(zhuǎn)發(fā)并加入白名單,不是則丟棄并加入黑名單;是首次SYN報(bào)文則丟棄并等待一段時(shí)間以試圖接受該IP的SYN重傳報(bào)文,等待超時(shí)則判定為攻擊報(bào)文加入黑名單。
HTTPFlood攻擊防御主要通過緩存的方式進(jìn)行,盡量由設(shè)備的緩存直接返回結(jié)果來保護(hù)后端業(yè)務(wù)。大型的互聯(lián)網(wǎng)企業(yè),會(huì)有龐大的CDN節(jié)點(diǎn)緩存內(nèi)容。HTTPFlood是由程序模擬HTTP請(qǐng)求,一般來說不會(huì)解析服務(wù)端返回?cái)?shù)據(jù),更不會(huì)解析JS之類代碼。當(dāng)攻擊者穿透緩存時(shí),清洗設(shè)備會(huì)截獲到HTTP請(qǐng)求,返回一段特殊JavaScript代碼,正常用戶的瀏覽器會(huì)處理并正常跳轉(zhuǎn)不影響使用,而攻擊程序會(huì)攻擊到空處。
DNS攻擊防御也有類似HTTP的防御手段,第一方案是緩存。其次是重發(fā),可以是直接丟棄DNS報(bào)文導(dǎo)致UDP層面的請(qǐng)求重發(fā),可以是返回特殊響應(yīng)強(qiáng)制要求客戶端使用TCP協(xié)議重發(fā)DNS查詢請(qǐng)求。特殊地,對(duì)于授權(quán)域DNS的保護(hù),設(shè)備會(huì)在業(yè)務(wù)正常時(shí)期提取收到的DNS域名列表和ISPDNSIP列表備用,在攻擊時(shí),非此列表的請(qǐng)求一律丟棄,大幅降低性能壓力。對(duì)于域名,實(shí)行同樣的域名白名單機(jī)制,非白名單中的域名解析請(qǐng)求,做丟棄處理。
Slowloris攻擊防御比較簡(jiǎn)單,主要方案有兩個(gè):第一個(gè)是統(tǒng)計(jì)每個(gè)TCP連接的時(shí)長(zhǎng)并計(jì)算單位時(shí)間內(nèi)通過的報(bào)文數(shù)量即可做精確識(shí)別。一個(gè)TCP連接中,HTTP報(bào)文太少和報(bào)文太多都是不正常的,過少可能是慢速連接攻擊,過多可能是使用HTTP1.1協(xié)議進(jìn)行的HTTPFlood攻擊,在一個(gè)TCP連接中發(fā)送多個(gè)HTTP請(qǐng)求。第二個(gè)是限制HTTP頭部傳輸?shù)淖畲笤S可時(shí)間。超過指定時(shí)間HTTPHeader還沒有傳輸完成,直接判定源IP地址為慢速連接攻擊,中斷連接并加入黑名單。
互聯(lián)網(wǎng)企業(yè)防御DDoS攻擊,主要使用上文的基礎(chǔ)防御手段,重點(diǎn)在于監(jiān)控、組織以及流程。監(jiān)控需要具備多層監(jiān)控、縱深防御的概念,從骨干網(wǎng)絡(luò)、IDC入口網(wǎng)絡(luò)的BPS、PPS、協(xié)議分布,負(fù)載均衡層的VIP新建連接數(shù)、并發(fā)連接數(shù)、BPS、PPS到主機(jī)層的CPU狀態(tài)、TCP新建連接數(shù)狀態(tài)、TCP并發(fā)連接數(shù)狀態(tài),到業(yè)務(wù)層的業(yè)務(wù)處理量、業(yè)務(wù)連通性等多個(gè)點(diǎn)部署監(jiān)控系統(tǒng)。即使一個(gè)監(jiān)控點(diǎn)失效,其他監(jiān)控點(diǎn)也能夠及時(shí)給出報(bào)警信息。多個(gè)點(diǎn)信息結(jié)合,準(zhǔn)確判斷被攻擊目標(biāo)和攻擊手法。一旦發(fā)現(xiàn)異常,立即啟動(dòng)在虛擬防御組織中的應(yīng)急流程,防御組織需要囊括到足夠全面的人員,至少包含監(jiān)控部門、運(yùn)維部門、網(wǎng)絡(luò)部門、安全部門、客服部門、業(yè)務(wù)部門等,所有人員都需要2~3個(gè)備份。流程啟動(dòng)后,除了人工處理,還應(yīng)該包含一定的自動(dòng)處理、半自動(dòng)處理能力。例如自動(dòng)化的攻擊分析,確定攻擊類型,自動(dòng)化、半自動(dòng)化的防御策略,在安全人員到位之前,最先發(fā)現(xiàn)攻擊的部門可以采取一些緩解措施。
除了DDoS到來之時(shí)的流程等工作之外,更多的工作是在攻擊到來之前。主要包含CDN節(jié)點(diǎn)部署、DNS設(shè)置、流程演習(xí)等。對(duì)于企業(yè)來說,具備多個(gè)CDN節(jié)點(diǎn)是DDoS防御容量的關(guān)鍵指標(biāo)。當(dāng)一個(gè)機(jī)房承擔(dān)不住海量數(shù)據(jù)時(shí),可以通過DNS輪詢的方式,把流量引導(dǎo)到多個(gè)分布節(jié)點(diǎn),使用防御設(shè)備分頭處理。因此,DNS的TTL值需要設(shè)置得足夠小,能夠快速切換,每個(gè)CDN節(jié)點(diǎn)的各種VIP設(shè)置也需要準(zhǔn)備充分。
總之,在虛擬化時(shí)代,各種用戶的不同業(yè)務(wù)共處在相同的物理機(jī)平臺(tái),遭受DDoS攻擊的可能性越來越高,而且一個(gè)用戶被攻擊可能牽扯到大量的其他用戶,危害被顯著放大,因此防御顯得尤為重要。對(duì)DDoS防御,除了以上介紹的幾種防御外,主要的工作是幕后積累。如果有充分的資源準(zhǔn)備,有足夠的應(yīng)急演練,有豐富的處理經(jīng)驗(yàn),DDoS攻擊將不再是噩夢(mèng)。
[1]鄭顯舉.分布式拒絕服務(wù)防御技術(shù)研究[J].計(jì)算機(jī)與數(shù)字工程,2011(7):109-112.
[2]廖鳳蘭.DDoS防御系統(tǒng)關(guān)鍵技術(shù)的研究[D].上海:上海交通大學(xué),2007.
[3]池水明.DDoS攻擊防御技術(shù)的研究[J].信息網(wǎng)絡(luò)安全,2012(5):27-31.
[4](美)杜里格瑞斯.網(wǎng)絡(luò)安全:現(xiàn)狀與展望[M].北京:科學(xué)出版社,2010.
[5]張玉清.網(wǎng)絡(luò)攻擊與防御技術(shù)[M].北京:清華大學(xué)出版社,2011.