基於主體和物件的訪問控制–附:電腦保安的層次

科技小能手發表於2017-11-12
安全在很多情況下體現為訪問控制,因此訪問控制模型就顯得十分重要,美妙的是,從處理器硬體到 作業系統到應用軟體甚至我們的現實生活,基於主體和物件的訪問控制模型竟然是大大的相似,甚至相同。這其實沒有什麼奇怪的,本身計算機就是人設計出來的, 人的一些根深蒂固的觀念便自然在計算機中繼續發揮著作用。 
     intel的特權環檢測十分的形象但是十分的複雜,其實這種檢查機制正好對映了安全模型中的一個很一般的機制,那就是將安全事件分為主體,物件,主體通過 型別unix能力的概念被約束行為,而物件擁有訪問控制列表來約束主體的行為,一個主觀和一個客觀同時允許訪問的時候,訪問才可以進行,這樣的機制避免了 訪問控制時一廂情願帶來的災難。cpl和rpl位於段選擇子中,代表的就是主體能力的含義,而dpl位於段描述符中,代表的是物件的訪問控制列表的含義, 更為複雜的在於rpl的設定,它可以使當前程式碼代理別的特權級來執行,想想看,只有在rpl大於cpl的時候,這個約束才有現實意義,因為如果rpl小於 等於cpl,那麼它自己就可以搞定了,又何必讓更低特權級的cpl程式碼幫忙呢?當rpl大於cpl的時候,此時的程式碼代表更低特權級的程式碼在執行,從而執 行嚴格地訪問控制,防止高特權級的程式碼濫用職權。當然,intel特權級的概念遠遠不止這些,還有一致性程式碼,非一致性程式碼等複雜概念以及加之於上的行 為。 
