由於拒絕服務攻擊工具的泛濫,及所針對的協議層的缺陷短時無法改變的事實,拒絕服務攻擊也就成為流傳廣泛、極難防范的一種攻擊方式。雖然到目前為止,沒有一個絕對的方法可以制止這類攻擊;但對於不同的攻擊方式,還是有一些解決方法的。
本文以Redhat Linux 9.0為例,介紹如何分類防范DoS.
Linux服務器的兩種守護進程
1.stand-alone模式
stand-alone方式是Unix傳統的C/S模式的訪問模式。服務器監聽(Listen)在一個特點的端口上等待客戶端的聯機。如果客戶端產生一個連接請求,守護進程就創建(Fork)一個子服務器響應這個連接,而主服務器繼續監聽,以保持多個子服務器池等待下一個客戶端請求。Stand-alone模式的工作原理如圖1所示。
工作在stand-alone模式下的網絡服務有route、gated.大家比較熟悉的Web服務器是Apache和郵件服務器Sendmail.在Apache這種負載很大的服務器上,預先創子服務器可以提高客戶的服務速度。
在Linux系統中通過stand-alone工作模式啟動的服務由/etc/rc.d/下面對應的運行級別當中的符號鏈接啟動。
2.xinetd模式
從守護進程的概念可以看出,對於系統所要通過的每一種服務都必須運行一個監聽某個端口連接所發生的守護進程,這通常意味著資源浪費。為了解決這個問題,Linux引進了“網絡守護進程服務程序”的概念。
Redhat Linux 9.0使用的網絡守護進程是xinetd(eXtended InterNET daemon)。和stand-alone模式相比,xinetd模式也稱Internet Super-Server(超級服務器)。xinetd能夠同時監聽多個指定的端口,在接受用戶請求時能根據用戶請求端口的不同,啟動不同的網絡服務進程來處理這些用戶請求。我們可以把xinetd看成一個管理啟動服務的管理服務器,它決定把一個客戶請求交給哪個程序處理,然後啟動相應的守護進程。xinetd模式的工作原理如圖2所示。
和stand-alone工作模式相比,系統不想要每一個網絡服務進程都監聽其服務端口,運行單個xinetd就可以同時監聽所有服務端口,這樣就降低了系統開銷,保護了系統資源。但是對於訪問量大、經常出現並發訪問時,xinetd想要頻繁啟動對應的網絡服務進程,反而會導致系統性能下降。
察看系統為Linux服務提供哪種模式方法,在Linux命令行下使用pstree命令,可以看到兩種不同方式啟動的網絡服務。一般來說系統一些負載高的服務,如Sendmail、Apache服務是單獨啟動的,而其他服務類型都可以使用xinetd超級服務器管理,系統默認使用xinetd的服務可以分為如下幾類: 標准互聯網服務:telnet、ftp
信息服務:finger、netstat、systat
RPC服務:rquotad、rstatd、rusersd、sprayd、walld
BSD服務:comsat、exec、login、ntalk、shell、talk
內部服務:chargen、daytime、echo、servers、services time
安全服務:irc
其他服務:name、tftp、uucp
小提示:從原理上Apache、sendmail也可以使用xinetd模式啟動,但是您需要硬件檔次非常高的服務器。
針對xinetd模式的DoS防范
xinetd提供類似於inetd+tcp_wrapper的功能,但是更加強大和安全,能有效防止DoS:
1.限制同時運行的進程數
通過設置instances選項設定同時運行的並發進程數。例如:
instances=20
說明:當服務器被請求連接的進程數達到20個時,xinetd將停止接受多出部分的連接請求,直到請求連接數低於設定值為止。
2.限制一個IP地址的最大連接數
通過限制一個主機的最大連接數來防止某個主機獨占某個服務。例如:
per_source=5
說明:單個IP地址的連接數是5個。
3.限制日志文件大小,防止磁盤空間被填滿
許多攻擊者知道大多數服務需要寫入日志。入侵者可以構造大量的錯誤信息發送出來,服務器記錄這些錯誤,很可能就造成日志文件非常龐大,甚至會塞滿硬盤。管理員面對大量的日志,也很難發現入侵者真正的入侵途徑。因此,限制日志文件大小是防范DoS的一個方法。例如:
log_type FILE.1 /var/log/myservice.log 8388608 15728640
說明:這裡設置的日志文件FILE.1臨界值為8MB,到達此值時syslog文件中會出現警告,到達15兆,系統會停止所有使用這個日志系統的服務。
4.限制負載
xinetd還可以使用限制負載的方法防范DoS.用一個浮點數作為負載系數,當負載達到這個數目時,該服務將暫停處理後續的連接。例如:
max_load=2.8
說明:當一項系統負載達到2.8時,所有服務將暫時終止,直到系統負載下降到設定值以下。
當然,要使用這個選項,編譯時要加入-with-loadavg,xinetd將處理max-load配置選項,從而在系統負載過重時關閉某些服務進程,來實現某些拒絕服務攻擊。
5.限制所有服務器數目(連接速率)
xinetd可以使用cps選項設定連接速率。例如:
cps=25 60
說明:第一個參數表示每秒可以處理的連接數,如果超過了這個連接數,進入的連接將被暫時停止處理;第二個參數表示停止處理多少秒後繼續處理先前暫停處理的連接。即服務器最多啟動25個連接,如果達到這個數目將停止啟動新服務60秒。在此期間不接受任何請求。
6.限制對硬件資源的利用
通過rlimit_as和rlimit_cpu兩個選項可以有效限制一種服務對內存、中央處理器的資源占用。例如: rlimit_as=8M
rlimit_cpu=20
說明:此設定限制了對服務器硬件資源的占用,最多可用內存為8M,CPU每秒處理20個進程。
總結:xinetd的一個重要功能是它能夠控制從屬服務可以利用的資源量,通過以上設置可以達到這個目的,有助於防止某個xinetd服務大量占用系統,從而導致“拒絕服務”情況的出現。
針對stand-alone的DoS防范
Linux下以stand-alone模式運行的服務器主要是Apache、Sendmail.
1.Apache服務器防范DoS措施
Apache服務器對拒絕攻擊的防范主要通過軟件Apache DoS Evasive Maneuvers Module來實現。它是一款mod_access的替代軟件,可以對抗DoS攻擊。該軟件可以快速拒絕來自相同地址對同一URL的重復請求,這是通過內部一張各子進程的哈希表查詢來實現的。軟件下載鏈接:http://online.securityfocus.com/data/tools/dospatch.tar.gz,軟件安裝的配置可以查看相關頁面。
另外,在Apache配置文件中,有一些安全相關的指令可以使用。http://httpd.apache.org/docs/mod/directives.html.使用以下指令可以幫助您減小DoS的威脅: LimitRequestBody:數字參數,控制HTTP請求的大小。
LimitRequestFields:數字參數,控制請求頭的數目。
KeepAlive:設置連接的生存期。
KeepAliveTimeout:限制等待請求的時間。
使用以下指令可以幫助您減少緩沖區溢出的危險:
LimitRequestFieldSize:限制每個請求頭的大小。
LimitRequestLine:限制每個請求行的大小。
此外,Apache服務器管理員還應該經常去http://www.apache.org/dist/httpd/查看、下載補丁程序,以確保Web服務器的安全。
2.Sendmail服務器防范DoS措施
由於電子郵件的性質,一個要攻擊郵件服務器的攻擊者可以輕易地使用郵件來充斥服務器,從而導致DoS.通過設置/etc/mail/sendmail.mc以下目錄的限度,這類攻擊的有效性就會大受限制。
confCONNECTION_RATE_THROTTLE:服務器每秒能夠接受的連接數量。按照默認設置,Sendmail是不限制連接數量。如果連接數量達到限度,以後的連接就會被延遲。推薦值:40.
confMAX_DAEMON_CHILDREN:服務器能夠Fork出的子進程的最大數量。按照默認設置,Sendmail不限制子進程的數量。如果限度被設置,達到限度後的連接就會被延遲。推薦根據內存容量設置:128M內存建議值為40.
confMIN_FREE_BLOCKS:文件系統用來接受標准SMTP(簡單郵件傳輸協議)郵件的隊列中的最少自由塊數,越小越容易被攻擊致命。默認為100塊,推薦值為4000或者更大。
confMAX_HEADERS_LENGTH:消息頭可接受的最大限度(以字節為單位)。默認為不限制,推薦值是64.
confMAX_MESSAGE_SIZE:單個消息可接受大小的最大限度(以字節為單位)。越大越容易被攻擊致命。默認為不限制,推薦值為5242880.
另外,不要把郵件假脫機目錄/var/spool/mail/放在NFS共享文件卷上。因為NFS對用戶組群ID沒有控制,幾個UID相同的用戶可以收到和閱讀彼此的郵件。
限制整體資源的占用
還可以對系統資源做限制,使得系統增強抗DoS能力。
編輯/etchttp://security.chinaitlab.com/limits.conf文件,添加下面幾行: * hard core 0
* hard rss 10000
* hard nproc 30
說明:“core 0”表示禁止創建core文件:“nproc 30”把最多進程數限制到30:“rss 10000”表示除了root之外,其他用戶都最多只能用10MB內存。 “*”表示的是所有登錄到系統中的用戶。
上面這些對登錄到系統中的用戶有效。通過這些限制,就能更好地控制系統中的用戶對進程、core文件和內存的使用情況。最後編輯“/etc/pam.d/login”文件,在文件末尾加入: session required /libhttp://security.chinaitlab.com/pam_limits.so