白翼銘,燕 瑋,許鳳凱,郝 帥,范春雷
(華北計算機系統工程研究所,北京100083)
近年來,云計算的概念逐漸普及,同時其面臨的威脅也與日俱增。由于現在云服務的應用越來越廣泛,基于B/S 架構的網頁應用形式逐漸代替傳統桌面應用,部署在云平臺上的Web 應用越來越多,導致部署在云平臺上的Web 服務器逐漸成為攻擊者的目標,因此對其防御策略的研究迫在眉睫[1]。而對攻擊者而言, 對云平臺中提供網頁服務的Web服務器進行HTTP Slow DDoS 攻擊是一種非常有效的攻擊手段。 針對這一問題,本文通過對HTTP Slow DDoS 攻擊的模擬和研究, 提出了相應的防御策略并對其有效性進行驗證。
HTTP Slow DDoS 攻擊也叫慢連接攻擊,屬于應用層DDoS 攻擊。
分布式拒絕服務攻擊(Distributed Denial of Service,DDoS)通過控制大量“肉雞”,向目標網絡或設備發送大量數據或建立連接,以耗盡目標各種資源的方式使目標無法向正常的用戶請求進行應答或提供服務,從而達到拒絕服務的目的[2-3]。
超文本傳輸協議(Hyper Text Transfer Protocol,HTTP)的 常 用 請 求 包 括GET 和POST 兩 種。 GET 請求用于從服務器獲取資源,如請求數據、下載文件等;POST 請求則用于向服務器提交數據,如輸入的用戶名密碼、發布的內容等。HTTP 請求一般是無狀態的,即每次請求都會建立連接,同時在請求結束后斷開該連接。
攻擊者利用HTTP 協議的正常交互機制,先與云平臺中的目標服務器(本文中為Web 服務器)建立一個連接,然后通過向服務器不斷發送或請求內容,長時間保持該連接不釋放。 云平臺目標服務器在處理HTTP 請求的過程中,只能同時和有限的用戶保持連接,大于最大連接數的用戶請求將被丟棄,如果攻擊者與云平臺目標服務器建立大量這樣的連接,就會耗盡其并發連接數資源,使其無法提供正常頁面及服務[4],即所謂的HTTP Slow DDoS 攻擊。
與Flood 攻擊的方法不同,慢連接攻擊不需要同時發出大量請求。 其攻擊的不是服務器的帶寬或計算資源,而是硬件資源,即服務器的并發線程數量。由于每一個請求都會啟動一個線程,而在請求結束之前線程會被阻塞,因此在服務器建立了大量連接,導致線程無法被釋放,服務器的最大連接線程數很快會被耗盡,其他用戶的正常請求就無法與服務器建立連接,從而完成攻擊[5-6]。
HTTP Slow DDoS 有三種實現方法,分別對應在HTTP 請求連接中傳遞數據的三個過程:客戶端發送/服務器接收HTTP 頭部、客戶端發送/服務器接收數據、服務器返回/客戶端接收Response 數據。 其分 別 對 應 的 攻 擊 為 Slow headers、Slow body、Slow read[7]。 攻擊過程如圖1 所示。
Slow headers 也 稱 為Slowloris 攻 擊。 Web 應 用 在處理HTTP 請求之前都要先接收完所有的HTTP 頭部,因為HTTP 頭部中包含了一些Web 應用可能用到的重要信息。 HTTP 協議規定,HTTP Request 以 (0d0a0d0a)結尾表示客戶端發送結束,服務端開始處理。攻擊者在HTTP 請求頭中將Connection 設置為Keep-Alive,要求服務器保持TCP 連接不斷開,并在末尾不添加 ,隨后緩慢地隔一段時間發送一個模仿HTTP 頭部屬性的key-value 格式數據,如a:b , 導致服務器認為HTTP 頭部沒有接收完成而一直等待,連接線程一直被占用。

