肖 敏
(綿陽師范學院信息工程學院,四川綿陽 621006)
隨著技術(shù)的進步,云計算使得服務提供商可以按需將基礎(chǔ)設施、平臺和軟件等預期服務租賃給云用戶.云用戶可以從云上租賃服務,并在需求得到滿足后將其釋放回云.與傳統(tǒng)數(shù)據(jù)中心相比,云計算帶來了許多好處,如高靈活性(按需、自助服務)、快速響應、資源彈性伸縮、更高的資源利用率和更低運營成本等.
根據(jù)IDC(國際數(shù)據(jù)公司)的一項相關(guān)調(diào)查,安全問題是采用云計算的首要挑戰(zhàn)[1].作為當今最常見的互聯(lián)網(wǎng)攻擊之一DoS(拒絕服務)和DDoS(分布式拒絕服務)的主要攻擊目的是通過耗盡系統(tǒng)資源來損害其提供預期服務的能力.Cisco 2014年度安全報告將DDoS攻擊的影響程度認定為嚴重[2].DDoS攻擊大致可分為三類[3]:
1)基于卷的DDoS攻擊:當大量此類流量被指向服務器時,這些攻擊會影響服務器.例如ICMP Flood和UDP Flood攻擊.
2)基于協(xié)議的DDoS攻擊:這些攻擊使用特定的Internet協(xié)議來消耗服務器的資源.例如TCP-SYN Flood攻擊和Ping死亡攻擊.
3)基于應用程序的DDoS攻擊:這些攻擊針對Internet應用程序的弱點.它也被稱為應用層攻擊.例如Slowloris攻擊和DNS放大攻擊.
其中TCP-SYN Flood是最常見的DDoS攻擊,根據(jù)卡巴斯基2018年第四季度的統(tǒng)計報告,TCP-SYN Flood占總攻擊的50%以上[4].TCP-SYN Flood攻擊同時也是云上最常見的三種攻擊之一[5].
TCP-SYN Flood是一種基于協(xié)議的DDoS攻擊,TCP連接是由導致漏洞的三次握手TCP技術(shù)啟動的.攻擊者向目標系統(tǒng)發(fā)送連續(xù)的SYN請求,試圖消耗足夠的服務器資源,使系統(tǒng)對合法流量無法響應.正常的TCP連接需要三次握手.首先,客戶端通過向服務器發(fā)送SYN包來請求連接.然后,服務器通過將SYN-ACK發(fā)送回客服端來確認此請求.最后,客戶端用ACK報響應并完成連接的建立[6].如果客戶端沒有用預期的ACK消息響應服務器,比如惡意客戶端可以簡單地不發(fā)送預期的ACK,或者通過欺騙SYN中的源IP地址導致服務器將SYN-ACK發(fā)送到偽造的IP地址.那么服務器沒有收到ACK消息,則等待超時.在等待超時的過程中,半連接狀態(tài)保持在[7]一個空間有限的緩沖隊列中.如果發(fā)送到服務器的大量SYN包沒有響應,則會持續(xù)消耗服務器上的資源,最終可能超過服務器的能力,從而導致服務器無法連接到合法的客戶端,甚至導致服務器系統(tǒng)崩潰[8].
R.Shea和J.Liu在虛擬化方面的研究表明[9],虛擬機的性能在DDoS攻擊下比在具有相同資源量的非虛擬化系統(tǒng)上的性能下降更嚴重.由于虛擬化是云計算的核心,這意味著云中的虛擬機和相關(guān)服務比傳統(tǒng)系統(tǒng)更容易受到DDoS攻擊.在多租戶環(huán)境中,攻擊者不僅可以來自外部也可能從云中租用資源對其他租戶的虛擬機發(fā)起攻擊.特別是部署為IaaS的云環(huán)境中內(nèi)部惡意租戶的攻擊可能導致同一共享環(huán)境中的所有虛擬機都會受到影響[10].因此,檢測并阻止此類攻擊變得極為重要.
本文重點研究了基于異常檢測器的虛擬云環(huán)境下SYN Flood攻擊的檢測方法,嘗試通過流表編程實現(xiàn)流表引導,通過插入分析器、探頭和限速器嘗試根據(jù)預定義策略模板和包統(tǒng)計數(shù)據(jù)觸發(fā)啟動防御系統(tǒng),針對性限速以削弱DDoS攻擊對于系統(tǒng)性能的影響.在實驗系統(tǒng)中使用模擬攻擊初步測試評價該方案的作用效果.
為了檢測網(wǎng)絡中的DoS攻擊,通常使用入侵檢測系統(tǒng)(IDS).IDS是部署在網(wǎng)絡或主機上的高級安全機制,用于檢測DoS攻擊、特洛伊木馬和Internet蠕蟲等惡意活動.IDS在檢測過程中使用基于簽名或異常的方法.基于特征的IDS需要一個已知攻擊特征和模式的數(shù)據(jù)庫才能檢測到攻擊.開源Snort[11]是一種常見的基于簽名的IDS,Lonua等人對此進行了實驗[12].然而,這些方法通常應用于傳統(tǒng)非云化的網(wǎng)絡中,在云計算等具有動態(tài)資源的大型網(wǎng)絡中,存在檢測延遲大、計算成本高等缺點,很難具有部署成本優(yōu)勢.
另一方面,基于異常的IDS使用統(tǒng)計或機器學習方法來檢測攻擊,并且與基于特征的IDS相比具有優(yōu)勢,因為它們能夠在沒有攻擊信息和經(jīng)驗的情況下檢測新的攻擊.Gupta等人[13]提出了一個基于概要文件的網(wǎng)絡入侵防御系統(tǒng)(NIPS)來保護云環(huán)境.相關(guān)研究應用了基于TCP SYN包數(shù)檢測SYN Flood攻擊的方法[14],將特定間隔內(nèi)超過預定義閾值的SYN包數(shù)被視為攻擊.其研究結(jié)果表明,該方法能夠很好地檢測SYN Flood攻擊.然而,這種靜態(tài)方式不具備動態(tài)調(diào)節(jié)能力,會導致不同規(guī)格的云主機受到相等的對待.
DongHyuk Kim等人[15]針對這一問題,提出了一種利用TCP超時機制和分組往返時間(RTT)來更簡單有效地防御SYN洪泛攻擊的技術(shù).其思想是,如果正常的TCP發(fā)送方在超時之前沒有從接收方接收到SYN/ACK包,則它會重新傳輸SYN包,而攻擊者通常不會重新傳輸SYN包.其方案采用丟棄來自任何TCP發(fā)送方的第一個SYN包.如果交換機接收到重新傳輸?shù)腟YN,則認為SYN是從普通用戶發(fā)送的,并將SYN轉(zhuǎn)發(fā)給預期的接收方.但這種方式需要預先啟動而非按一定的系統(tǒng)指標來觸發(fā),在無攻擊的場景下并不友好.
虛擬化改變了目前的計算方式,許多數(shù)據(jù)中心完全虛擬化,以便在災難恢復期間提供快速資源調(diào)配、向云端溢出并提高可用性.在2013年虛擬機的數(shù)量已經(jīng)超過了服務器的數(shù)量,并且進一步的虛擬化沒有停止的跡象[16].服務器虛擬化的興起帶來了數(shù)據(jù)中心網(wǎng)絡的根本轉(zhuǎn)變.一個新的網(wǎng)絡訪問層已經(jīng)出現(xiàn),其中大多數(shù)網(wǎng)絡端口是虛擬的,而不是物理的[17],這就導致數(shù)據(jù)包轉(zhuǎn)發(fā)的第一級交換機越來越多地駐留在Hypervisor中.在早期,這些Hypervisor的虛擬交換機(vSwitches)主要負責提供基本的網(wǎng)絡連接.但隨著虛擬化負載的激增,這種方法的局限性也變得越來越明顯:虛擬化的負載與物理網(wǎng)絡的耦合嚴重限制了其移動性、擴展性和快速資源調(diào)配能力.
隨著以Openstack為代表的開源云平臺的廣泛部署,其默認使用的虛擬交換機組件Openvswitch在虛擬化的數(shù)據(jù)中心網(wǎng)絡中承擔了狀態(tài)防火墻等更為復雜的功能[18].在這種虛擬交換機中,主要由兩個組件構(gòu)成:第一個是ovs-vswitchd,它是一個用戶空間守護進程,它也是處理數(shù)據(jù)包的慢速通道;另一個組件則是負責Datapath的內(nèi)核模塊(Kernel Module),它是處理數(shù)據(jù)包的快速通道.圖1描述了這兩個主要組件如何協(xié)同工作來轉(zhuǎn)發(fā)數(shù)據(jù)包.內(nèi)核模塊首先從物理NIC或VM的虛擬NIC接收數(shù)據(jù)包,ovs-vswitchd已經(jīng)明確指示內(nèi)核模塊如何處理這種類型的數(shù)據(jù)包時,內(nèi)核模塊只需遵循ovs-vswitchd給出的稱為actions的指令完成轉(zhuǎn)發(fā).該指令列出了傳輸數(shù)據(jù)包的物理端口,虛擬端口或者隧道,同時actions還可以指定修改、抽樣或丟棄數(shù)據(jù)包等動作.如果內(nèi)核模塊沒有被告知如何處理數(shù)據(jù)包,它會將其傳遞給ovs-vswitchd組件.在用戶空間中,ovs-vswitchd確定如何處理數(shù)據(jù)包,然后將數(shù)據(jù)包以及所需的處理方式傳遞回內(nèi)核模塊.通常,ovs-vswitchd還會通知內(nèi)核模塊緩存actions,以處理類似的未來數(shù)據(jù)包[19].
圖1 Openvswitch數(shù)據(jù)包轉(zhuǎn)發(fā)示意圖
復雜的帶有狀態(tài)的網(wǎng)絡應用需要可以實現(xiàn)連接跟蹤的狀態(tài)機.它需要匹配到更精細的報文字段,包括源和目的IP地址,協(xié)議號,源和目的端口號,TCP標記位,以完成所需的連接跟蹤.在這種模式下,任何TCP-SYN Flood攻擊的數(shù)據(jù)包都會被快速通道的內(nèi)核模塊認為是一條新流,而需要上送到用戶態(tài)ovs-vswitchd進行轉(zhuǎn)發(fā)規(guī)則計算,因此在發(fā)生SYN Flood攻擊時,openvswitch會因攻擊產(chǎn)生過多的資源消耗而難以響應其他正常虛擬機的業(yè)務請求.
本文所研究的系統(tǒng)在相關(guān)研究的基礎(chǔ)上,在云環(huán)境中實現(xiàn)了動態(tài)的TCP-SYN Flood防御,其核心思想包括IP/MAC地址欺騙防護以及基于預定義閥值的SYN包攻擊防護,目標是既能夠有效的防御修改源IP/MAC地址的SYN Flood攻擊,也能夠?qū)崿F(xiàn)根據(jù)系統(tǒng)指標和閥值進行動態(tài)防護.如圖2所示,該系統(tǒng)部署于Hypervisor,利用Openvswitch、分析器、探頭和限速器三個組件的聯(lián)動.通過對Openvswitch的多級流表編程實現(xiàn)SYN包的統(tǒng)計和IP/MAC源地址欺騙的防護.分析器負責根據(jù)SYN包統(tǒng)計信息和防護閥值以及Openvswitch的資源使用率等信息決策是否觸發(fā)探頭采樣,分析器也負責對采樣結(jié)果進行分析并根據(jù)分析結(jié)果決定是否觸發(fā)限速器進行限速.
圖2 實驗系統(tǒng)結(jié)構(gòu)
我們使用Openvswitch的多級流表來實現(xiàn)相關(guān)的轉(zhuǎn)發(fā)業(yè)務、SYN包統(tǒng)計、以及IP/MAC欺騙防護.圖4為Openvswitch的流表設計.
圖4 分析器的工作流程
SYN包統(tǒng)計位于Openvswitch Table 8中,針對每個虛擬機端口增加一條用來匹配TCP SYN包的流表,如下所示:
ovs-ofctl add-flow br0 "table=8,priority=100,in_port= tap4a2f334c-03,eth,ip,tcp,tcp_flags=+syn,actions=resubmit(,9)"
當虛擬機SYN包進入Openvswitch并命中此流表后,就可以獲取到此流表被命中的統(tǒng)計值,從而得到該虛擬機發(fā)送的SYN包數(shù)量.
其中IP/MAC欺騙防護位于table7,流表將檢查虛擬機的IP,MAC地址和入接口的匹配關(guān)系,如果不匹配則會丟棄數(shù)據(jù)包,從而可以防止虛擬機內(nèi)部通過IP或MAC欺騙產(chǎn)生大量的TCP SYN數(shù)據(jù)包.其流表實例如下:
ovs-ofctl add-flow br0 "table=7,priority=32 769,in_port=tap4a2f334c-03,dl_src=fa:16:3e:f6:a8:5a,nw_src=192.168.100.10,actions=resubmit(,8)"
ovs-ofctl add-flow br0 "table=7,priority=32 768,in_port==tap4a2f334c-03,actions=drop
分析器在系統(tǒng)中主要根據(jù)預定義的策略模板,Openvswitch中端口的TCP SYN統(tǒng)計信息,以及探頭Probe采集的數(shù)據(jù)包樣本,來決策是否需要進行SYN包限速.分析器的工作流程如圖3所示.
圖3 Openvswitch的流表設計
目前策略模板中主要針對兩個統(tǒng)計因子來決策是否進行限速:TCP SYN Packet/s以及TCP Half Open Connection/s,其中TCP SYN Packet/s通過openvswitch的流表統(tǒng)計信息獲取,TCP Half Open Connection/s通過探頭Probe獲取的采樣在分析器中進行計算.
探頭模塊用于根據(jù)分析器指令來捕獲指定虛擬機端口的數(shù)據(jù)包,并生成pcap文件以供分析器解析和計算.探頭基于gopacket庫實現(xiàn),其捕獲數(shù)據(jù)包和存儲pcap文件的代碼片段如下:
func ondemand_probe() {
//Open output pcap file and write header
f,_:=os.Create(deviceName_pcap)
w:=pcapgo.NewWriter(f)
w.WriteFileHeader(snapshotLen,layers.LinkTypeEthernet)
defer f.Close()
//Open the device for capturing
handle,err=pcap.OpenLive(deviceName,snapshotLen,promiscuous,timeout)
if err!=nil{
…
os.Exit(1)
}
defer handle.Close()
//Start processing packets
packetSource:=gopacket.NewPacketSource(handle,handle.LinkType())
for packet:=range packetSource.Packets(){
//Process packet here
w.WritePacket(packet.Metadata().CaptureInfo,packet.Data())
packetCount++
//Only capture 1000
if packetCount>1000{
break
}}}
限速器使用TC實現(xiàn),通過u32分類器指定偏移量來匹配SYN數(shù)據(jù)包,其匹配過程和限速如下所示:
tc filter add dev tap4a2f334c-03 parent ffff:protocol ip prio 130 u32 match u8 0x02 0x02 at 33 police rate 10 bit burst 10 b drop
圖5 實驗攻擊數(shù)據(jù)包統(tǒng)計信息
本次測試驗證嘗試在攻擊虛擬機內(nèi)部使用hping3攻擊模擬TCP SYN Flood攻擊,并在攻擊虛擬機的虛擬網(wǎng)卡上使用tcpdump抓包來統(tǒng)計攻擊包的數(shù)量信息.其中虛線為對照組的攻擊包數(shù)量,實線為測試組的攻擊包數(shù)量.在兩輪測試中,使用hping3均產(chǎn)生了約50 Kpps的TCP SYN包,強度基本相當.使用這樣的實驗環(huán)境我們兩次測試了攻擊對Openvswitch的性能影響,以及對同Hypervisor的其他虛擬機網(wǎng)絡業(yè)務的影響.第一次測試是在沒有使用防御策略的情況下獲取系統(tǒng)性能在被攻擊狀態(tài)下的對照數(shù)據(jù),第二次則是測試應用防御策略后系統(tǒng)性能的響應數(shù)據(jù).
ovs-vswitchd的CPU和內(nèi)存使用率表示了Openvswitch用戶態(tài)進程對計算資源的消耗.通過統(tǒng)計ovs-vswitchd的CPU和內(nèi)存使用率能夠評估防御系統(tǒng)對Openvswitch的保護的效果.圖6顯示了保護前后ovs-vswitchd的CPU使用率對比,可以發(fā)現(xiàn)在系統(tǒng)探測到可能存在TCP SYN Flood攻擊并啟動保護后,ovs-vswitchd的CPU使用率可保持到正常水平.
圖6 CPU使用率對比
往返時間RTT(Round-Trip Time)在計算機網(wǎng)絡中它是一個重要的性能指標.表示從發(fā)送端發(fā)送數(shù)據(jù)開始,到發(fā)送端收到來自接收端的確認(接收端收到數(shù)據(jù)后便立即發(fā)送確認,不包含數(shù)據(jù)傳輸時間)總共經(jīng)歷的時間.圖7顯示了一個與攻擊虛擬機在同一Openvswitch下的正常虛擬機在兩輪攻擊時使用ping工具測試到出口設備的往返時間.從圖8可以看到,在攻擊發(fā)生、觸發(fā)探頭并啟動系統(tǒng)防護后,往返時間可在短時間內(nèi)恢復到正常水平.而未防護時,則持續(xù)在8 ms到135 ms區(qū)間波動.
圖7 往返時間RTT對比
在本次嘗試和實驗中,通過使用一個試驗臺,實現(xiàn)了本文所提出的在Openvswitch環(huán)境下對的TCP-SYN Flood攻擊的防御策略算法,多維度的評估了其對于受攻擊系統(tǒng)性能的影響,初步驗證了的其有效性.結(jié)果顯示該算法能有效地抵御測試數(shù)據(jù)集模擬的TCP-SYN Flood攻擊.