基於主體,物件的訪問控制是最基本的模型,intel特權環用了,作業系統核心同時也用了,linux中的使用者代表的是一個主角,而程式代表主體,程式代 理使用者去做事,訪問控制就在程式代表的使用者是誰,程式本身是誰,程式要訪問的物件這三者之間展開,有的時候,雖然程式本身可以訪問某個物件,但是由於程式 此時是在代理別人做事,訪問控制機制還是可能會拒絕這次訪問的,這個意義和intel特權環的rpl的意義類似。linux安全控制沿襲了unix的能力 模型,能力模型規定了主體可以訪問哪些物件並且進行哪些操作,而物件的安全不僅僅信任能力模型,畢竟安全領域沒有完全的信任,物件還要通過一個訪問控制列 表來限制哪些主體可以對自己訪問以及程式哪些操作,合二為一就構成了安全領域的基本法則。在linux中,訪問控制機制首先進行能力判斷,然後進行訪問控 制列表判斷,注意這兩個判斷是互不相干的分別進行的。在更加安全的SELinux中,引入了一個新的主角,就是安全ID,SELinux的機制看似很復 雜,實際上只是擴充了能力模型和物件的訪問控制列表,具體來說就是以前的能力可能只有讀,寫,執行,而SELinux的能力可能還包括更加複雜的行為或者 行為集合,同樣對物件的保護上,也不再僅僅是當前的訪問控制列表那麼簡單。舉個最簡單的例子就是如果一個使用者的安全ID沒有變,即使他su成了root用 戶,他的行為照樣受到控制。 
我們來看看windows的訪問控制,它實質上和linux差不多,更確切的說應該和SELinux差不多,它更加在乎對主體的控制,但是對物件的保護方 面用力也不小,主體還是程式,主體的行為被放到了一個叫做令牌的資料結構中,從令牌中可以看到該程式在代表誰執行以及它可以訪問哪些物件以及進行哪些操 作,令牌是一個很緊湊的資料結構,而linux中的能力判斷和訪問控制判斷卻是鬆散的進行的。幾乎所有的東西在windows中都是物件,而 windows訪問控制機制保護的物件就是這些叫做物件的東西,因此每一個物件都擁有安全描述符,這個安全描述符相當於一個訪問控制列表,注意,程式本身 也是一個物件,一切皆物件的精髓是博大精深的,用好了將是一副美麗的圖景,用不好將會帶來更多安全隱患,linux中程式不在安全保護範圍內,而只是一個 主體,受到更低一級別的作業系統地址空間隔離機制的保護,這種保守的做法使得一個程式無論如何也不能操控別的程式而只能進行程式間通訊。windows敢 於提出一切皆物件,就是由於它擁有著強大的訪問控制機制,令牌,安全描述符合力促使了一切皆物件成為了現實。在進行訪問控制驗證的時候,windows不 是分別進行的,而是統一判斷的,這一點和linux有所不同。 
最後,我們來總結一下,主體,物件是訪問控制的兩大實體,如果偏向於對物件的保護,那麼最終就發展成了unix的能力模型,能力表示對主體的簡單限制,而 物件的保護體現在一個複雜得多的訪問控制列表;如果偏向於對主體的控制,那麼最終就會發展成windows的基於令牌和安全描述符的訪問控制機制,令牌和 安全描述符可以輕鬆控制每一個主體的行為,它們的資料結構要複雜的多。因此如果安全訪問控制點離人-機標尺的人近一些,那麼就會形成(主體-操作集 合)->物件的保護方式,反之,如果安全訪問控制點離人-機標尺的機器近一些,那麼就會形成主體->(使用者/組-物件)的保護方式,物件的保 護基本在於允許誰進行什麼樣的操作,因此使用者或者組需要和允許以及拒絕的操作和物件繫結在一起,而使用者的行為約束基本在於限定使用者可以進行操作的集合,因 此需要將主體使用者和它被限制的操作集合繫結在一起。 
附:電腦保安的層次 
電腦保安體現在任何方面,分頁,分段,地址空間隔離,這些都是 基礎的安全控制機制,我們之所有感到程式設計有的時候很困難就是因為有安全控制,如果你寫了一個程式去訪問NULL指標,結果就是你的程式崩潰,隨後你瘋狂的 除錯找不到原因,然後抱怨破事兒怎麼如此之多!其實這正是一種安全的體現,使用者的資料在記憶體中,不管是使用者的名字還是使用者的銀行卡號,而安全機制要求記憶體 在釋放了都要清0,並且使用的時候必須首先分配,而為了效率往往是在分配的時候才將記憶體清0,使用者空間安全機制要求使用者釋放了指標之後,一定要將指標賦值 為NULL,如果NULL指標可以隨意訪問,那麼惡意使用者程式就可能訪問到已經被釋放但是還沒有清0的記憶體,另外還有很多別的方面的原因導致了NULL不 能被隨意訪問。如果你想在4G的虛擬地址空間馳騁,那麼守規矩是必要的,畢竟不是你一個人在跑,自己跑偏沒有問題,破壞了別人的資料就不好了,越簡單的計 算機程式設計約束越少,這也是顯然的,如果底層的作業系統構建了一個安全的多使用者多工的平臺,那麼可以保證的僅僅是這個平臺本身不會出問題,靠的就是記憶體管 理,MMU,程式排程等等,但是作業系統的目的就是提供給使用者使用,而使用者在使用機器的時候,他們所關心的不是機器的安全而是他們的資料安全,因此就出現 了基於主體和物件的安全訪問控制,訪問控制本質上保護的還是計算機上的東西,因為計算機沒有別的更好的辦法來控制使用者對他們存入機器的資源的訪問,訪問控 制其實還是計算機內在的安全機制,因為你不能將主體或者物件的任何一方帶出計算機,比如列印出來,甚至帶到別的計算機都不可能,但是無論如何,訪問控制的 保護向使用者的方向更加接近了,最終,使用者資料的保護還是落實到了最古老也是最有效的密碼學上,密碼保護是計算機外圍的保護,你可以將計算機加密後的資料打 印出來然後筆算解密,在這個層次上,計算機真正退化成一個更加快速的工具。 

總之,電腦保安分為機器安全(分段,分頁,地址空間隔離等),作業系統安全(使用者對資源的訪問控制等),資料安全(整個資料的安全),越往上的層次越抽象,到了密碼學安全領域,計算機成了工具,這也迴歸了計算機的本質。


 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1274073



相關文章