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