在我們安裝成功.NET Framework之后,在Windows 2000 Server的管理工具里多了兩項(xiàng)管理工具: Microsoft .NET Framework Configration和Microsoft .NET Framework Wizards。這兩種管理工具要實(shí)現(xiàn)的功能差不多,只不過(guò)Microsoft .NET Framework Wizards是通過(guò)向?qū)Х绞皆O(shè)置,如果您對(duì)于.NET Framewrk的安全性操作不是很熟悉的話,可以使用向?qū)Ц鶕?jù)系統(tǒng)提示一步步的來(lái)設(shè)置相關(guān)的權(quán)限。
Microsoft .NET Framework Wizards界面
Microsoft .NET Framework Wizards界面
使用Microsoft .NET Framework Wizards可以簡(jiǎn)單的設(shè)置.NET Framework的權(quán)限。但是我們?yōu)榱烁玫墓芾砀鱾€(gè)代碼的權(quán)限,還是使用Microsoft .NET Framework Configuration來(lái)詳細(xì)的設(shè)置我們所需的權(quán)限。
(Microsoft .NET Framework Configuration主界面)
在Microsoft .NET Framework Configuration中可以設(shè)置所有關(guān)于.NET Framework的屬性。
點(diǎn)擊我的電腦,打開(kāi)下拉菜單,我們可以看到程序集緩存、已配置程序集、遠(yuǎn)程處理服務(wù)、運(yùn)行庫(kù)安全策略、應(yīng)用程序等五項(xiàng)。運(yùn)行庫(kù)安全策略設(shè)置是我們這篇文章的重點(diǎn)。
我們可以先查看一下程序集緩存,在這里我們可以看到所有的全局程序集緩存,全局程序集緩存中存儲(chǔ)了專門(mén)指定給由計(jì)算機(jī)中若干應(yīng)用程序共享的程序集。在這里我們可以發(fā)現(xiàn)我們可以使用的所有的程序集,同時(shí)也可以添加和刪除某些程序集。詳細(xì)操作請(qǐng)參見(jiàn).NET Framework SDK文檔。
我們?cè)谶@里主要討論的是運(yùn)行庫(kù)安全策略。在此策略中,按層次結(jié)構(gòu)由高到低分為四個(gè)級(jí)別,即:企業(yè)、計(jì)算機(jī)、用戶、應(yīng)用程序。在計(jì)算權(quán)限授予時(shí),運(yùn)行庫(kù)從該層次結(jié)構(gòu)的頂部開(kāi)始,然后向下進(jìn)行計(jì)算。較低的策略級(jí)別不能對(duì)在較高級(jí)別上授予的權(quán)限進(jìn)行增加,但是可以使權(quán)限減少。這就是說(shuō)如果我們將計(jì)算機(jī)策略設(shè)置為較小的權(quán)限時(shí),可以不必更改企業(yè)策略就可以使設(shè)置的權(quán)限生效,也就是說(shuō)權(quán)限檢查的順序是從低級(jí)別到高級(jí)別,只有在低級(jí)別中不存在的設(shè)置才會(huì)檢查上一級(jí)的設(shè)置。默認(rèn)情況下,用戶策略和應(yīng)用程序域策略的限制性小于計(jì)算機(jī)策略和企業(yè)級(jí)策略。大部分默認(rèn)策略存在于計(jì)算機(jī)級(jí)別。所以我們需要將默認(rèn)安裝的主機(jī)的權(quán)限在計(jì)算機(jī)級(jí)別上進(jìn)行修改,修改的內(nèi)容根據(jù)主機(jī)是不是共享主機(jī),主機(jī)應(yīng)用的其他不明代碼的可能性來(lái)設(shè)置。如果是我們討論的共享主機(jī)的話,在計(jì)算機(jī)級(jí)別上就盡量將權(quán)限設(shè)的小一些,為了避免我們討論的文件系統(tǒng)安全問(wèn)題,一定要注意權(quán)限中的本地磁盤(pán)訪問(wèn)權(quán)限。
我們打開(kāi)計(jì)算機(jī)策略設(shè)置可以發(fā)現(xiàn)幾個(gè)默認(rèn)的代碼組、權(quán)限集和策略程序集。
根據(jù)需要,我們可以添加代碼組和自定義的權(quán)限集。
在添加代碼組的時(shí)候可以選擇幾種條件,主要的條件類(lèi)型:默認(rèn)為All Code、應(yīng)用程序目錄、哈希、強(qiáng)名稱、作者、站點(diǎn)等。
對(duì)于我們所要討論的共享主機(jī),我們需要將My_Computer_Zone下的All Code的權(quán)限更改為不能進(jìn)行磁盤(pán)讀寫(xiě),在更改之前,我們需要先定義一個(gè)權(quán)限集。這一權(quán)限集的作用就是將我們需要點(diǎn)擊權(quán)限集,右鍵快捷菜單中選擇新建,會(huì)出現(xiàn)一個(gè)創(chuàng)建權(quán)限集的窗口,這里需要給我們新建的權(quán)限集命名。下一步就是將單個(gè)權(quán)限分配給權(quán)限集。如下圖所示。
在這里我們可以給這個(gè)新建的權(quán)限集賦予一個(gè)的系統(tǒng)權(quán)限,如上圖所示,可用的權(quán)限包括:目錄服務(wù)、DNS、事件日志、環(huán)境變量、文件IO、OLEDB數(shù)據(jù)庫(kù)操作、注冊(cè)表等等。我們主要要說(shuō)明的是文件IO操作,其他的權(quán)限操作可以根據(jù)自己的需求來(lái)設(shè)置。這里我們就不再說(shuō)明了。
在文件IO的權(quán)限設(shè)置中我們可以自定義針對(duì)每一個(gè)目錄的權(quán)限,這里包括讀、寫(xiě)、追加、路徑盤(pán)等操作,在這里我們可以將我們需要的目錄權(quán)限添加到列表中。因?yàn)槲覀兪抢眠@一權(quán)限使所有沒(méi)有配置權(quán)限的代碼不可以進(jìn)行文件IO操作,所以我們不強(qiáng)文件IO添加到分配的權(quán)限中。
新建了這一權(quán)限集后,我們更改一下默認(rèn)設(shè)置,即將All Code的權(quán)限設(shè)置為此新建的權(quán)限集,也就是說(shuō)所有沒(méi)有在此定義代碼都不能訪問(wèn)文件IO系統(tǒng)。
這里需要注意一件事情,因?yàn)镸icrosoft .NET Framework Configuration本身也需要文件IO權(quán)限,如果沒(méi)有單獨(dú)分配給Configuration一個(gè)文件IO操作權(quán)限的話,那么您就不能再次使用Configuration來(lái)設(shè)置權(quán)限了,只能重新安裝.NET Framework了。所以我們需要將FullTrust權(quán)限分配給Configuration所使用的Dll,即mscorcfg.dll。在添加時(shí),成員條件可以選擇強(qiáng)名稱,使用"導(dǎo)入",到winnt/window .net/framework/versionnumber/下選擇mscorcfg.dll。如果需要運(yùn)行其他配置程序,還需要設(shè)置相應(yīng)的權(quán)限,這些系統(tǒng)程序一般都在系統(tǒng)程序集緩存中。
這樣我們就完成了一個(gè)簡(jiǎn)單的設(shè)置,可以防止任何未經(jīng)驗(yàn)證的代碼訪問(wèn)文件IO系統(tǒng)。這樣就從根本上防止了磁盤(pán)惡意操作。
如果您今后需要利用這一功能或者有共享主機(jī)用戶需要使用文件IO功能,那么您可以在Microsoft .NET Framework Configuration中將其加入代碼,如果不能使其使用其他功能,可以僅僅設(shè)置一個(gè)只具有文件IO權(quán)限的權(quán)限集。如果是共享主機(jī)用戶您還可以給他分配直接到其所使用的目錄的全部讀寫(xiě)權(quán)限,對(duì)于他的日志文檔,您可以將讀功能分配給用戶。通過(guò)上邊新建權(quán)限集時(shí)我們可以發(fā)現(xiàn):權(quán)限集可以規(guī)定到每一個(gè)目錄的讀寫(xiě)權(quán)限,所以可以將用戶鎖定于其可以使用的目錄中。當(dāng)然對(duì)于共享主機(jī)提供商來(lái)說(shuō),最好的方法就是自己實(shí)現(xiàn)這些功能,然后配置權(quán)限系統(tǒng)使用戶使用共享主機(jī)提供商的程序來(lái)實(shí)現(xiàn)他們的正常操作,而避免了惡意文件操作。
需要注意的是如果分配給每一個(gè)單獨(dú)的程序相應(yīng)的權(quán)限時(shí),我們最好使用強(qiáng)名稱這一方式或者其他的可驗(yàn)證方式,強(qiáng)名稱由程序集的標(biāo)識(shí)--其簡(jiǎn)單文本名稱、版本號(hào)和區(qū)域性信息(如果提供)--加上公鑰和數(shù)字簽名組成。這就需要我們使用Sn.exe 來(lái)設(shè)置密鑰、簽名和簽名驗(yàn)證。強(qiáng)名稱保證了程序是開(kāi)發(fā)人員開(kāi)發(fā)的并且沒(méi)有被改動(dòng)。
在進(jìn)行上面的設(shè)置之后,管理員可以根據(jù)用戶的各種需求來(lái)設(shè)置不同的代碼集和權(quán)限集。
我們已經(jīng)簡(jiǎn)單的介紹了一下ASP.NET中關(guān)于文件IO系統(tǒng)的漏洞的防治方法,這一方法有些繁瑣,但是卻可以從根本上杜絕一些漏洞,由于.NET的JIT(運(yùn)行時(shí)編譯)和IL(中間語(yǔ)言),.NET可以在程序編譯時(shí)檢查程序的安全性設(shè)置,所以能從根本上防止一些非法訪問(wèn)。.NET的代碼安全性的內(nèi)容很全面,我們討論的只是很少的一部分,更多的功能需要大家共同來(lái)探索、學(xué)習(xí)。