全面講解CLR安全性
大家都知道CLR是公共運(yùn)行庫(kù)語(yǔ)言,現(xiàn)在給大家分析一下關(guān)于CLR安全性,代碼存取安全性的原理機(jī)制。
一、 CLR安全性
在第一篇中,我們已經(jīng)討論了宿主于和在SQL Server內(nèi)執(zhí)行的.NET代碼的安全環(huán)境-從SQL Server的角度來(lái)觀察SQLCLR代碼模塊。但是CLR使用其自己的安全模型。一旦SQL Server同意進(jìn)行所有的許可權(quán)檢查并且允許代碼執(zhí)行,那么這種模型就會(huì)"強(qiáng)制介入"。僅僅因?yàn)樗軌驁?zhí)行并不意味著它能夠做它想做的任何事情。
CLR提供給它運(yùn)行的.NET代碼和它運(yùn)行的主機(jī)許多服務(wù)。這些服務(wù)包括:
1)類型安全檢查-校驗(yàn)代碼能夠以良好定義的方式來(lái)存取內(nèi)存結(jié)構(gòu);
2)基于角色的安全-根據(jù)由誰(shuí)運(yùn)行代碼;
3)代碼存取安全-在這種情況下,許可權(quán)的授予是基于代碼特征而不是基于誰(shuí)在運(yùn)行代碼;
4)應(yīng)用程序域-它提供在宿主進(jìn)程中實(shí)現(xiàn)安全執(zhí)行地帶。
在數(shù)據(jù)庫(kù)中的所有具有相同所有者的程序集都被加載到同一個(gè)AppDomain中,不管它們被安裝到哪個(gè)數(shù)據(jù)庫(kù)中。在一個(gè)AppDomain中的每一個(gè)程序集都能夠通過反射找到另外每一個(gè)其它程序集。既然它們具有相同的所有者,所以SQL Server不必執(zhí)行它自己的權(quán)限檢查,這有助于性能的改進(jìn)。但是這些措施并不能解決實(shí)際存在的代碼存取安全問題。
CLR還強(qiáng)制實(shí)行宿主保護(hù)屬性(HPA)-允許一個(gè)宿主(在此情況下,是指SQL Server)控制允許SQLCLR代碼使用.NET框架的指定部分。其實(shí),在可靠性方面,還有除了安全性外的其它方面的內(nèi)容。
二、CLR安全性之代碼存取安全性
CLR提供的最重要的服務(wù)之一是代碼存取安全性(CAS)。CAS的基本原則是,為代碼賦予特權(quán),而不是針對(duì)用戶。如果你已習(xí)慣于Windows或SQL Server模式的把許可權(quán)賦予用戶和登錄而不是它們正在執(zhí)行的代碼,這聽上去似乎有些奇怪。但是,就算SQLCLR代碼在一個(gè)管理用戶的安全上下文下執(zhí)行,它也可能不具有所有可用的許可權(quán)。事實(shí)上,在SQL Server內(nèi)部執(zhí)行的SQLCLR代碼幾乎一定不會(huì)擁有所有許可權(quán)-這稱為"完全信任"。
下面是一些有關(guān)于CAS工作的基本知識(shí)。當(dāng)加載一個(gè)程序集以響應(yīng)一個(gè)SQLCLR存儲(chǔ)過程、函數(shù)或其它代碼模塊的調(diào)用時(shí),由CLR負(fù)責(zé)搜集證據(jù)。它使用該證據(jù)來(lái)把該程序集指派給一個(gè)或多個(gè)代碼組。每一個(gè)被指派的代碼組都有一個(gè)通過某種運(yùn)行時(shí)刻安全策略(使用會(huì)員條件來(lái)決定代碼被指派到哪里)指派的權(quán)限集。一種權(quán)限相應(yīng)于操作被保護(hù)的內(nèi)容的一種權(quán)力??傊?,代碼要求調(diào)用者必須擁有某種許可權(quán)才可以執(zhí)行特定的行為。
如果這些對(duì)于你來(lái)說都是陌生概念,那么你需要首先對(duì)開發(fā)安全的應(yīng)用程序的這些極其重要的部分有個(gè)透徹了解為好。而且,對(duì)于理解SQLCLR代碼在執(zhí)行時(shí)所具有的許可權(quán)來(lái)說,理解CAS是最關(guān)鍵的。
那么,SQL Server是如何把SQL Server和CLR安全環(huán)境融合到一起的呢?要理解的第一事情是,這些系統(tǒng)保護(hù)著兩個(gè)資源集合。第一個(gè)集合包含SQL Server對(duì)象和數(shù)據(jù)。SQL Server的安全環(huán)境保護(hù)對(duì)它自己的對(duì)象的存取,甚至包括對(duì)它所宿主的SQLCLR代碼的保護(hù)。
CLR保護(hù)對(duì)于其它一切的存取。這"其它一切"是指什么呢?是指在SQL Server實(shí)例外部的資源,包括磁盤文件、注冊(cè)表設(shè)置、其它的數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)資源和Web服務(wù)。這意味著,對(duì)于保護(hù)在它的宿主SQL Server實(shí)例內(nèi)的任何內(nèi)容來(lái)說,CAS什么也沒有做。
現(xiàn)在,讓我們稍作停頓再作進(jìn)一步考慮。讓我們先搞明白,哪種安全系統(tǒng)保護(hù)哪些關(guān)鍵內(nèi)容。當(dāng)然,我們也可以用另一種方式來(lái)描述同樣的事情:在SQL Server內(nèi)授予的許可權(quán)保護(hù)它的所有的數(shù)據(jù)和對(duì)象以免為任何類型的執(zhí)行代碼所調(diào)用,而不管這些代碼是用T-SQL或是用SQLCLR編寫。CLR的CAS保護(hù)對(duì)于SQL Server外部所有資源的存取。
這樣以來(lái),一個(gè)必然的結(jié)論就是:對(duì)于保護(hù)一個(gè)SQL Server實(shí)例的對(duì)象或數(shù)據(jù)來(lái)說,CAS什么也不沒有做。
【編輯推薦】