WEB應(yīng)用安全設(shè)計(jì)思想
安全問題的本質(zhì)問題是個(gè)很難探討的問題,許多人都無法給出相應(yīng)的結(jié)論,那么讓我們來一步一步分析,通過安全設(shè)計(jì)過程得出結(jié)論。
信任關(guān)系的劃分是安全設(shè)計(jì)的基礎(chǔ)
安全問題的本質(zhì)是信任問題。
提到這個(gè),不得不說一個(gè)信任域的概念。當(dāng)系統(tǒng)信任某些單元時(shí),由這些單元組成的一片區(qū)域可以稱之為信任域。在數(shù)據(jù)流圖或者是拓跋圖上,都可以用一個(gè)邊界把這個(gè)域給界定出來。我說的這個(gè)概念,是一個(gè)廣義的概念,任何存在信任關(guān)系的系統(tǒng)中,都可以存在信任域。
比如一個(gè)機(jī)場(chǎng),人們要登機(jī),必須要先經(jīng)過安檢,那么過了安檢后,在候機(jī)廳候機(jī),就可以把候機(jī)廳看做是一個(gè)信任域。因?yàn)閷?duì)于機(jī)場(chǎng)來說,候機(jī)廳內(nèi)的區(qū)域是可信的。而候機(jī)廳外的區(qū)域是不可信的。
機(jī)場(chǎng)的安檢就是對(duì)跨越信任邊界的一個(gè)檢查。會(huì)檢查有沒有刀具,有沒有液體、打火機(jī)等。
那么安全問題是怎么發(fā)生的呢?首先是沒有合理的劃分信任域,或者是信任域比較混亂。
其次就是信任邊界的檢查出現(xiàn)問題的時(shí)候。這些問題可以是檢查不夠充分,或者是檢查沒有覆蓋到整個(gè)信任邊界。
而這些問題導(dǎo)致的結(jié)果,都是產(chǎn)生信任危機(jī),也就產(chǎn)生安全問題了。
對(duì)于傳統(tǒng)的內(nèi)存攻擊來說,一個(gè)字符串超出了分配給它的指定空間長度,也可以看做是對(duì)信任域的破壞,或者是缺乏審計(jì)。
所以信任域和信任邊界是非常重要的東西。在做安全方案的時(shí)候,首先就要依據(jù)資產(chǎn)等級(jí),去劃分信任域和信任邊界。
我們要知道我們到底要保護(hù)什么東西,然后去分析有什么途徑能夠達(dá)到這些要保護(hù)的信任域。
在圈子里經(jīng)常講的一個(gè)笑話就是,怎么做到安全?撥網(wǎng)線最安全。首先,這是一個(gè)謬論,因?yàn)榫W(wǎng)線拔掉后,可用性會(huì)受到影響。安全方案應(yīng)該盡可能的避免犧牲可用性為代價(jià),應(yīng)該是為業(yè)務(wù)和應(yīng)用服務(wù)的。拔網(wǎng)線是一種舍本逐末的做法。
其次,拔了網(wǎng)線真的就安全了嗎?
我們把物理隔絕的系統(tǒng)看做是一片信任域,那么它會(huì)信任什么?如何與外界做數(shù)據(jù)交互?
簡(jiǎn)單的頭腦風(fēng)暴一下,就可以知道,這樣的系統(tǒng),可能會(huì)與外界發(fā)生數(shù)據(jù)交互的情況:
1. U盤有可能拷貝數(shù)據(jù)
2. 無線網(wǎng)卡有可能自動(dòng)連接
3. 可能有人為的手工操作
那么以上這三條,都是有可能穿越我們的信任邊界,產(chǎn)生數(shù)據(jù)流動(dòng)的行為。原本物理隔絕就是為了不信任外界的一切,產(chǎn)生數(shù)據(jù)流動(dòng)后,就可能破壞信任關(guān)系。
再回過頭來看上面的機(jī)場(chǎng)的案例,把客流量看做是數(shù)據(jù)流量,它將穿越一道信任邊界,進(jìn)入候機(jī)廳這個(gè)信任域,所以機(jī)場(chǎng)有安檢,來專門檢查這個(gè)穿越信任邊界的數(shù)據(jù)。安檢就是機(jī)場(chǎng)的安全方案。
-tips--------------------------------------------------------------------------
如果A信任B,或者A依賴于B,則B可以決定A的安全。常見的案例比如軟件中使用了第三方包,則第三方包可以決定A中相關(guān)數(shù)據(jù)的安全。
-------------------------------------------------------------------------------
某些視頻播放軟件使用了很多第三方的庫來解析很多不同的視頻格式,當(dāng)?shù)谌綆斐霈F(xiàn)安全問題時(shí),則直接導(dǎo)致這些視頻播放軟件也出現(xiàn)安全問題。
所以安全域的劃分是安全方案的基礎(chǔ),劃分了安全域后,才能比較有針對(duì)性的設(shè)計(jì)安全方案。
訪問控制是安全設(shè)計(jì)的核心
訪問控制不僅僅包括權(quán)限。權(quán)限僅僅只是訪問控制的一部分。這里我們通常所說的權(quán)限都是垂直權(quán)限控制,它一般是基于角色的(role based)。
比如一個(gè)論壇里面,有匿名用戶,他們可能看不了帖子的內(nèi)容。有普通用戶,他們能看帖子的內(nèi)容。有管理員,他們能刪帖子,能置頂帖子。
那么匿名用戶、普通用戶、管理員就是三個(gè)不同的角色。
我們的大部分訪問控制系統(tǒng),都是基于角色的。普通用戶沒辦法執(zhí)行管理員的操作,因?yàn)樵L問控制系統(tǒng)會(huì)校驗(yàn)用戶的角色,以決定他們是否有足夠的權(quán)限去執(zhí)行一次訪問。
訪問控制系統(tǒng)一般在整個(gè)系統(tǒng)中處于一個(gè)比較中心的位置,也只有讓他處在一個(gè)中心的、關(guān)鍵的位置,才能保證每次訪問都由它來控制。
但是目前我們的大多數(shù)系統(tǒng)都僅僅是垂直權(quán)限控制,而對(duì)水平權(quán)限控制方面卻做的不太好。
什么是水平權(quán)限控制?
這個(gè)概念是相對(duì)于垂直權(quán)限控制來說的。
A與B都是同一個(gè)角色的普通用戶。A上傳了一個(gè)頭像,系統(tǒng)給它編號(hào)為123,正常情況下,A可以執(zhí)行http://www.test.com/delete?id=123”去刪除自己的頭像。
但是由于這個(gè)刪除操作僅僅校驗(yàn)了用戶的角色,而沒有校驗(yàn)提交該請(qǐng)求的用戶是否是A,從而導(dǎo)致B可以提交以上請(qǐng)求,去刪除A的頭像。
這就是一個(gè)典型的水平權(quán)限控制出錯(cuò)的例子。
而很多系統(tǒng)中,同一個(gè)角色的用戶可以加入不同的用戶組,這些一個(gè)個(gè)的用戶組,就是一個(gè)水平權(quán)限控制的系統(tǒng)。
只是問題往往出在訪問控制系統(tǒng)的粒度上。如果劃分的粒度不夠細(xì),那么一個(gè)用戶組內(nèi)的用戶是否可以刪除或修改各自的數(shù)據(jù)?
對(duì)于粒度的劃分,我把一個(gè)訪問控制系統(tǒng)中的最小單位稱之為一個(gè)原子權(quán)限。無論是水平權(quán)限系統(tǒng)還是垂直權(quán)限系統(tǒng),可能都是對(duì)原子權(quán)限的不同組合。
這個(gè)問題實(shí)際上是一個(gè)非常難以解決的問題,特別是在已經(jīng)成型的大型系統(tǒng)中。對(duì)于現(xiàn)在的大型互聯(lián)網(wǎng)公司來說,網(wǎng)站的代碼一般都是幾十G的數(shù)量級(jí),業(yè)務(wù)系統(tǒng)繁多。而水平權(quán)限控制的一般要求是,將所操作的數(shù)據(jù)與用戶聯(lián)系起來。
回到上面的例子:delete?id=123
那么怎么知道123這條數(shù)據(jù),是A的呢?系統(tǒng)無從判斷,只能去查詢user表。如果業(yè)務(wù)系統(tǒng)一復(fù)雜,可能就涉及到跨表查詢或者是聯(lián)合查詢,甚至是跨庫查詢,這基本上是一場(chǎng)噩夢(mèng)。
可是如果不進(jìn)行二次查詢,則無法在根本的地方解決這個(gè)問題??墒嵌尾樵冇謺?huì)帶來性能上的消耗。真是一個(gè)很矛盾的事情。
所以最好的做法是在設(shè)計(jì)數(shù)據(jù)層的時(shí)候,事先考慮好這個(gè)問題,做好數(shù)據(jù)與用戶之間的關(guān)聯(lián)性。
如果已經(jīng)成型的系統(tǒng),就只能在外面包一層,把這個(gè)問題隱藏起來了。在本文的后面,會(huì)提到這種做法。
除了水平和垂直權(quán)限控制外,實(shí)際上一些規(guī)則,也可以看做是訪問控制。比如瀏覽器里的SOP(same original policy)。DOM、cookie等都有同源策略,也略有差別。但這些規(guī)則,都是屬于訪問控制系統(tǒng),在整個(gè)安全體系中,處于核心的位置。
- -tips----------------------------------------------------
- 訪問控制系統(tǒng)一般會(huì)針對(duì)數(shù)據(jù)的RWX(讀、寫、執(zhí)行)屬性進(jìn)行授權(quán),對(duì)發(fā)起請(qǐng)求方則進(jìn)行水平或垂直的檢查。
- ---------------------------------------------------------
而在WEB中,極其理想的狀態(tài),可以大膽的想象為,以session為單位建立原子權(quán)限,將數(shù)據(jù)與session關(guān)聯(lián)起來后,每個(gè)不同的session就是不同的信任域,對(duì)每個(gè)跨越信任邊界的請(qǐng)求進(jìn)行水平、垂直的權(quán)限檢查,這樣就是一個(gè)極端理想的權(quán)限體系。這只是一個(gè)理想模型,在實(shí)踐中,需要根據(jù)實(shí)際情況進(jìn)行分析。
WEB的安全設(shè)計(jì)過程比較繁瑣,本篇文章只向大家介紹了一部分,我們還會(huì)在后面的內(nèi)容里繼續(xù)與大家分享的。
【編輯推薦】