科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道剖析SQL Server2005 SQLCLR代码安全性

剖析SQL Server2005 SQLCLR代码安全性

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在SQL Server 2005内运行.NET框架代码是一件令人激动的事情还是一种威胁?本系列文章将全面探讨这类SQLCLR代码的安全问题,以便开发人员和DBA都能够有所借鉴。

作者:朱先忠编译 来源:天极开发 2007年10月22日

关键字: SQL Server

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

二、 安全宿主SQLCLR代码

  随着SQLCLR代码的引入,SQL Server 2005现在支持两种完全不同的运行时刻环境:好的旧的可靠的T-SQL和新的正在发展中的SQLCLR。在过去的几年中,T-SQL随着SQL Server版本的不断升级而不断发展,并且与存储在一个数据库中的数据和对象紧密集成到一起,也与SQL Server中的安全系统良好地集成。相比之下,SQLCLR代码,在内部使用了一种由CLR所提供的完全不同的安全系统,这是一种"温暖的"、安全的环境。在此环境下,代码的运行不是基于运行它的用户的安全资格而是基于代码本身的安全资格。同时,SQLCLR代码必须在数据库和服务器的安全范围内执行;然而,这两种安全系统是根本不同的。如今,微软的SQL Sever开发小组已经研究出一种方法使得这二者共存并能够协同工作。

  能够在另外一个应用程序中可靠地安全地宿主CLR是.NET框架2.0的一种新特征。这种宿主环境及其SQL Server实现,正是使得这两种安全系统和平共处的"秘密"所在,因为宿主(在此是SQL Server)能够很大程度地控制运行的代码。这意味着,从一种安全角度来看,托管SQLCLR代码不被允许存取没有授权给它的数据库对象。该代码必须运行于用户会话的SQL Server安全上下文中,而且需要使用相关的与T-SQL代码相同的许可权来激活它。

  注意 底线是,在一个数据库中,SQLCLR代码不能做比在相同的安全上下文中等价的T-SQL代码模块更多的事情。

  当设计怎样宿主CLR时,微软具有三个主要的设计目标:

  · CLR及运行于其中的代码不能妥协于SQL Server的安全性和稳定性。

  · SQLCLR代码必须遵循SQL Server认证和授权规则。这在一定程度上意味着,它要运行于用户会话的安全上下文中。

  · 系统管理员必须能够控制对操作系统资源的存取。这意味着,必须存在一种安全的方式来从SQL Server进程中存取机器资源。

  这些目标的最明显的表现之一是,默认情况下,CLR集成是关闭的。如果你想在一个数据库中运行.NET代码,那么一个系统管理员必须把它打开。打开它的T-SQL代码需要使用sp_configure:

sp_configure 'clr enabled',1
GO
RECONFIGURE
GO

  当然,你还可以使用新的与SQL Server 2005一起安装的Surface Area配置工具来实现这一点,如图1所示。从Windows开始菜单下,选择"Microsoft SQL Server 2005→Configuration Tools→SQL Server Surface Area Configuration",再选择"Surface Area Configuration for Features",然后从列表下选择"CLR Integration"。


图1.Surface Area配置工具-该图展示了怎样使用Surface Area配置工具来启动SQLCLR。

  因此,正确理解开关CLR集成特征的含义是十分重要的;然而,它唯一影响的是,是否允许在存储过程、触发器、用户定义类型及用户定义函数中运行SQLCLR代码。如果它被禁用,那么,在该服务器实例中不会执行SQLCLR代码;如果它被启动,那么,任何CLR代码都可以执行(当然,假定用户拥有正确的执行权限)。如果它被禁用,它不会阻止你把SQLCLR程序集安装到数据库中。你可以安装所有你想使用的程序集(当然,假定你拥有这样做的属性许可权),但是它们在任何环境下都不会运行,直到你支持CLR集成为止。

  当SQLCLR代码执行时,它是在一个严格的安全环境中-这是一个既能保护操作系统资源又能保护SQL Server中的数据和对象的层。


图2.安全层:SQLCLR代码并非运行于一个安全真空中。

  图2显示了这些安全层。操作系统强制性使用它自己的控制-使用熟悉的用户和组模式以同意存取具有存取控制列表(ACL)的资源。在Windows中运行的每一个应用程序都需要运行于一个登录安全的上下文-它具有适当的许可权来进行资源存取。即使SQL Server也必须在这一框架内运作。

  通过使用它自己的登录机制或者映射到操作系统的登录机制,SQL Server控制它自己的环境的安全性。在它的环境内,基于由对象的所有者或管理员所赋予的许可权,它授予或禁止存取数据和对象。T-SQL也在这种权限模式下操作。SQLCLR代码在相同的安全环境下以T-SQL代码形式执行,而且在由CLR所提供的它自己的安全环境下执行。CLR实现代码存取安全(CAS)以授予它自己的许可权来运行代码。在后面部分,在讨论其它一些有关于SQL Server主机环境的安全细节问题之后,我们将更为深入地分析一下CAS。

  三、 SQL Server级的安全性

  与早期的SQL Server版本相比,SQL Server 2005实现一种更具有粒度性的许可权模式。这种粒度延伸到SQLCLR代码内-对于该代码来说,需要使用三种主要的许可权来安装和运行该代码。

  · 需要使用CREATE ASSEMBLY权限来运行CREATE ASSEMBLY语句(这个语句把一个SQLCLR程序集安装到一个数据库中)。

  · 为了运行代码,一名非系统管理员必须具有在一个代码模块上的EXECUTE权限;而一个sysadmin能够运行任何代码。

  · 代码的所有者必须具有REFERENCES权限以参考其它对象,例如使用外键和使用模式绑定创建视图(运行位于同一个.NET程序集中的代码不需要这种权限)。

  除了这些许可权外,引起SQLCLR代码执行的用户在登录时必须对代码参考的数据库表拥有通常的SELECT,INSERT,DELETE,或UPDATE许可权。无法实现这样的目标:根据代码对数据库表中的数据所实行的操作,使得宿主于SQL Server 2005内的SQLCLR能够避开这些许可权需要。而且,该权限检查还"钩入"(hook into)SQL Server 2005中的新的执行上下文特征,以便当定义一个SQLCLR存储过程或函数时,你可以使用EXECUTE AS语句指定代码的执行上下文。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章