關于安全的三個最核心的元素CIA,也就是:
Confidentiality(保密性):信息只能被授權的人查閱。
Integrity(完整性):信息沒有被意外地修改。
Availability(有效性):信息或者資源在需要的時候,總是可以使用的。
不同的產(chǎn)品對有效性的要求是不一樣的,有的要求三個9,有的要求4個9。一個產(chǎn)品的可用性對客戶的影響非常大,如果服務經(jīng)常不可以使用,客戶將可能選擇其它產(chǎn)品??捎眯詫σ粋€系統(tǒng)來說是十分關鍵的,如果一個系統(tǒng)經(jīng)常不可用,就像12306那樣,你會覺得很郁悶,客戶也會覺得很郁悶。本片文章著重分析和總結了幾種導致DOS的原因,作為參考。
DOS產(chǎn)生的主要原因有以下幾種:
1)系統(tǒng)存在耗資源的操作,包括內(nèi)存和CPU以及帶寬
當一個操作需要消耗大量的CPU或者內(nèi)存的時候,首先需要想的是:是否有其他不需要耗費這么多資源的方法可以實現(xiàn)?如果有則是最好的啦。如果沒有,需要注意這個操作是那些角色可以操作?是內(nèi)部接口還是外部接口?誰可以觸發(fā)這個操作?如何避免被一般用戶出發(fā)這個操作?
舉個例子:一個搜索的頁面,對于用戶來說,可以設置每個頁面顯示多少條記錄。某些別有用心的用戶可能會嘗試修改一個頁面顯示的最大記錄數(shù)為一個很大的值,例如:10000。如果在端沒有控制好,通過了驗證,而且系統(tǒng)確實有大量的數(shù)據(jù),這樣的查詢是非常耗資源的。也許你會認為10000條記錄沒什么,那么,如果修改為1000,000呢?
2)使用共享資源的操作,容易導致死鎖
現(xiàn)在的系統(tǒng)都是并發(fā)量很大的系統(tǒng),而一個系統(tǒng)又難免會有一些資源是共享的,如果系統(tǒng)存在一個線程需要使用兩個共享的資源,在其他線程也需要使用這些資源,就有可能導致死鎖,進而使得系統(tǒng)停止工作。而且,這樣的問題還非常難以調(diào)查具體的原因,貌似程序運行的很好,其實,很多功能都已經(jīng)停止工作。監(jiān)控程序也可能漏掉這樣的監(jiān)控。所以,其危害比較大。
因此,在使用共享資源時,應該盡量減少保持的時間,用完快速釋放。必須要同時使用多個資源時,必須保證以同樣的順序使用,最好是能夠在一個API之內(nèi),統(tǒng)一處理。另外,一些系統(tǒng)的API也有可能會導致阻塞,在調(diào)用可能導致阻塞的API之前,必須保證不上鎖任何資源。例如:訪問有可能會因為數(shù)據(jù)庫服務器的原因?qū)е伦枞@時,就可以采用先訪問數(shù)據(jù)庫,得到數(shù)據(jù)之后,再使用共享資源進行下一步操作。當然,最好的方法還是通過設計盡量避免在同一個線程里同時訪問多個共享資源。
3)緩沖區(qū)溢出
緩沖區(qū)溢出是一個眾所周知的導致程序不可用的原因。其危害性,不用說,可能大多說的C/C++c程序員也都知道,也都對峙耿耿于懷。其避免方法也很簡單,通過有效的inputvalidation避免其發(fā)生,這一點很難做到。不過,還有另外一個比較好的方法就是:使用安全的庫是最好的方法,例如:STL,Safe C。
4)內(nèi)存泄漏
使用C/C++語言編程時,需要使用malloc/free和new/delete分配和釋放內(nèi)存。很容易犯的錯誤就是:
分配和釋放不匹配:例如使用new分配,使用free釋放,
這樣會導致內(nèi)存泄漏。
重復釋放 :例如new 分配一塊內(nèi)存之后,delete兩次,這樣會導致程序crash。
不正確地釋放: 使用new[]分配內(nèi)存,使用delete釋放,
這樣會導致內(nèi)存泄漏。
對于一些客戶端程序來說,一點內(nèi)存泄漏可能結果不是很嚴重。但是,對于后臺程序來說,一點點的內(nèi)存泄漏,都可能導致嚴重的Crash。因為,后臺程序是常年累月地在運行,泄漏的內(nèi)存會越來越多(這個根據(jù)泄漏內(nèi)存的操作的頻度有關),進而導致程序的內(nèi)存不足。所以,嚴格按照語言設計的理念,正確地使用接口很重要。
5)不正確的緩存機制
a)不常用的對象就不要緩存
如果對象不經(jīng)常使用而被緩存,則意味著經(jīng)常使用的對象可能會因為內(nèi)存的原因被從緩存中清除,這樣當再次被使用時,有需要再次導入到內(nèi)存。這樣會消耗很多CPU資源和內(nèi)存資源。使得整個系統(tǒng)的效率變得很低。所以,在決定需要緩存那些對象時,最好先調(diào)查對象使用頻率。根據(jù)緩存的大小和使用頻率決定緩存那些對象。
b)不需要記錄的日志,就不要記錄
首先,關于保存日志的文件,最好單獨保存在一個單獨的分區(qū),使得系統(tǒng)不會因為日志太多占滿而影響程序的正常工作。
其次,記錄日志要選擇性記錄,對于沒有用的日志,盡量不要記錄,否則,可能因為無用的日志太多,導致有用的日志被覆蓋,影響程序bug的分析和審計。
可見,日志雖然不像具體的業(yè)務邏輯那么重要,但是,正確地實現(xiàn)日志功能,可以對bug分析和審計提供很大的輔助作用。
6)服務使用的工具或者系統(tǒng)的配置不當
的配置對于系統(tǒng)的穩(wěn)定也至關重要,如果配置不當,也很容易導致系統(tǒng)被DOS攻擊,例如:TOMCAT如果配置成開發(fā)模式,很容易導致內(nèi)存耗盡; 如果連續(xù)插入兩個同樣的主鍵的值可能導致死鎖等。另外,像建立連接的Timeout時間設置不當,也可能導致連接被使用完而不能提供服務。
關于Web服務器和數(shù)據(jù)庫等第三方軟件的配置最重要的莫過于默認的用戶名和密碼,這些用戶名和密碼是公開的,一些攻擊者也會首先嘗試這些用戶名和密碼。如果服務器上沒有修改,攻擊者可以通過這些用戶名和密碼控制系統(tǒng)。當然,控制系統(tǒng)之后,DOS攻擊也就非常簡單。
所以,關于使用第三方工具時,關于配置方面的每一個配置項,都要搞清楚,以免有漏網(wǎng)之魚損害系統(tǒng)。
7)沒有備份,一旦主系統(tǒng)掛掉,沒有備份的系統(tǒng)無縫接替
如果系統(tǒng)沒有很好的備份機制,一旦系統(tǒng)出問題就會是一個很麻煩的事情。當然,是否需要備份需要根據(jù)系統(tǒng)提供服務來定。至于是備份整個系統(tǒng)還是備份整個系統(tǒng)的數(shù)據(jù),這個需要根據(jù)系統(tǒng)和備份的成本和收益率來權衡。只要做一個在線服務的系統(tǒng),備份是必須考慮的。
8)存在注入問題,如SQL注入,命令行注入等,一旦被利用,很容易使得攻擊者控制系統(tǒng),當然DOS就更不在話下
一個最典型的SQL注入字符串如下:
aaaa’ or ‘1’=’1’--
這樣的注入相對來說還是比較友善一些的。
如果一個非常惡意的攻擊者,注入的代碼如下:
aaaa’ or ‘1’=’1’;drop tableuser;--
結果會怎么樣?
關于數(shù)據(jù)庫,由于可以執(zhí)行一些系統(tǒng)的命令,如果注入系統(tǒng)的命令,可以使攻擊者控制系統(tǒng),啟動一些服務等操作,危害也非常嚴重。
對于一些輸入作為腳本語言或者解釋語言的一部分時,一定要謹記,要做好輸入驗證和特殊字符轉(zhuǎn)義。
9)數(shù)據(jù)庫連接配置不當
一個數(shù)據(jù)庫請求要有合適的超時配置,否則,可能導致阻塞。
在一般的產(chǎn)品線上,數(shù)據(jù)庫是非常關鍵的組件,一切應用皆需要數(shù)據(jù)。如果數(shù)據(jù)庫配置不當,超時沒有設置為合適的值,在網(wǎng)絡不是很好或者數(shù)據(jù)庫系統(tǒng)有些小問題的時候,很有可能導致,數(shù)據(jù)庫操作阻塞。如果阻塞的時間比較長,就可能導致很多請求被堆積在服務端。不但,占用大量內(nèi)存,還使得請求不能及時得到響應,而導致DOS。
10)訪問控制做的不好,也可以讓攻擊者提升權限控制系統(tǒng),進而發(fā)動DOS攻擊
訪問控制做的不好的最嚴重的例子,就是管理員訪問的一些操作控制不當??赡苡行┤苏J為將管理員的入口,從頁面上隱藏或者刪除,就可以有效地控制,防止一般人員可以訪問這些操作。但是,總是有些好事者,喜歡琢磨一些事情,他們會很有耐心地琢磨出管理員可能的訪問的接口。通過組裝這些接口,嘗試直接訪問并且查看效果。如果你只是隱藏或者不顯示,這很容易導致問題的出現(xiàn)。一旦攻擊者可以進行管理員的操作,后果可想而知。所以,訪問控制不能依靠隱藏,而是靠具有嚴格的、合適粒度的訪問控制,保證每一個訪問接口都被正確地控制。
11)實現(xiàn)邏輯導致的DOS攻擊
舉個最典型的例子就是:登錄幾次失敗之后,鎖住用戶(目前國內(nèi)仍然有不少網(wǎng)站使用這個策略)。這很有可能導致的后果就是,使用自動發(fā)送請求的工具,針對一個網(wǎng)站很多用戶發(fā)送登錄請求,就會導致很多用戶被鎖住。當真正的用戶登錄的時候,反而,因為用戶被鎖住而不能登錄。當然,使用Captcha是一個很好的解決。
12)協(xié)議級別的攻擊
針對協(xié)議的攻擊有很多,例如,TCP SYN flood攻擊,針對ICMP協(xié)議的攻擊, 這些攻擊都有一些特征,可以通過定制規(guī)則過濾這些包。也有一些是通過防火墻不能處理的,例如: Beast攻擊,是利用低版本的SSL和TLS的實現(xiàn)上的缺陷發(fā)動的攻擊,這就需要升級使用最新版的協(xié)議;還有就是是利用SSL/TLS協(xié)議的再協(xié)商漏洞,可以使用單機就可以發(fā)送DOS攻擊,這樣的攻擊就需要修改,禁止使用再協(xié)商機制才可以避免。
總之,導致DOS的原因有很多,必須在編程過程中時刻牢記一些容易導致DOS攻擊的原因,在設計和編碼的初始階段就注意預防,才是最有效的方法。希望本文能夠?qū)ψx者關于DOS攻擊的預防有所幫助。