網(wǎng)絡(luò)技術(shù)是從1990年代中期發(fā)展起來的新技術(shù),它把互聯(lián)網(wǎng)上分散的資源融為有機(jī)整體,實現(xiàn)資源的全面共享和有機(jī)協(xié)作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計算機(jī)、存儲資源、數(shù)據(jù)資源、信息資源、知識資源、專家資源、大型數(shù)據(jù)庫、網(wǎng)絡(luò)、傳感器等。 當(dāng)前的互聯(lián)網(wǎng)只限于信息共享,網(wǎng)絡(luò)則被認(rèn)為是互聯(lián)網(wǎng)發(fā)展的第三階段。 在傳統(tǒng)的操作系統(tǒng)級安全模型中,安全管理的粒度都是 Principal-based 層面的。用戶從認(rèn)證登陸成功開始,就獲得此帳號的所有權(quán)限,而其運(yùn)行的程序,也自動被授予帳號及其所在組的所有權(quán)限。例如我在《DACL, NULL or not NULL》一文中介紹的,NT 用戶從登陸到系統(tǒng)建立 Session 開始,就缺省使用相同權(quán)限,新建進(jìn)程自動獲得父進(jìn)程的權(quán)限,除非程序本身手動進(jìn)行限制。而 *nix 系統(tǒng)下面的思路也是類似,只不過從 Token 編程了各種 uid/gid 等等。 這種 Principal-based 的安全模型,在以主機(jī)為中心的孤立環(huán)境中是非常合適的,而且足夠簡單和高效。但隨著網(wǎng)絡(luò)的普遍使用,這種安全模型開始受到挑戰(zhàn),最直接的就是如何處理從網(wǎng)絡(luò)上運(yùn)行程序的策略問題。按照現(xiàn)有模型,所有程序都會自動獲得最大權(quán)限集,但這顯然是不現(xiàn)實的,安全管理粒度過于粗放。 因此在 Java 和 IE 等涉及網(wǎng)絡(luò)的應(yīng)用程序中,提出了新的基于位置的安全模型。一個程序運(yùn)行時獲得的權(quán)限,并不由其父進(jìn)程或者說宿主來決定(這些程序往往用于較高權(quán)限),而是由其程序所在位置覺得具有多少權(quán)限。Java 中將之簡化為對代碼源的安全策略限定,如在策略文件中指定所有來自 www.nsfocus.com 的程序都有寫 c:\temp 目錄的權(quán)限,而來自其他網(wǎng)址的程序只能讀取 c:\temp 目錄內(nèi)容。而 IE 中則更進(jìn)一步,將這些來源分類為本機(jī)(my computer)、內(nèi)網(wǎng)(intranet)、外網(wǎng)(internet)、可信站點(diǎn)(trusted)和不可信站點(diǎn)(untrusted)。 如果說 Principal-based 的安全模型中,關(guān)鍵因素是:我是誰(當(dāng)前帳號)、我要訪問什么(目標(biāo)資源)、我要怎么訪問(操作類型);則在 基于位置的安全模型中變成了:我來自哪里(代碼來源)、我要訪問什么(目標(biāo)資源)、我要怎么訪問(操作類型)。關(guān)鍵因素雖然只有一個我是誰到我來自哪里的轉(zhuǎn)變,但其控制粒度能夠大大提升。 但是這樣的基于位置的安全模型還是存在其問題,因為組件之間的可信程度是不同的。例如一個本機(jī)控件因為來源于本機(jī),受到系統(tǒng)的信任,被賦予很高的權(quán)限。同時一個惡意代碼來源于不受信任的位置,無法執(zhí)行某項操作。如果權(quán)限限定完整的話,本來不會出現(xiàn)問題,但因為某些權(quán)限依賴關(guān)系的管理混亂,造成惡意代碼可以通過受信任代碼執(zhí)行本不應(yīng)允許他執(zhí)行的功能。這也是眾多 IE 相關(guān)漏洞的問題根本所在,其受到 IE 現(xiàn)有安全模型的單級信任機(jī)制的限制,注定無法徹底解決。 要徹底解決此類問題,歸根結(jié)底必須建立一個可信鏈驗證機(jī)制,也就是說執(zhí)行某個操作的時候,必須檢查此操作所有的上級操作組件是否擁有安全權(quán)限,而不僅僅只檢測最后一級的組件。這一思路正是 CLR 中代碼訪問安全檢測的設(shè)計思路,其關(guān)鍵因素增加了一個:調(diào)用我的人都有哪些,他們是否有相應(yīng)權(quán)限的檢測。 例如我在建立一個文件的時候,可以強(qiáng)制性檢測調(diào)用鏈上的所有組件是否都擁有操作此文件的權(quán)限: 以下內(nèi)容為程序代碼: public void CreateFile() { // Create a new FileIO permission object FileIOPermission perm = new FileIOPermission(FileIOPermissionAccess.Write, @"C:\SomeFile.txt"); try { // Demand the FileIOPermission perm.Demand( ); } catch (SecurityException se) { // Callers do not have necessary permission } // Method implementation... } FileIOPermission 類描述了我需要檢測的權(quán)限,對 C:\SomeFile.txt 文件可寫;FileIOPermission.Demand() 則執(zhí)行這一權(quán)限的檢測工作,遍歷此方法調(diào)用鏈上的所有組件,檢測他們是否有次權(quán)限。這樣一來就可以從理論上避免惡意代碼通過調(diào)用可信組件執(zhí)行越權(quán)操作的問題。具體的權(quán)限定義和使用方法,這里就不詳細(xì)介紹了。下面就這種檢測如何實現(xiàn)做一個結(jié)構(gòu)上的簡要分析。 System.Security.CodeAccessPermission System.Security.Permissions.EnvironmentPermission System.Security.Permissions.FileDialogPermission System.Security.Permissions.FileIOPermission System.Security.Permissions.ReflectionPermission System.Security.Permissions.RegistryPermission System.Security.Permissions.SecurityPermission System.Security.Permissions.UIPermission System.Security.Permissions.IsolatedStoragePermission System.Security.Permissions.IsolatedStorageFilePermission System.Security.Permissions.StrongNameIdentityPermission System.Security.Permissions.PublisherIdentityPermission System.Security.Permissions.SiteIdentityPermission System.Security.Permissions.UrlIdentityPermission System.Security.Permissions.ZoneIdentityPermission 為進(jìn)行代碼訪問權(quán)限檢測,CLR 缺省定義了以上這些權(quán)限類型。首先他們都是從 CodeAccessPermission 類型繼承出來,其次就其意義可進(jìn)一步分為代碼訪問權(quán)限和代碼身份權(quán)限。代碼訪問權(quán)限定義代碼將如何去訪問資源,如讀寫文件、彈出對話框等等;代碼身份權(quán)限則定義訪問此資源的組件必須符合什么樣的身份,如只能是本地文件、或者只能是 nsfocus.com 發(fā)布的組件等等。 網(wǎng)絡(luò)的神奇作用吸引著越來越多的用戶加入其中,正因如此,網(wǎng)絡(luò)的承受能力也面臨著越來越嚴(yán)峻的考驗―從硬件上、軟件上、所用標(biāo)準(zhǔn)上......,各項技術(shù)都需要適時應(yīng)勢,對應(yīng)發(fā)展,這正是網(wǎng)絡(luò)迅速走向進(jìn)步的催化劑。 |
溫馨提示:喜歡本站的話,請收藏一下本站!