SQL Server2005 SQLCLR代码之CLR安全

2016-01-29 16:07 8 1 收藏

SQL Server2005 SQLCLR代码之CLR安全,SQL Server2005 SQLCLR代码之CLR安全

【 tulaoshi.com - SQLServer 】

 一、 CLR安全性

  在第一篇中,我们已经讨论了宿主于和在SQL Server内执行的.NET代码的安全环境-从SQL Server的角度来观察SQLCLR代码模块。但是CLR使用其自己的安全模型。一旦SQL Server同意进行所有的许可权检查并且允许代码执行,那么这种模型就会"强制介入"。仅仅因为它能够执行并不意味着它能够做它想做的任何事情。

  CLR提供给它运行的.NET代码和它运行的主机许多服务。这些服务包括:

  1)类型安全检查-校验代码能够以良好定义的方式来存取内存结构;

  2)基于角色的安全-根据由谁运行代码;

  3)代码存取安全-在这种情况下,许可权的授予是基于代码特征而不是基于谁在运行代码;

  4)应用程序域-它提供在宿主进程中实现安全执行地带。

  在数据库中的所有具有相同所有者的程序集都被加载到同一个AppDomain中,不管它们被安装到哪个数据库中。在一个AppDomain中的每一个程序集都能够通过反射找到另外每一个其它程序集。既然它们具有相同的所有者,所以SQL Server不必执行它自己的权限检查,这有助于性能的改进。但是这些措施并不能解决实际存在的代码存取安全问题。

  CLR还强制实行宿主保护属性(HPA)-允许一个宿主(在此情况下,是指SQL Server)控制允许SQLCLR代码使用.NET框架的指定部分。其实,在可靠性方面,还有除了安全性外的其它方面的内容。

  二、 代码存取安全性

  CLR提供的最重要的服务之一是代码存取安全性(CAS)。CAS的基本原则是,为代码赋予特权,而不是针对用户。如果你已习惯于Windows或SQL Server模式的把许可权赋予用户和登录而不是它们正在执行的代码,这听上去似乎有些奇怪。但是,就算SQLCLR代码在一个管理用户的安全上下文下执行,它也可能不具有所有可用的许可权。事实上,在SQL Server内部执行的SQLCLR代码几乎一定不会拥有所有许可权-这称为"完全信任"。

  下面是一些有关于CAS工作的基本知识。当加载一个程序集以响应一个SQLCLR存储过程、函数或其它代码模块的调用时,由CLR负责搜集证据。它使用该证据来把该程序集指派给一个或多个代码组。每一个被指派的代码组都有一个通过某种运行时刻安全策略(使用会员条件来决定代码被指派到哪里)指派的权限集。一种权限相应于操作被保护的内容的一种权力。总之,代码要求调用者必须拥有某种许可权才可以执行特定的行为。

  如果这些对于你来说都是陌生概念,那么你需要首先对开发安全的应用程序的这些极其重要的部分有个透彻了解为好。而且,对于理解SQLCLR代码在执行时所具有的许可权来说,理解CAS是最关键的。

  那么,SQL Server是如何把SQL Server和CLR安全环境融合到一起的呢?要理解的第一事情是,这些系统保护着两个资源集合。第一个集合包含SQL Server对象和数据。SQL Server的安全环境保护对它自己的对象的存取,甚至包括对它所宿主的SQLCLR代码的保护。

  CLR保护对于其它一切的存取。这"其它一切"是指什么呢?是指在SQL Server实例外部的资源,包括磁盘文件、注册表设置、其它的数据库、网络资源和Web服务。这意味着,对于保护在它的宿主SQL Server实例内的任何内容来说,CAS什么也没有做。

  现在,让我们稍作停顿再作进一步考虑。让我们先搞明白,哪种安全系统保护哪些关键内容。当然,我们也可以用另一种方式来描述同样的事情:在SQL Server内授予的许可权保护它的所有的数据和对象以免为任何类型的执行代码所调用,而不管这些代码是用T-SQL或是用SQLCLR编写。CLR的CAS保护对于SQL Server外部所有资源的存取。

  这样以来,一个必然的结论就是:对于保护一个SQL Server实例的对象或数据来说,CAS什么也不没有做。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

来源:https://www.tulaoshi.com/n/20160129/1497508.html

延伸阅读
SSIS(SQL Server Integration Service)是在SQL Server2000的DTS的基础上做的一个非常大的改进的新工具。采用了数据流和控制流分离,设计和部署分离的架构设计,引入了更多新的转换,终于向着专业级的ETL工具迈了一大部。 由于相对DTS的改进非常大,开发和使用SSIS也就显得比DTS略显复杂。但是对于大型项目,实际上SSIS比DTS要简单的...
CTE是Common Table Expression的简写,翻译成中文就是通用表表达式,它可以在select,insert或者update中使用。 为了说明问题,我们先随便建张表,插入几条数据: if object_id('t','U') is not null --用object_id函数判断表是否在数据库中存在很简洁 drop table t; GO create table t(c1 int,c2 decimal,c3 ...
I/O吞吐量小,形成了瓶颈效应。 没有创建计算列导致查询不优化。 内存不足。 网络速度慢。 查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)。 锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)。 sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。 返回了不必要的行和列。 查...
标签: SQLServer
通用表表达式(CTEs)是SQL Server 2005的一项新功能。它们类似于alias(如在SELECT T1.* FROM MyTable T1中),不过功能更为强大。本质上,CTE是一个临时结果集,它仅仅存在于它发生的语句中。您可以在SELECT、INSERT、DELETE、UPDATE或CTEATE VIEW语句中建立一个CTE。CTE类似于派生表,但拥有几项优点。 CTE的优点 与派生表不同,CTE能...
标签: SQLServer
对一个密码进行追踪非常简单,但是追踪几十或者甚至是上百个密码就是一个问题了。很难以及这么多的密码,但是把这些密码都写下来却有悖首要的保证密码离散的目标。 KeePass 密码安全是一个新的开源/免费软件项目,它运行在32位的Windows系统上。它的设计目标就是为了帮助人们管理并保护各种类型的密码。一个人或者一个组织可以在程序中存储任...

经验教程

356

收藏

27
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部