1 DDoS:Distributed Denial of Service
DDoS攻擊,即分布式拒絕服務攻擊,是目前黑客經常采用而難以防范的攻擊手段。黑客一般是通過制作僵尸網絡的方式攻擊域名,即在計算機中植入特定的惡意程序控制大量“肉雞”(指可以被黑客遠程控制的機器),然后通過相對集中的若干計算機向相對分散的大量“肉雞”發送攻擊指令,引發短時間內流量劇增。主要目的是讓指定目標無法提供正常服務,甚至從互聯網上消失,是目前最強大、最難防御的攻擊之一。
按照發起的方式,可分為三類:
第一類以力取勝,海量數據包從互聯網的各個角落蜂擁而來,堵塞IDC入口,讓各種強大的硬件防御系統、快速高效的應急流程無用武之地。這種類型的攻擊典型代表是ICMPFlood和UDPFlood,現在已不常見。
第二類以巧取勝,靈動而難以察覺,每隔幾分鐘發一個包甚至只需要一個包,就可以讓豪華配置的服務器不再響應。這類攻擊主要是利用協議或者軟件的漏洞發起,例如Slowloris攻擊、Hash沖突攻擊等,需要特定環境機緣巧合下才能出現。
第三類是上述兩種的混合,輕靈渾厚兼而有之,既利用了協議、系統的缺陷,又具備了海量的流量,例如SYNFlood攻擊、DNSQuery Flood攻擊,是當前的主流攻擊方式。
2 攻擊方式
2.1 SYN Flood
SYN Flood攻擊利用了TCP三次握手的缺陷:攻擊者偽裝大量的IP地址給服務器發送SYN報文,由于偽造的IP地址幾乎不可能存在,也就幾乎沒有設備會給服務器返回任何應答了。因此,服務器將會維持一個龐大的等待列表,不停地重試發送SYN+ACK報文,同時占用著大量的資源無法釋放。更為關鍵的是,被攻擊服務器的SYN_RECV隊列被惡意的數據包占滿,不再接受新的SYN請求,合法用戶無法完成三次握手建立起TCP連接。也就是說,這個服務器被SYN Flood拒絕服務了。
2.2 DNS Query Flood
DNS Query Flood就是攻擊者操縱大量傀儡機器,對目標發起海量的域名查詢請求。為了防止基于ACL的過濾,必須提高數據包的隨機性。常用的做法是UDP層隨機偽造源IP地址、隨機偽造源端口等參數。在DNS協議層,隨機偽造查詢ID以及待解析域名。隨機偽造待解析域名除了防止過濾外,還可以降低命中DNS緩存的可能性,盡可能多地消耗DNS服務器的CPU資源。
2.3 HTTP Flood
HTTP Flood是針對Web服務在第七層協議(應用層)發起的攻擊。它的巨大危害性主要表現在三個方面:發起方便、過濾困難、影響深遠。
HTTP Flood攻擊通過端口掃描程序在互聯網上尋找匿名的HTTP代理或者SOCKS代理,攻擊者通過匿名代理對攻擊目標發起HTTP請求。匿名代理是一種比較豐富的資源,花幾天時間獲取代理并不是難事,因此攻擊容易發起而且可以長期高強度的持續。
HTTP Flood攻擊在HTTP層發起,極力模仿正常用戶的網頁請求行為,與網站業務緊密相關,安全廠商很難提供一套通用的且不影響用戶體驗的方案。
HTTP Flood攻擊會引起嚴重的連鎖反應,不僅僅是直接導致被攻擊的Web前端響應緩慢,還間接攻擊到后端的Java等業務層邏輯以及更后端的數據庫服務,增大它們的壓力,甚至對日志存儲服務器都帶來影響。
2.4 慢速連接攻擊:Sloworis
攻擊者在HTTP請求頭中將Connection設置為Keep-Alive,要求Web Server保持TCP連接不要斷開,隨后緩慢地每隔幾分鐘發送一個key-value格式的數據到服務端,如a:b,導致服務端認為HTTP頭部沒有接收完成而一直等待。如果攻擊者使用多線程或者傀儡機來做同樣的操作,服務器的Web容器很快就被攻擊者占滿了TCP連接而不再接受新的請求。
3 防御
3.1 SYN Flood防御
SYN Flood攻擊大量消耗服務器的CPU、內存資源,并占滿SYN等待隊列。相應的,我們修改內核參數即可有效緩解。主要參數如下:
net.ipv4.tcp_syncookies = 1 #啟用SYN Cookie
net.ipv4.tcp_max_syn_backlog = 8192 #設置SYN最大隊列長度
net.ipv4.tcp_synack_retries = 2 #設置SYN+ACK最大重試次數
SYN Cookie的作用是緩解服務器資源壓力。啟用之前,服務器在接到SYN數據包后,立即分配存儲空間,并隨機化一個數字作為SYN號發送SYN+ACK數據包。然后保存連接的狀態信息等待客戶端確認。啟用SYN Cookie之后,服務器不再分配存儲空間,而且通過基于時間種子的隨機數算法設置一個SYN號,替代完全隨機的SYN號。發送完SYN+ACK確認報文之后,清空資源不保存任何狀態信息。直到服務器接到客戶端的最終ACK包,通過Cookie檢驗算法鑒定是否與發出去的SYN+ACK報文序列號匹配,匹配則通過完成握手,失敗則丟棄。
tcp_max_syn_backlog則是使用服務器的內存資源,換取更大的等待隊列長度,讓攻擊數據包不至于占滿所有連接而導致正常用戶無法完成握手。
net.ipv4.tcp_synack_retries是降低服務器SYN+ACK報文重試次數,盡快釋放等待資源。
ps:可能消耗服務器更多的內存資源,甚至影響正常用戶建立TCP連接,需要評估服務器硬件資源和攻擊大小謹慎設置。
3.2 HTTP Flood防御
HTTP Flood攻擊防御主要通過緩存的方式進行,盡量由設備的緩存直接返回結果來保護后端業務。大型的互聯網企業,會有龐大的CDN節點緩存內容。當高級攻擊者穿透緩存時,清洗設備會截獲HTTP請求做特殊處理。最簡單的方法就是對源IP的HTTP請求頻率做統計,高于一定頻率的IP地址加入黑名單。這種方法過于簡單,容易帶來誤殺,并且無法屏蔽來自代理服務器的攻擊,因此逐漸廢止,取而代之的是JavaScript跳轉人機識別方案。HTTP Flood是由程序模擬HTTP請求,一般來說不會解析服務端返回數據,更不會解析JS之類代碼。因此當清洗設備截獲到HTTP請求時,返回一段特殊JavaScript代碼,正常用戶的瀏覽器會處理并正常跳轉不影響使用,而攻擊程序會攻擊到空處。
3.3 DNS Flood防御
DNS攻擊防御也有類似HTTP的防御手段,第一方案是緩存。其次是重發,可以是直接丟棄DNS報文導致UDP層面的請求重發,可以是返回特殊響應強制要求客戶端使用TCP協議重發DNS查詢請求。
3.4 慢速連接攻擊防御
Slowloris攻擊防御比較簡單,主要方案有兩個:
第一個是統計每個TCP連接的時長并計算單位時間內通過的報文數量即可做精確識別。一個TCP連接中,HTTP報文太少和報文太多都是不正常的,過少可能是慢速連接攻擊,過多可能是使用HTTP1.1協議進行的HTTP Flood攻擊,在一個TCP連接中發送多個HTTP請求。
第二個是限制HTTP頭部傳輸的最大許可時間。超過指定時間HTTPHeader還沒有傳輸完成,直接判定源IP地址為慢速連接攻擊,中斷連接并加入黑名單。
4 新型攻擊方式
DNS 反射/放大攻擊利用互聯網上的DNS基礎結構來放大攻擊能夠產生的通信量。DNS是用于主機名到IP地址解析的互聯網基礎設施的重要組成部分。DNS反射/放大攻擊通過使用多個客戶端肉機(bots僵尸肉機)將查詢發送到多個開放DNS解析器中,從而使大量的攻擊流量從廣泛分布源中產生(在Spamhaus襲擊期間,使用了超過30K開放解析器)。
——Rango Chen