


SQL Server中CLR安全性詳解
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)代碼能夠以良好定義的方式來存取內(nèi)存結(jié)構(gòu);
(2)基于角色的安全-根據(jù)由誰運(yùn)行代碼;
(3)代碼存取安全-在這種情況下,許可權(quán)的授予是基于代碼特征而不是基于誰在運(yùn)行代碼;
(4)應(yīng)用程序域-它提供在宿主進(jìn)程中實(shí)現(xiàn)安全執(zhí)行地帶。
在數(shù)據(jù)庫中的所有具有相同所有者的程序集都被加載到同一個(gè)AppDomain中,不管它們被安裝到哪個(gè)數(shù)據(jù)庫中。在一個(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)容。
2.代碼存取安全性
CLR提供的最重要的服務(wù)之一是代碼存取安全性(CAS)。CAS的基本原則是,為代碼賦予特權(quán),而不是針對用戶。如果你已習(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ù)來把該程序集指派給一個(gè)或多個(gè)代碼組。每一個(gè)被指派的代碼組都有一個(gè)通過某種運(yùn)行時(shí)刻安全策略(使用會(huì)員條件來決定代碼被指派到哪里)指派的權(quán)限 集。一種權(quán)限相應(yīng)于操作被保護(hù)的內(nèi)容的一種權(quán)力。總之,代碼要求調(diào)用者必須擁有某種許可權(quán)才可以執(zhí)行特定的行為。
如果這些對于你來說都是陌生概念,那么你需要首先對開發(fā)安全的應(yīng)用程序的這些極其重要的部分有個(gè)透徹了解為好。而且,對于理解SQLCLR代碼在執(zhí)行時(shí)所具有的許可權(quán)來說,理解CAS是最關(guān)鍵的。
那么,SQL Server是如何把SQL Server和CLR安全環(huán)境融合到一起的呢?要理解的第一事情是,這些系統(tǒng)保護(hù)著兩個(gè)資源集合。第一個(gè)集合包含SQL Server對象和數(shù)據(jù)。SQL Server的安全環(huán)境保護(hù)對它自己的對象的存取,甚至包括對它所宿主的SQLCLR代碼的保護(hù)。
CLR保護(hù)對于其它一切的存取。這"其它一切"是指什么呢?是指在SQL Server實(shí)例外部的資源,包括磁盤文件、注冊表設(shè)置、其它的數(shù)據(jù)庫、網(wǎng)絡(luò)資源和Web服務(wù)。這意味著,對于保護(hù)在它的宿主SQL Server實(shí)例內(nèi)的任何內(nèi)容來說,CAS什么也沒有做。
現(xiàn)在,讓我們稍作停頓再作進(jìn)一步考慮。讓我們先搞明白,哪種安全系統(tǒng)保護(hù)哪些關(guān)鍵內(nèi)容。當(dāng)然,我們也可以用另一種方式來描述同樣的事情:在SQL Server內(nèi)授予的許可權(quán)保護(hù)它的所有的數(shù)據(jù)和對象以免為任何類型的執(zhí)行代碼所調(diào)用,而不管這些代碼是用T-SQL或是用SQLCLR編寫。CLR的 CAS保護(hù)對于SQL Server外部所有資源的存取。
這樣以來,一個(gè)必然的結(jié)論就是:對于保護(hù)一個(gè)SQL Server實(shí)例的對象或數(shù)據(jù)來說,CAS什么也不沒有做。
現(xiàn)在,我們 將更為詳細(xì)地討論關(guān)于CAS的問題。但是,請記住,現(xiàn)在我們所討論的許可權(quán)問題并不是在SQL Server內(nèi)部的那種,而是在外部-在操作系統(tǒng)中的許可權(quán)。例如,比方說SQLCLR代碼不得不打開一個(gè)磁盤文件來記錄一些日志數(shù)據(jù),或進(jìn)行連接以從另 一個(gè)數(shù)據(jù)庫讀取數(shù)據(jù)。CAS許可權(quán)限制代碼能夠存取該磁盤文件的方式以及到其它數(shù)據(jù)庫的連接方式。
為了運(yùn)行某種方法,無論何時(shí)CLR裝 載一個(gè)程序集,它都要收集關(guān)于該程序集的與在該機(jī)器上定義的策略相匹配的證據(jù)以便授予其相應(yīng)的許可權(quán)。典型地,對于.NET程序集的證據(jù)通常包括位置(原 始)數(shù)據(jù)(程序集從這里運(yùn)行)和身份數(shù)據(jù)。但是,既然一個(gè)SQLCLR程序集從SQL Server內(nèi)部運(yùn)行,那么,位置證據(jù)基本上是不相關(guān)的。這樣以來,只剩下了身份證據(jù),例如是否該程序集擁有一個(gè)強(qiáng)名字或者是經(jīng)過一家特定公司進(jìn)行數(shù)字簽 名的。
CLR收集該證據(jù),然后與四種策略級(jí)別(企業(yè),機(jī)器,用戶和AppDomain)加以比較。(SQL Server文檔經(jīng)常調(diào)用AppDomain級(jí)別"Host Policy",但這是一回事。在.NET框架中,AppDomain是更為典型的術(shù)語,我經(jīng)常使用它)。由CLR授予給一個(gè)程序集的實(shí)際的許可權(quán)集是在 每一個(gè)級(jí)別上授予的許可權(quán)的交集。
這四種級(jí)別中的每一種都有其自己的許可權(quán)集合。為了決定授予給一個(gè)程序集的許可權(quán)集,CLR使用這些許可權(quán)的交集-也即是,各種許可權(quán)集的公共集合,并且把這個(gè)交集授予給該程序集。
你可以使用.NET框架2.0配置工具來分析前三種策略級(jí)別:企業(yè),機(jī)器和用戶。當(dāng)你展開TreeView控件的運(yùn)行時(shí)刻安全策略部分時(shí)顯示策略級(jí)別。
在此,一個(gè)用戶或系統(tǒng)管理員能夠修改顯示的級(jí)別的默認(rèn)策略,這樣以來,一個(gè)程序集在其加載時(shí)就擁有更多或更少的許可權(quán)。這可能是個(gè)比較復(fù)雜的主題,但是 對于SQLCLR代碼來說,事實(shí)上,所有的安裝在本地機(jī)器上的.NET代碼,這三種策略級(jí)別默認(rèn)地都把"完全信任"指派給一個(gè)程序集。"完全信任"僅僅意 味著,代碼自動(dòng)地?fù)碛忻恳环N可能的權(quán)限。更精確地說,它意味著,CLR并不進(jìn)行任何權(quán)限檢查。
如果程序集默認(rèn)地?fù)碛袡z查"短路"的許可權(quán),那么為什么我建議你讀取所有關(guān)于CAS的內(nèi)容呢?
理由是,CLR共使用四種策略級(jí)來指派許可權(quán),但是只有其中三種能夠使用的工具來進(jìn)行配置。第四種是AppDomain級(jí)別,該級(jí)別是當(dāng)你把一個(gè)程序集 安裝到一個(gè)數(shù)據(jù)庫時(shí)創(chuàng)建的。該策略級(jí)別由SQL Server控制作為CLR宿主。而且,SQL Server極少會(huì)授予一個(gè)程序集完全許可權(quán)信任,因?yàn)檫@對于安全性和可靠性都可能意味著極度的冒險(xiǎn)。
默認(rèn)情況下在SQLCLR代碼所 發(fā)生的實(shí)際情況(記住,一個(gè)用戶或系統(tǒng)管理員都能夠修改企業(yè)、機(jī)器和用戶級(jí)上的策略設(shè)置)。因?yàn)槠髽I(yè)、機(jī)器和用戶策略級(jí)別都授予完全信任權(quán)限,他們具有相 同的結(jié)果權(quán)限集-所有的許可權(quán)。該權(quán)限集與AppDomain權(quán)限集相交的結(jié)果就是程序集許可權(quán)集。
關(guān)鍵字:SQL Server、安全性、數(shù)據(jù)庫
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解