白翼銘,燕 瑋,許鳳凱,郝 帥,范春雷
(華北計(jì)算機(jī)系統(tǒng)工程研究所,北京100083)
近年來(lái),云計(jì)算的概念逐漸普及,同時(shí)其面臨的威脅也與日俱增。由于現(xiàn)在云服務(wù)的應(yīng)用越來(lái)越廣泛,基于B/S 架構(gòu)的網(wǎng)頁(yè)應(yīng)用形式逐漸代替?zhèn)鹘y(tǒng)桌面應(yīng)用,部署在云平臺(tái)上的Web 應(yīng)用越來(lái)越多,導(dǎo)致部署在云平臺(tái)上的Web 服務(wù)器逐漸成為攻擊者的目標(biāo),因此對(duì)其防御策略的研究迫在眉睫[1]。而對(duì)攻擊者而言, 對(duì)云平臺(tái)中提供網(wǎng)頁(yè)服務(wù)的Web服務(wù)器進(jìn)行HTTP Slow DDoS 攻擊是一種非常有效的攻擊手段。 針對(duì)這一問(wèn)題,本文通過(guò)對(duì)HTTP Slow DDoS 攻擊的模擬和研究, 提出了相應(yīng)的防御策略并對(duì)其有效性進(jìn)行驗(yàn)證。
HTTP Slow DDoS 攻擊也叫慢連接攻擊,屬于應(yīng)用層DDoS 攻擊。
分布式拒絕服務(wù)攻擊(Distributed Denial of Service,DDoS)通過(guò)控制大量“肉雞”,向目標(biāo)網(wǎng)絡(luò)或設(shè)備發(fā)送大量數(shù)據(jù)或建立連接,以耗盡目標(biāo)各種資源的方式使目標(biāo)無(wú)法向正常的用戶請(qǐng)求進(jìn)行應(yīng)答或提供服務(wù),從而達(dá)到拒絕服務(wù)的目的[2-3]。
超文本傳輸協(xié)議(Hyper Text Transfer Protocol,HTTP)的 常 用 請(qǐng) 求 包 括GET 和POST 兩 種。 GET 請(qǐng)求用于從服務(wù)器獲取資源,如請(qǐng)求數(shù)據(jù)、下載文件等;POST 請(qǐng)求則用于向服務(wù)器提交數(shù)據(jù),如輸入的用戶名密碼、發(fā)布的內(nèi)容等。HTTP 請(qǐng)求一般是無(wú)狀態(tài)的,即每次請(qǐng)求都會(huì)建立連接,同時(shí)在請(qǐng)求結(jié)束后斷開(kāi)該連接。
攻擊者利用HTTP 協(xié)議的正常交互機(jī)制,先與云平臺(tái)中的目標(biāo)服務(wù)器(本文中為Web 服務(wù)器)建立一個(gè)連接,然后通過(guò)向服務(wù)器不斷發(fā)送或請(qǐng)求內(nèi)容,長(zhǎng)時(shí)間保持該連接不釋放。 云平臺(tái)目標(biāo)服務(wù)器在處理HTTP 請(qǐng)求的過(guò)程中,只能同時(shí)和有限的用戶保持連接,大于最大連接數(shù)的用戶請(qǐng)求將被丟棄,如果攻擊者與云平臺(tái)目標(biāo)服務(wù)器建立大量這樣的連接,就會(huì)耗盡其并發(fā)連接數(shù)資源,使其無(wú)法提供正常頁(yè)面及服務(wù)[4],即所謂的HTTP Slow DDoS 攻擊。
與Flood 攻擊的方法不同,慢連接攻擊不需要同時(shí)發(fā)出大量請(qǐng)求。 其攻擊的不是服務(wù)器的帶寬或計(jì)算資源,而是硬件資源,即服務(wù)器的并發(fā)線程數(shù)量。由于每一個(gè)請(qǐng)求都會(huì)啟動(dòng)一個(gè)線程,而在請(qǐng)求結(jié)束之前線程會(huì)被阻塞,因此在服務(wù)器建立了大量連接,導(dǎo)致線程無(wú)法被釋放,服務(wù)器的最大連接線程數(shù)很快會(huì)被耗盡,其他用戶的正常請(qǐng)求就無(wú)法與服務(wù)器建立連接,從而完成攻擊[5-6]。
HTTP Slow DDoS 有三種實(shí)現(xiàn)方法,分別對(duì)應(yīng)在HTTP 請(qǐng)求連接中傳遞數(shù)據(jù)的三個(gè)過(guò)程:客戶端發(fā)送/服務(wù)器接收HTTP 頭部、客戶端發(fā)送/服務(wù)器接收數(shù)據(jù)、服務(wù)器返回/客戶端接收Response 數(shù)據(jù)。 其分 別 對(duì) 應(yīng) 的 攻 擊 為 Slow headers、Slow body、Slow read[7]。 攻擊過(guò)程如圖1 所示。
Slow headers 也 稱 為Slowloris 攻 擊。 Web 應(yīng) 用 在處理HTTP 請(qǐng)求之前都要先接收完所有的HTTP 頭部,因?yàn)镠TTP 頭部中包含了一些Web 應(yīng)用可能用到的重要信息。 HTTP 協(xié)議規(guī)定,HTTP Request 以 (0d0a0d0a)結(jié)尾表示客戶端發(fā)送結(jié)束,服務(wù)端開(kāi)始處理。攻擊者在HTTP 請(qǐng)求頭中將Connection 設(shè)置為Keep-Alive,要求服務(wù)器保持TCP 連接不斷開(kāi),并在末尾不添加 ,隨后緩慢地隔一段時(shí)間發(fā)送一個(gè)模仿HTTP 頭部屬性的key-value 格式數(shù)據(jù),如a:b , 導(dǎo)致服務(wù)器認(rèn)為HTTP 頭部沒(méi)有接收完成而一直等待,連接線程一直被占用。
圖1 HTTP Slow DDoS 攻擊過(guò)程圖
Slow body 也叫Slow POST 攻擊,是Slowloris 攻擊的變種。 攻擊者構(gòu)造并發(fā)送一個(gè)HTTP POST 請(qǐng)求,并將該請(qǐng)求頭部的Content-Length 值設(shè)置很大, 使服務(wù)器認(rèn)為客戶端要發(fā)送大的數(shù)據(jù)。 服務(wù)器會(huì)保持連接準(zhǔn)備接收數(shù)據(jù),但攻擊者每次只發(fā)送很少量的數(shù)據(jù), 服務(wù)器因?yàn)闆](méi)有接收到相應(yīng)Content-Length 的數(shù)據(jù)而持續(xù)等待客戶端, 使該連接一直保持存活,線程一直被阻塞。
與前兩種通過(guò)客戶端不斷向服務(wù)器發(fā)送數(shù)據(jù)來(lái)保持連接的方法相反,Slow read 攻擊通過(guò)使服務(wù)器不斷向客戶端發(fā)送數(shù)據(jù)來(lái)保持連接。 客戶端與服務(wù)器建立連接,并發(fā)送一個(gè)完整的HTTP 請(qǐng)求,然后在服務(wù)器向客戶端返回?cái)?shù)據(jù)時(shí),攻擊者通過(guò)如給客戶端設(shè)置很小的緩沖區(qū)等方式,使客戶端以很低的速度讀取Response。 客戶端長(zhǎng)時(shí)間未讀取數(shù)據(jù),會(huì)發(fā)送TCP ZeroWindow 到服務(wù)器,讓服務(wù)器誤以為客戶端很忙,直到連接快超時(shí)前才讀取少量數(shù)據(jù),使該連接一直保持存活,線程一直被阻塞。 在使用這種攻擊方法時(shí),必須要保證請(qǐng)求的資源足夠大,至少遠(yuǎn)大于服務(wù)器的發(fā)送緩沖區(qū),使服務(wù)器始終保持線程,不斷將資源放入發(fā)送緩沖區(qū)中,否則服務(wù)器將資源放入緩沖區(qū)后就會(huì)釋放線程,無(wú)法達(dá)到消耗線程資源的目的。
在云計(jì)算領(lǐng)域,諸多商業(yè)公司選擇利用現(xiàn)有的開(kāi)源云平臺(tái)進(jìn)行二次開(kāi)發(fā),其中OpenStack 在各方面與其他開(kāi)源云對(duì)比都處于優(yōu)勢(shì),如社區(qū)人數(shù)多,市場(chǎng)占有率高,因此進(jìn)行二次開(kāi)發(fā)的云平臺(tái)多數(shù)都是以O(shè)penStack 為基礎(chǔ),例如RedHat 云、華為云等。OpenStack 架構(gòu)的主體為計(jì)算服務(wù)、網(wǎng)絡(luò)服務(wù)、存儲(chǔ)服務(wù),分別由各組件實(shí)現(xiàn),組件間松耦合性高,配置較為靈活,被廣泛應(yīng)用于云服務(wù)的搭建,使其成為了攻擊者的重要目標(biāo)。 因此針對(duì)OpenStack 云平臺(tái)的HTTP Slow DDoS 防御研究迫在眉睫[8]。
云平臺(tái)的網(wǎng)絡(luò)節(jié)點(diǎn)會(huì)將攻擊請(qǐng)求和流量路由轉(zhuǎn)發(fā)到云平臺(tái)中的目標(biāo)服務(wù)器。 在對(duì)云平臺(tái)的訪問(wèn)過(guò)程中,用戶和攻擊者發(fā)送的應(yīng)用請(qǐng)求和攻擊流量通過(guò)互聯(lián)網(wǎng)到達(dá)云服務(wù)訪問(wèn)接入點(diǎn)。 云服務(wù)訪問(wèn)接入點(diǎn)是布置云平臺(tái)DDoS 防御的第一道防線。 具體而言,可在云服務(wù)訪問(wèn)接入點(diǎn)部署云防火墻、入侵防御系統(tǒng)等,對(duì)所有進(jìn)入云數(shù)據(jù)中心的請(qǐng)求和流量進(jìn)行監(jiān)控。
請(qǐng)求和流量經(jīng)過(guò)云服務(wù)訪問(wèn)接入點(diǎn)后到達(dá)云平臺(tái)的內(nèi)部網(wǎng)絡(luò),在該部分需要防御傳統(tǒng)網(wǎng)絡(luò)中的網(wǎng)絡(luò)層DDoS 攻擊,以及針對(duì)SDN(軟件定義網(wǎng)絡(luò))引入的控制層DDoS 攻擊、數(shù)據(jù)層Flood DDoS攻擊、數(shù)據(jù)層Slow DDoS 攻擊等。 控制層是云平臺(tái)內(nèi)部網(wǎng)絡(luò)DDoS 防御的核心,針對(duì)不同的DDoS 防御需求,網(wǎng)絡(luò)管理人員可以將流量管理策略,如訪問(wèn)控制、流量分析、負(fù)載均衡等,封裝成應(yīng)用層獨(dú)立的應(yīng)用,指導(dǎo)控制層處理全局網(wǎng)絡(luò)流量,也可直接在網(wǎng)絡(luò)節(jié)點(diǎn)的SDN 控制器中集成統(tǒng)一DDoS 檢測(cè)模塊,實(shí)現(xiàn)部分DDoS 防御邏輯,從而實(shí)現(xiàn)DDoS防御。
對(duì)HTTP Slow DDoS 攻擊而言, 由于其原理為通過(guò)保持連接來(lái)消耗云平臺(tái)中目標(biāo)服務(wù)器的線程資源,因此當(dāng)目標(biāo)為多線程驅(qū)動(dòng)架構(gòu)的BIO(同步阻塞式IO,為每個(gè)連接開(kāi)啟一個(gè)線程)服務(wù)器,比如Apache 時(shí), 容易受到攻擊影響。 事件驅(qū)動(dòng)架構(gòu)的NIO(同步非阻塞式IO,在每個(gè)請(qǐng)求事件到達(dá)時(shí)選擇相應(yīng)socket)服務(wù)器,則不容易被攻擊造成影響,所以可以盡量選擇事件驅(qū)動(dòng)架構(gòu)的Web 服務(wù)器。同時(shí),還可以通過(guò)增大并發(fā)線程數(shù)和增大發(fā)送緩沖區(qū)來(lái)減小攻擊帶來(lái)的影響。
最有效的防御方式是及時(shí)斷開(kāi)超時(shí)連接。 同時(shí)為了防止攻擊者使用同一IP 不斷嘗試建立連接,還應(yīng)該建立并維護(hù)針對(duì)其的IP 黑名單來(lái)進(jìn)行訪問(wèn)控制。 而由于SDN 網(wǎng)絡(luò)的特性,訪問(wèn)控制列表的下發(fā)可由SDN 控制器代為完成。
若由目標(biāo)服務(wù)器自身同時(shí)負(fù)責(zé)連接的超時(shí)檢測(cè)和訪問(wèn)控制,則在發(fā)生HTTP Slow DDoS 攻擊時(shí),由于還要負(fù)責(zé)根據(jù)攻擊數(shù)據(jù)包IP 來(lái)修改和維護(hù)訪問(wèn)控制列表,過(guò)多的連接會(huì)使服務(wù)器產(chǎn)生很大壓力,同時(shí)因?yàn)樵破脚_(tái)內(nèi)部的帶寬遠(yuǎn)小于網(wǎng)絡(luò)節(jié)點(diǎn)與外部網(wǎng)絡(luò)連接的帶寬,攻擊數(shù)據(jù)包產(chǎn)生的流量也會(huì)影響目標(biāo)服務(wù)器的性能。 此防御策略的消息傳遞過(guò)程如圖2 所示。
圖2 中,1,2,3 為目標(biāo)服務(wù)器向SDN 控制器傳遞的攻擊IP 列表,4 為SDN 控制器下發(fā)的訪問(wèn)控制列表。
圖2 消息傳遞過(guò)程圖
在基于OpenStack 的云平臺(tái)中搭建一臺(tái)Apache目標(biāo)服務(wù)器作為被攻擊服務(wù)器,搭建Windows10 主機(jī)模擬訪問(wèn)目標(biāo)服務(wù)器的正常用戶,并使用Docker swarm 和selenium 來(lái)模擬多臺(tái)“肉雞”客戶端同時(shí)攻擊的場(chǎng)景。 其部署示意圖如圖3 所示。
圖3 部署示意圖
在攻擊者和服務(wù)器之間先建立TCP 連接并發(fā)送畸形HTTP 首包,然后通過(guò)不斷發(fā)送HTTP 頭中的鍵值對(duì)來(lái)保持連接。
編寫腳本代碼,代碼啟動(dòng)了2 000 個(gè)線程來(lái)同時(shí)連接目標(biāo)服務(wù)器,由于目標(biāo)服務(wù)器默認(rèn)的最大線程數(shù)為1 024,因此全部線程資源被攻擊者占用。 在每個(gè)連接中,攻擊者首先向服務(wù)器發(fā)送一個(gè)畸形的HTTP首包。 該首包沒(méi)有表示結(jié)束的 (即0d0a0d0a),因此服務(wù)器認(rèn)為該包沒(méi)有接收完畢。 攻擊者每隔5 s 向服務(wù)器發(fā)送一個(gè)鍵值對(duì)。 服務(wù)器認(rèn)為這是首包中未接收完畢的屬性值,因此會(huì)繼續(xù)接收,保持占用連接線程。
每個(gè)TCP 連接在建立后,都在不斷接收數(shù)據(jù),從而使線程一直被占用。 同時(shí)使用其他機(jī)器訪問(wèn)該云平臺(tái)的Web 頁(yè)面,結(jié)果服務(wù)器無(wú)響應(yīng),攻擊成功。當(dāng)攻擊結(jié)束后,頁(yè)面恢復(fù)正常訪問(wèn),由此可以驗(yàn)證該攻擊實(shí)現(xiàn)方式的有效性。
在攻擊者和服務(wù)器之間先建立TCP 連接并在首包中定義很大的Content-Length, 然后通過(guò)不斷發(fā)送數(shù)據(jù)來(lái)保持連接。
編寫腳本代碼,代碼啟動(dòng)了2 000 個(gè)線程來(lái)同時(shí)連接目標(biāo)服務(wù)器,由于目標(biāo)服務(wù)器默認(rèn)的最大線程數(shù)為1 024,因此全部線程資源被攻擊者占用。 在每個(gè)連接中,攻擊者首先向服務(wù)器發(fā)送一個(gè)HTTP首包,其中增加了一個(gè)屬性鍵值對(duì)Content-Length:8 192,其表示接下來(lái)會(huì)收到長(zhǎng)度為8 192 B 的數(shù)據(jù),這樣服務(wù)器就會(huì)一直保持連接直到收到相應(yīng)長(zhǎng)度的數(shù)據(jù)。 攻擊者每隔5 s 向服務(wù)器發(fā)送1 B 數(shù)據(jù)以保持占用連接線程。
每個(gè)TCP 連接在建立后,都不斷接收數(shù)據(jù),從而使線程一直被占用。 同時(shí)使用其他機(jī)器訪問(wèn)該云平臺(tái)的Web 頁(yè)面,結(jié)果服務(wù)器無(wú)響應(yīng),攻擊成功。當(dāng)攻擊結(jié)束后,頁(yè)面恢復(fù)正常訪問(wèn),由此可以驗(yàn)證該攻擊實(shí)現(xiàn)方式的有效性。
在攻擊者和服務(wù)器之間先建立TCP 連接,向服務(wù)器請(qǐng)求非常大的資源,然后通過(guò)在接收端設(shè)置很小的滑動(dòng)窗口值,使其每次只能接收很小一部分?jǐn)?shù)據(jù),這樣服務(wù)器就會(huì)保持連接來(lái)不斷發(fā)送數(shù)據(jù)。
編寫腳本代碼,代碼啟動(dòng)了2 000 個(gè)線程來(lái)同時(shí)連接目標(biāo)服務(wù)器,由于目標(biāo)服務(wù)器默認(rèn)的最大線程數(shù)為1 024,因此全部線程資源被攻擊者占用。 在每個(gè)連接中,攻擊者首先將每個(gè)socket 連接的TCP滑動(dòng)窗口(即socket 接受緩沖區(qū)大小)設(shè)為1 024 B,然后向服務(wù)器發(fā)送一個(gè)GET 請(qǐng)求以請(qǐng)求其中較大的資源(本測(cè)試中為一張1.2 MB 的圖片)。 這樣服務(wù)器在接到該請(qǐng)求后,就會(huì)向請(qǐng)求端返回?cái)?shù)據(jù),由于請(qǐng)求端緩存很小,則在緩存滿后,請(qǐng)求端就會(huì)向服務(wù)器發(fā)送TCP ZeroWindow 包以告知服務(wù)器等待,直到緩沖區(qū)被讀出后才繼續(xù)接收。 設(shè)置攻擊者每隔5 s 讀一次緩沖區(qū),以保持對(duì)連接線程的占用。
可以看出,每個(gè)TCP 連接在發(fā)送數(shù)據(jù)時(shí),總是會(huì)接到ZeroWindow 包,被迫等待重發(fā),同時(shí)由于請(qǐng)求的資源較大,從而使線程一直被占用。 同時(shí)使用其他機(jī)器訪問(wèn)該云平臺(tái)的Web 頁(yè)面,結(jié)果服務(wù)器無(wú)響應(yīng),攻擊成功。 當(dāng)攻擊結(jié)束后,頁(yè)面恢復(fù)正常訪問(wèn),由此可以驗(yàn)證該攻擊實(shí)現(xiàn)方式的有效性。
上述三次試驗(yàn),驗(yàn)證了HTTP Slow DDoS 的攻擊機(jī)理和三種攻擊方式的實(shí)現(xiàn),達(dá)到了預(yù)期的攻擊效果,即正常用戶無(wú)法對(duì)目標(biāo)服務(wù)器進(jìn)行訪問(wèn)。
根據(jù)云平臺(tái)的架構(gòu),在對(duì)云平臺(tái)中目標(biāo)服務(wù)器進(jìn)行訪問(wèn)的過(guò)程中,用戶和攻擊者發(fā)送的應(yīng)用請(qǐng)求和攻擊流量都會(huì)經(jīng)過(guò)云平臺(tái)中的網(wǎng)絡(luò)節(jié)點(diǎn), 在OpenStack 云平臺(tái)中,即部署了Neutron 組件的節(jié)點(diǎn)。因?yàn)榇蟛糠衷破脚_(tái)都使用SDN 來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)結(jié)構(gòu)的集中控制,所以一般會(huì)在網(wǎng)絡(luò)節(jié)點(diǎn)上部署SDN控制器。 因此,可由目標(biāo)服務(wù)器來(lái)判斷超時(shí)連接,并由網(wǎng)絡(luò)節(jié)點(diǎn)來(lái)進(jìn)行訪問(wèn)控制。 具體實(shí)現(xiàn)方法為:由目標(biāo)服務(wù)器所在的計(jì)算節(jié)點(diǎn)調(diào)用SDN 應(yīng)用層API,每隔一段時(shí)間就將超時(shí)連接的IP 地址發(fā)送給網(wǎng)絡(luò)節(jié)點(diǎn)中的SDN 控制器,并通過(guò)SDN 控制器來(lái)對(duì)網(wǎng)絡(luò)節(jié)點(diǎn)中負(fù)責(zé)流量轉(zhuǎn)發(fā)的OVS 下發(fā)訪問(wèn)控制列表。 這樣就可以在實(shí)現(xiàn)訪問(wèn)控制阻斷IP功能的前提下減輕目標(biāo)服務(wù)器的負(fù)擔(dān),使其保持工作效率。
通過(guò)使用以上防御方法,在目標(biāo)服務(wù)器所在的計(jì)算節(jié)點(diǎn)設(shè)定連接超時(shí)的閾值為3 s,超過(guò)3 s 則斷開(kāi)連接,同時(shí)對(duì)超時(shí)連接的IP 進(jìn)行記錄,并每隔3 s檢查記錄。若記錄不為空,則將記錄通過(guò)調(diào)用SDN 控制器的北向接口API 發(fā)送給網(wǎng)絡(luò)節(jié)點(diǎn)上的SDN 控制器,同時(shí)清空計(jì)算節(jié)點(diǎn)中的記錄。而SDN 控制器則將其收到的IP 下發(fā)添加到OVS 的訪問(wèn)控制列表中。
在以上設(shè)置部署完成之后再次嘗試攻擊。 由于服務(wù)器會(huì)及時(shí)斷掉超時(shí)連接,釋放線程,因此正常請(qǐng)求很快可成功建立連接,防御成功。 整體試驗(yàn)結(jié)果如表1 所示。
表1 試驗(yàn)結(jié)果表
防御策略驗(yàn)證的結(jié)果表明:正確部署文中的防御策略,可以對(duì)HTTP Slow DDoS 攻擊進(jìn)行有效的防御。
在云服務(wù)日漸普及的今天,其面臨的威脅與日俱增,因此云端服務(wù)器安全更需要受到重視。本文通過(guò)對(duì)HTTP Slow DDoS 攻擊的幾種實(shí)現(xiàn)手段進(jìn)行分析,并利用Python 對(duì)攻擊進(jìn)行實(shí)現(xiàn),同時(shí)搭建云平臺(tái)測(cè)試目標(biāo)服務(wù)器來(lái)驗(yàn)證攻擊的可行性,進(jìn)一步展示了這種攻擊所造成的危害。 最后提出了對(duì)應(yīng)的防御策略,為云平臺(tái)后端開(kāi)發(fā)人員、云平臺(tái)及服務(wù)器的安全維護(hù)和管理人員進(jìn)一步加強(qiáng)安全策略配置,降低遭受HTTP Slow DDoS 攻擊的可能性提供參考。 本文中的防御策略也可以應(yīng)用在基于其他架構(gòu)的云平臺(tái)上,提高云計(jì)算行業(yè)整體安全性,尤其是在HTTP Slow DDoS 攻擊方面的防御能力。