|
網(wǎng)絡(luò)技術(shù)是從1990年代中期發(fā)展起來的新技術(shù),它把互聯(lián)網(wǎng)上分散的資源融為有機(jī)整體,實(shí)現(xiàn)資源的全面共享和有機(jī)協(xié)作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計(jì)算機(jī)、存儲資源、數(shù)據(jù)資源、信息資源、知識資源、專家資源、大型數(shù)據(jù)庫、網(wǎng)絡(luò)、傳感器等。 當(dāng)前的互聯(lián)網(wǎng)只限于信息共享,網(wǎng)絡(luò)則被認(rèn)為是互聯(lián)網(wǎng)發(fā)展的第三階段。 安全性機(jī)制 Windows NT使用兩種導(dǎo)致訪問嘗試失敗返回錯誤5的機(jī)制:確認(rèn)權(quán)限和確認(rèn)特權(quán)。權(quán)限屬于對象上的行為,比如掛起線程權(quán)限或讀文件權(quán)限。權(quán)限總是與特定對象和已知用戶相關(guān)聯(lián)。例如,讀文件權(quán)限必須與文件(權(quán)限應(yīng)用在此文件上)和有或沒有權(quán)限的用戶相關(guān)聯(lián)。同樣,掛起線程權(quán)限除非與特定的線程和用戶關(guān)聯(lián)否則沒有用。 特權(quán)是預(yù)先定義好的屬于系統(tǒng)上操作的權(quán)限。例如,特權(quán)有調(diào)試程序、備份和恢復(fù)存儲設(shè)備以及裝入驅(qū)動程序。特權(quán)以用戶為中心,而不是對象。 為了使兩者之間區(qū)分得更清楚,可以看一下實(shí)現(xiàn)權(quán)限和特權(quán)的數(shù)據(jù)結(jié)構(gòu):權(quán)限在叫作訪問控制表(ACL)的數(shù)據(jù)結(jié)構(gòu)中指定。ACL通常與對象相關(guān)。用戶用訪問令牌表示。當(dāng)用戶試圖訪問受保護(hù)的對象時(shí),其訪問令牌與對象的ACL檢查。訪問令牌包含代表用戶的唯一標(biāo)識符(安全性ID,或SID)。ACL中的每個(gè)權(quán)限與一個(gè)SID相關(guān);這樣,安全性子系統(tǒng)就知道了與每個(gè)用戶相關(guān)的權(quán)限。 另一方面,特權(quán)在訪問令牌中編碼,所以沒有相關(guān)聯(lián)的對象。要確定用戶是否允許做某個(gè)與特權(quán)有關(guān)的操作,安全性子系統(tǒng)檢查訪問令牌。 此外,權(quán)限需要行為的說明(干什么的權(quán)限?例如,讀文件或者掛起線程),而特權(quán)不需要(用戶或者有特權(quán),或者沒有)。與特權(quán)相隨的操作隱含在特權(quán)本身中。 特權(quán)在訪問令牌中編碼的原因是大多數(shù)特權(quán)不考慮安全性需求。例如,允許備份存儲設(shè)備的用戶必須能夠繞過文件安全性。為了允許用戶訪問而給硬盤上每個(gè)單獨(dú)的文件都加入一個(gè)新的ACE是不可行的。這樣,備份存儲設(shè)備的代碼首先檢查試圖備份的用戶是否擁有備份特權(quán);如果有,單個(gè)文件的安全性就被忽略。 能夠與訪問令牌相關(guān)的特權(quán)集被牢固加密,不能被應(yīng)用程序展開。服務(wù)器程序能夠使用特殊的權(quán)限和普通的映射實(shí)現(xiàn)自定的安全性規(guī)則。 有兩種類型的ACL:自由決定的(DACL)和系統(tǒng)的(SACL)。DACL管制對象訪問,SACL管制審核。 控制訪問 在大多數(shù)情況下,錯誤5是由Windows NT特有的叫作AccessCheck的Win32函數(shù)內(nèi)部產(chǎn)生的。此函數(shù)的輸入有用戶的訪問令牌、需要的特權(quán)和ACL。ACL主要是小數(shù)據(jù)結(jié)構(gòu)(叫作訪問控制元素,或ACE)的列表,每個(gè)數(shù)據(jù)結(jié)構(gòu)定義一個(gè)用戶或一組用戶、一個(gè)權(quán)限集合以及允許或拒絕的信息。例如,ACL中可能有一個(gè)ACE寫著“從紙盒中拿走雞蛋的權(quán)限明確地拒絕給與用戶Elephant和Bozo”,后面一個(gè)ACE寫著“從紙盒中拿走雞蛋的權(quán)限明確地準(zhǔn)予給與用戶Betty Crocker以及CHEFS組中所有用戶”。 ACL與對象相關(guān),可以在服務(wù)器程序中動態(tài)創(chuàng)建。例如,如果一個(gè)文件對象與一個(gè)ACL相關(guān),不管何時(shí)有應(yīng)用程序試圖打開該文件對象,ACL就會被查詢以決定是否允許運(yùn)行應(yīng)用程序的用戶打開文件。 AccessCheck函數(shù)被許多系統(tǒng)函數(shù)內(nèi)部調(diào)用,例如,CreateFile(用戶試圖在NTFS分區(qū)或命名管道上打開文件時(shí))和OpenFileMapping。然而,Win32服務(wù)器程序能夠直接調(diào)用AccessCheck,保護(hù)想保護(hù)的任何對象。 注意安全性API函數(shù)只被服務(wù)器程序調(diào)用;客戶不需要或直接使用安全性?蛻粼(jīng)看到的Windows NT安全性就是錯誤5。這使得Windows NT安全性可以不必考慮客戶運(yùn)行的軟件。需要的是服務(wù)器在域的安全性數(shù)據(jù)庫中確認(rèn)客戶以及將從客戶收到的請求翻譯成服務(wù)器端函數(shù)調(diào)用的能力。此函數(shù)或者隱含調(diào)用AccessCheck,或者根據(jù)服務(wù)器端AccessCheck的輸出發(fā)送或不發(fā)送其結(jié)果。 Windows NT security中容易混淆的部分是對AccessCheck的調(diào)用可能是非常模糊的。例如,Windows NT監(jiān)控設(shè)備驅(qū)動程序安裝的功能是一個(gè)非常模糊的概念。當(dāng)試圖添加設(shè)備驅(qū)動程序時(shí)用戶要訪問哪個(gè)“對象”?系統(tǒng)在哪里調(diào)用AccessCheck以及必要時(shí)在哪里將錯誤信息顯示給用戶? 在設(shè)備驅(qū)動程序的例子中,答案還不是太困難:因?yàn)樵O(shè)備驅(qū)動程序和系統(tǒng)通過注冊表(Windows NT通過瀏覽注冊表子樹,解釋每個(gè)條目,嘗試執(zhí)行在單獨(dú)注冊表項(xiàng)中指定的驅(qū)動程序二進(jìn)制文件而裝入設(shè)備驅(qū)動程序)交互,Windows NT保護(hù)的對象是注冊表項(xiàng),它在Windows NT中是可以得到的對象。在Win32 API層,任何操作注冊表的嘗試將會翻譯成注冊表工作的函數(shù),例如RegOpenKey內(nèi)部調(diào)用AccessCheck。 除了注冊表保護(hù)外,驅(qū)動程序二進(jìn)制文件也有安全性問題。一個(gè)因訪問注冊表被拒絕而落空的黑客仍然能夠用添加了額外功能的驅(qū)動程序副本取代原有的驅(qū)動程序執(zhí)行文件。這一過程不需要訪問注冊表,所以Windows NT如何防止這類問題呢?相當(dāng)簡單,通過要求驅(qū)動程序二進(jìn)制文件存放在NTFS分區(qū)并限制對其訪問。這樣,取代驅(qū)動程序二進(jìn)制文件的企圖(在Win32 API層上調(diào)用DeleteFile或CreateFile時(shí)不可避免地被終止)會被AccessCheck抓住,惡意的黑客就不走運(yùn)了。 系統(tǒng)提供的其它安全性對象可能難于說明。例如,怎樣阻止用戶訪問被保護(hù)的網(wǎng)絡(luò)共享?怎樣阻止打開遠(yuǎn)程計(jì)算機(jī)上的服務(wù)控制管理器?系統(tǒng)層如何使Windows NT無懈可擊?如何使一些安全性函數(shù)自己失敗返回錯誤5,訪問被拒絕?設(shè)想如果應(yīng)用程序能夠自由操作自己的訪問令牌或調(diào)用安全性函數(shù)改變對象的特權(quán)將會出現(xiàn)什么情況?這種情況下,僅僅修改ACL和令牌中的項(xiàng)目就能夠簡單的繞過安全性。。這樣,必須有某種“元安全性”,一種保護(hù)安全特性自己不被錯誤利用的機(jī)制。如何實(shí)現(xiàn)? 基于AccessCheck的安全性實(shí)現(xiàn)的一個(gè)結(jié)果是安全性嚴(yán)重依賴于只允許以眾所周知的入口點(diǎn)訪問安全性對象的體系結(jié)構(gòu)。例如,Windows 3.1家族操作系統(tǒng)中的文件系統(tǒng)包括許多不同入口點(diǎn):中斷21h(與文件系統(tǒng)交互),中斷13h(與磁盤設(shè)備驅(qū)動交互),以及幾種類型的提供對文件系統(tǒng)訪問的C運(yùn)行庫和Windows API函數(shù)(如OpenFile和_fopen)。從安全性觀點(diǎn)來看,在OpenFile內(nèi)部實(shí)現(xiàn)中調(diào)用AccessCheck這樣的函數(shù)毫無用處,應(yīng)用程序可以簡單的調(diào)用_fopen繞過文件安全性。只有打開文件操作的所有不同調(diào)用都翻譯成一個(gè)“安全性”調(diào)用才行;如果有一個(gè)執(zhí)行安全性檢查而另一個(gè)不執(zhí)行,就會有安全性問題。 16位Windows系統(tǒng)中這種“開放文件系統(tǒng)”結(jié)構(gòu)對提供如加密軟硬件的公司來說是主要的麻煩。 在編寫安全性服務(wù)器程序時(shí),將程序設(shè)計(jì)的無懈可擊是絕對必要的;也就是說,必須防止客戶可以訪問關(guān)鍵數(shù)據(jù)的所有方法。安全性系統(tǒng)的挑戰(zhàn)之一是使關(guān)鍵數(shù)據(jù)無懈可擊。這可能是一件相當(dāng)復(fù)雜的工作,就象前面的例子中,單獨(dú)保護(hù)注冊表入口對于保護(hù)整個(gè)計(jì)算機(jī)的設(shè)備驅(qū)動程序是不夠的。 訪問權(quán)限類型 使用安全性API,系統(tǒng)能夠幫助管制對幾乎任何種類對象的訪問。但“訪問”的含義是什么?是不是談?wù)摂?shù)據(jù)庫字段時(shí)所使用的訪問類型,還是與訪問其它窗口的消息循環(huán)完全不同的某種類型? 這就是為什么“訪問”在安全性API中是一個(gè)相當(dāng)普遍的術(shù)語。不是像“打開、關(guān)閉、讀取和寫入對象的權(quán)限”這種牢固加密的訪問類型,Windows NT中的訪問被定義為掩碼中位的集合。安全性子系統(tǒng)將用戶訪問掩碼中的位與對象訪問掩碼中的位進(jìn)行匹配。例如,這使得我們能夠設(shè)計(jì)一個(gè)員工數(shù)據(jù)庫,管理員可以讀寫工資和獎金的信息,經(jīng)理可以讀但不能寫,其他人不能讀寫訪問。 以相同的方式,應(yīng)用程序能夠定義自己的訪問類型。例如,如果程序想保護(hù)一個(gè)可以共享(從幾個(gè)用戶都能夠調(diào)用函數(shù)操作屏幕上對象的意義上)的OpenGL對象,可以為OpenGL對象能夠完成的所有操作(如旋轉(zhuǎn)、拉伸、反彈和移動)定義唯一的訪問權(quán)限,并且為每個(gè)需要對圖象進(jìn)行操作的用戶指定這些權(quán)限的唯一子集。 安全性API能夠以三組權(quán)限工作:
網(wǎng)絡(luò)的神奇作用吸引著越來越多的用戶加入其中,正因如此,網(wǎng)絡(luò)的承受能力也面臨著越來越嚴(yán)峻的考驗(yàn)―從硬件上、軟件上、所用標(biāo)準(zhǔn)上......,各項(xiàng)技術(shù)都需要適時(shí)應(yīng)勢,對應(yīng)發(fā)展,這正是網(wǎng)絡(luò)迅速走向進(jìn)步的催化劑。 |
溫馨提示:喜歡本站的話,請收藏一下本站!