使用SQL CLR的安全或性能风险


11

在SQL Server中使用CLR是否有任何特定的安全或性能风险?


不,与在相同安全上下文下运行的等效T-SQL代码模块相比,SQLCLR代码在数据库中无能为力。无视禁止CLR还会阻止SSISDB部署,这通过减少RDP帐户,减少文件系统管理和减少权限需求,维护计划内部的备份继承,通过TDE进行完全软件包加密来极大地提高了安全性,更不用说通过环境部分进行SSIS软件包部署和维护了。 SSISDB的特性,并且SSIS中缺少许多C#函数,需要CLR。
Bryan Swan

1
我已投票决定重新提出这个问题,因为我认为这与社区息息相关。就目前的情况而言,这是一个有效的问题,因为DBA进入CLS安全设置的条目级别很高。@SolomonRutzky精心编写的答案很好地介绍了CLR的安全设置,Microsoft在此简化级别中未提供此设置。
约翰又名hot2use

Answers:


10

正如Remus指出的那样,这个问题太笼统,无法获得答案,因为答案取决于要使用什么功能以及如何使用它的上下文。

关于“安全性”:

如果您要询问在标PERMISSION_SET = SAFE有的程序集中可以做的任何事情,那么我没有发现任何问题。而且,SQLCLR比使用xp_cmdshell或出色的(那是讽刺的)sp_OA*过程(甚至扩展存储过程,甚至是扩展存储过程,但希望没有人再创建这些过程)“更安全” 。

如果您想逐步了解“ SAFE”的实际含义,请参阅本文:SQLCLR级别3:安全性(常规和SAFE程序集)的阶梯(需要免费注册)。

如果您询问在标PERMISSION_SET = EXTERNAL_ACCESS有的程序集中可以执行的任何操作,那么根据所使用的功能,当然也存在风险。如果编写一个例程来读取目录和文件名(即只读),那么这只是应该看到和不看到什么的问题。如果您正在编写允许删除文件的代码,则风险会增加。但是,可以与外部资源来实现由控制:

  • 是否正在使用模拟功能:
    • 否模拟表示访问外部资源是通过SQL Server服务的“登录身份”帐户完成的。无论该帐户有权访问什么,您的SQLCLR函数都将能够执行。
    • 使用“模拟”意味着运行该功能的SQL Server中的登录名(如果该登录名对应于Windows登录名)可以执行允许该特定Windows登录名执行的任何操作。如果SQL Server中的登录名是SQL Server登录名,则尝试使用模拟功能将收到错误消息。
  • 在外部资源上设置了哪些权限。对于文件系统访问,这是通过NTFS驱动器上的ACL控制的。

如果您询问在标有的程序集中可以执行的任何操作 PERMISSION_SET = UNSAFE,这是开放式的。许多功能仅在UNSAFE组件中可用,因为它们是稳定性和/或一致行为的问题,而不是安全性或性能。例如,在UNSAFE程序集中,可以有一个可写的静态变量。这通常不是一件好事,因为在所有会话之间共享SQLCLR类。如果您打算在所有会话中共享内存中的数据,并已针对竞争条件进行了计划(并进行了大量测试),那么您会很好,因为您期望这种行为。但是,如果您只是想要一个可写的静态变量来缓存特定会话的值,而不必再次查找或重新计算它,并且不知道其他会话正在读取该值并可能会覆盖它,那么,那将是一个问题。

但是,如果您担心有人在写注册表,而又没有实际写在注册表中的代码,那么您可能不必担心这一点;-)。

如果您想逐步了解EXTERNAL_ACCESS和UNSAFE的实际工作方式,以及设置TRUSTWORTHY ON(非首选)与使用基于非对称密钥或基于证书的登录名之间的区别,请参阅本文:SQLCLR级别4的阶梯:安全性(外部和不安全组件)(需要免费注册)。

关于“性能”:

这完全取决于您要做什么以及如何进行。在SQLCLR 中有些事情快得多,而有些事情要慢一些。但是,就像使用T-SQL一样,可以通过执行错误操作来执行一些简单和/或高效的任务,并使其变得复杂和/或低效。但是,就其本质而言,使用SQL CLR并非固有地较慢。


6

SQLCLR组件可以用三个层次的安全访问安装:SAFE | EXTERNAL_ACCESS | UNSAFE。详细记录了此文件,请参考CREATE ASSEMBLY设计组件

管理程序集安全性
您可以控制程序集在运行托管代码时可以访问.NET代码访问安全性保护的资源的数量。通过在创建或修改程序集时指定三个权限集之一来执行此操作:SAFE,EXTERNAL_ACCESS或UNSAFE。

SAFE
SAFE是默认权限集,它是限制性最强的。具有SAFE权限的程序集运行的代码无法访问外部系统资源,例如文件,网络,环境变量或注册表。SAFE代码可以访问本地SQL Server数据库中的数据,或者执行不涉及访问本地数据库外部资源的计算和业务逻辑。
大多数程序集执行计算和数据管理任务,而无需访问SQL Server外部的资源。因此,我们建议将SAFE作为组装许可集。

EXTERNAL_ACCESS
EXTERNAL_ACCESS允许程序集访问某些外部系统资源,例如文件,网络,Web服务,环境变量和注册表。只有具有EXTERNAL ACCESS权限的SQL Server登录名才能创建EXTERNAL_ACCESS程序集。SAFE和EXTERNAL_ACCESS程序集只能包含可验证类型安全的代码。这意味着这些程序集只能通过对类型定义有效的定义明确的入口点访问类。因此,它们不能任意访问该代码不拥有的内存缓冲区。此外,他们无法执行可能对SQL Server进程的健壮性产生不利影响的操作。

UNSAFE
UNSAFE使程序集可以不受限制地访问SQL Server内部和外部的资源。在UNSAFE程序集中运行的代码可以调用非托管代码。同样,指定UNSAFE允许程序集中的代码执行CLR验证程序认为类型不安全的操作。这些操作可能会以不受控制的方式访问SQL Server进程空间中的内存缓冲区。UNSAFE程序集还可能破坏SQL Server或公共语言运行时的安全系统。UNSAFE权限仅应由经验丰富的开发人员或管理员授予高度信任的程序集。只有sysadmin固定服务器角色的成员才能创建UNSAFE程序集。

对允许的CLR属性有进一步的限制,并且仅支持.Net Framework程序集的一个子集。同样,请参考链接的文档。

至于性能,最重要的想法是要记住SQL Server是一个协作的多任务环境,而CLR不是。SQLCLR代码必须Thread.BeginThreadAffinity()在任何时间占用CPU的任何时间(包括阻塞)都必须调用。Adam Machanic在该主题上作了精彩的演讲,观看数据,更快:带SQLCLR的Microsoft SQL Server性能技术

话题很大,问题也很模糊。SQLCLR可以执行某些其他功能无法比拟的独特任务。而SQLCLR只是SQL Server武库中的另一种武器,您可以用性能或安全性来攻击自己。阅读文档。


谢谢你的雷木思。我知道问题很模糊,但是与此相关的任何安全性问题吗?谢谢
SQLBen 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.