圖1 HTTP Slow DDoS 攻擊過程圖
Slow body 也叫Slow POST 攻擊,是Slowloris 攻擊的變種。 攻擊者構造并發送一個HTTP POST 請求,并將該請求頭部的Content-Length 值設置很大, 使服務器認為客戶端要發送大的數據。 服務器會保持連接準備接收數據,但攻擊者每次只發送很少量的數據, 服務器因為沒有接收到相應Content-Length 的數據而持續等待客戶端, 使該連接一直保持存活,線程一直被阻塞。
與前兩種通過客戶端不斷向服務器發送數據來保持連接的方法相反,Slow read 攻擊通過使服務器不斷向客戶端發送數據來保持連接。 客戶端與服務器建立連接,并發送一個完整的HTTP 請求,然后在服務器向客戶端返回數據時,攻擊者通過如給客戶端設置很小的緩沖區等方式,使客戶端以很低的速度讀取Response。 客戶端長時間未讀取數據,會發送TCP ZeroWindow 到服務器,讓服務器誤以為客戶端很忙,直到連接快超時前才讀取少量數據,使該連接一直保持存活,線程一直被阻塞。 在使用這種攻擊方法時,必須要保證請求的資源足夠大,至少遠大于服務器的發送緩沖區,使服務器始終保持線程,不斷將資源放入發送緩沖區中,否則服務器將資源放入緩沖區后就會釋放線程,無法達到消耗線程資源的目的。
在云計算領域,諸多商業公司選擇利用現有的開源云平臺進行二次開發,其中OpenStack 在各方面與其他開源云對比都處于優勢,如社區人數多,市場占有率高,因此進行二次開發的云平臺多數都是以OpenStack 為基礎,例如RedHat 云、華為云等。OpenStack 架構的主體為計算服務、網絡服務、存儲服務,分別由各組件實現,組件間松耦合性高,配置較為靈活,被廣泛應用于云服務的搭建,使其成為了攻擊者的重要目標。 因此針對OpenStack 云平臺的HTTP Slow DDoS 防御研究迫在眉睫[8]。
云平臺的網絡節點會將攻擊請求和流量路由轉發到云平臺中的目標服務器。 在對云平臺的訪問過程中,用戶和攻擊者發送的應用請求和攻擊流量通過互聯網到達云服務訪問接入點。 云服務訪問接入點是布置云平臺DDoS 防御的第一道防線。 具體而言,可在云服務訪問接入點部署云防火墻、入侵防御系統等,對所有進入云數據中心的請求和流量進行監控。
請求和流量經過云服務訪問接入點后到達云平臺的內部網絡,在該部分需要防御傳統網絡中的網絡層DDoS 攻擊,以及針對SDN(軟件定義網絡)引入的控制層DDoS 攻擊、數據層Flood DDoS攻擊、數據層Slow DDoS 攻擊等。 控制層是云平臺內部網絡DDoS 防御的核心,針對不同的DDoS 防御需求,網絡管理人員可以將流量管理策略,如訪問控制、流量分析、負載均衡等,封裝成應用層獨立的應用,指導控制層處理全局網絡流量,也可直接在網絡節點的SDN 控制器中集成統一DDoS 檢測模塊,實現部分DDoS 防御邏輯,從而實現DDoS防御。
對HTTP Slow DDoS 攻擊而言, 由于其原理為通過保持連接來消耗云平臺中目標服務器的線程資源,因此當目標為多線程驅動架構的BIO(同步阻塞式IO,為每個連接開啟一個線程)服務器,比如Apache 時, 容易受到攻擊影響。 事件驅動架構的NIO(同步非阻塞式IO,在每個請求事件到達時選擇相應socket)服務器,則不容易被攻擊造成影響,所以可以盡量選擇事件驅動架構的Web 服務器。同時,還可以通過增大并發線程數和增大發送緩沖區來減小攻擊帶來的影響。
最有效的防御方式是及時斷開超時連接。 同時為了防止攻擊者使用同一IP 不斷嘗試建立連接,還應該建立并維護針對其的IP 黑名單來進行訪問控制。 而由于SDN 網絡的特性,訪問控制列表的下發可由SDN 控制器代為完成。
若由目標服務器自身同時負責連接的超時檢測和訪問控制,則在發生HTTP Slow DDoS 攻擊時,由于還要負責根據攻擊數據包IP 來修改和維護訪問控制列表,過多的連接會使服務器產生很大壓力,同時因為云平臺內部的帶寬遠小于網絡節點與外部網絡連接的帶寬,攻擊數據包產生的流量也會影響目標服務器的性能。 此防御策略的消息傳遞過程如圖2 所示。
圖2 中,1,2,3 為目標服務器向SDN 控制器傳遞的攻擊IP 列表,4 為SDN 控制器下發的訪問控制列表。

圖2 消息傳遞過程圖
在基于OpenStack 的云平臺中搭建一臺Apache目標服務器作為被攻擊服務器,搭建Windows10 主機模擬訪問目標服務器的正常用戶,并使用Docker swarm 和selenium 來模擬多臺“肉雞”客戶端同時攻擊的場景。 其部署示意圖如圖3 所示。

圖3 部署示意圖
在攻擊者和服務器之間先建立TCP 連接并發送畸形HTTP 首包,然后通過不斷發送HTTP 頭中的鍵值對來保持連接。
編寫腳本代碼,代碼啟動了2 000 個線程來同時連接目標服務器,由于目標服務器默認的最大線程數為1 024,因此全部線程資源被攻擊者占用。 在每個連接中,攻擊者首先向服務器發送一個畸形的HTTP首包。 該首包沒有表示結束的 (即0d0a0d0a),因此服務器認為該包沒有接收完畢。 攻擊者每隔5 s 向服務器發送一個鍵值對。 服務器認為這是首包中未接收完畢的屬性值,因此會繼續接收,保持占用連接線程。
每個TCP 連接在建立后,都在不斷接收數據,從而使線程一直被占用。 同時使用其他機器訪問該云平臺的Web 頁面,結果服務器無響應,攻擊成功。當攻擊結束后,頁面恢復正常訪問,由此可以驗證該攻擊實現方式的有效性。
在攻擊者和服務器之間先建立TCP 連接并在首包中定義很大的Content-Length, 然后通過不斷發送數據來保持連接。
編寫腳本代碼,代碼啟動了2 000 個線程來同時連接目標服務器,由于目標服務器默認的最大線程數為1 024,因此全部線程資源被攻擊者占用。 在每個連接中,攻擊者首先向服務器發送一個HTTP首包,其中增加了一個屬性鍵值對Content-Length:8 192,其表示接下來會收到長度為8 192 B 的數據,這樣服務器就會一直保持連接直到收到相應長度的數據。 攻擊者每隔5 s 向服務器發送1 B 數據以保持占用連接線程。
每個TCP 連接在建立后,都不斷接收數據,從而使線程一直被占用。 同時使用其他機器訪問該云平臺的Web 頁面,結果服務器無響應,攻擊成功。當攻擊結束后,頁面恢復正常訪問,由此可以驗證該攻擊實現方式的有效性。
在攻擊者和服務器之間先建立TCP 連接,向服務器請求非常大的資源,然后通過在接收端設置很小的滑動窗口值,使其每次只能接收很小一部分數據,這樣服務器就會保持連接來不斷發送數據。
編寫腳本代碼,代碼啟動了2 000 個線程來同時連接目標服務器,由于目標服務器默認的最大線程數為1 024,因此全部線程資源被攻擊者占用。 在每個連接中,攻擊者首先將每個socket 連接的TCP滑動窗口(即socket 接受緩沖區大小)設為1 024 B,然后向服務器發送一個GET 請求以請求其中較大的資源(本測試中為一張1.2 MB 的圖片)。 這樣服務器在接到該請求后,就會向請求端返回數據,由于請求端緩存很小,則在緩存滿后,請求端就會向服務器發送TCP ZeroWindow 包以告知服務器等待,直到緩沖區被讀出后才繼續接收。 設置攻擊者每隔5 s 讀一次緩沖區,以保持對連接線程的占用。
可以看出,每個TCP 連接在發送數據時,總是會接到ZeroWindow 包,被迫等待重發,同時由于請求的資源較大,從而使線程一直被占用。 同時使用其他機器訪問該云平臺的Web 頁面,結果服務器無響應,攻擊成功。 當攻擊結束后,頁面恢復正常訪問,由此可以驗證該攻擊實現方式的有效性。
上述三次試驗,驗證了HTTP Slow DDoS 的攻擊機理和三種攻擊方式的實現,達到了預期的攻擊效果,即正常用戶無法對目標服務器進行訪問。
根據云平臺的架構,在對云平臺中目標服務器進行訪問的過程中,用戶和攻擊者發送的應用請求和攻擊流量都會經過云平臺中的網絡節點, 在OpenStack 云平臺中,即部署了Neutron 組件的節點。因為大部分云平臺都使用SDN 來實現網絡結構的集中控制,所以一般會在網絡節點上部署SDN控制器。 因此,可由目標服務器來判斷超時連接,并由網絡節點來進行訪問控制。 具體實現方法為:由目標服務器所在的計算節點調用SDN 應用層API,每隔一段時間就將超時連接的IP 地址發送給網絡節點中的SDN 控制器,并通過SDN 控制器來對網絡節點中負責流量轉發的OVS 下發訪問控制列表。 這樣就可以在實現訪問控制阻斷IP功能的前提下減輕目標服務器的負擔,使其保持工作效率。
通過使用以上防御方法,在目標服務器所在的計算節點設定連接超時的閾值為3 s,超過3 s 則斷開連接,同時對超時連接的IP 進行記錄,并每隔3 s檢查記錄。若記錄不為空,則將記錄通過調用SDN 控制器的北向接口API 發送給網絡節點上的SDN 控制器,同時清空計算節點中的記錄。而SDN 控制器則將其收到的IP 下發添加到OVS 的訪問控制列表中。
在以上設置部署完成之后再次嘗試攻擊。 由于服務器會及時斷掉超時連接,釋放線程,因此正常請求很快可成功建立連接,防御成功。 整體試驗結果如表1 所示。

表1 試驗結果表
防御策略驗證的結果表明:正確部署文中的防御策略,可以對HTTP Slow DDoS 攻擊進行有效的防御。
在云服務日漸普及的今天,其面臨的威脅與日俱增,因此云端服務器安全更需要受到重視。本文通過對HTTP Slow DDoS 攻擊的幾種實現手段進行分析,并利用Python 對攻擊進行實現,同時搭建云平臺測試目標服務器來驗證攻擊的可行性,進一步展示了這種攻擊所造成的危害。 最后提出了對應的防御策略,為云平臺后端開發人員、云平臺及服務器的安全維護和管理人員進一步加強安全策略配置,降低遭受HTTP Slow DDoS 攻擊的可能性提供參考。 本文中的防御策略也可以應用在基于其他架構的云平臺上,提高云計算行業整體安全性,尤其是在HTTP Slow DDoS 攻擊方面的防御能力。