CLR 集成代码访问安全性

适用于:SQL Server

公共语言运行时 (CLR) 支持用于托管代码的一种称为代码访问安全性的安全模式。 在这种模式下,根据代码的标识来对程序集授予权限。 有关详细信息,请参阅 .NET Framework 软件开发包中的“代码访问安全性”部分。

决定授予程序集的权限的安全策略定义在三个不同的位置:

  • 计算机策略:这是安装 SQL Server 的计算机中运行的所有托管代码生效的策略。

  • 用户策略:这是对进程承载的托管代码有效的策略。 对于 SQL Server,用户策略特定于运行 SQL Server 服务的 Windows 帐户。

  • 主机策略:这是 CLR 主机(在本例中为 SQL Server)设置的策略,该策略对于在该主机中运行的托管代码有效。

CLR 支持的代码访问安全机制基于如下假设:运行时既可承载完全可信任的代码,也可承载部分可信任的代码。 受 CLR 代码访问安全性保护的资源通常由需要相应权限的托管应用程序编程接口包装,然后才允许访问资源。 仅当调用堆栈中的所有调用方(在程序集层)均具有相应资源权限时,此权限要求才得到满足。

在 SQL Server 中运行时授予托管代码的代码访问安全权限集是上述三个策略级别授予的权限集的交集。 即使 SQL Server 向 SQL Server 中加载的程序集授予一组权限,用户和计算机级策略也可能进一步限制授予用户代码的最终权限集。

SQL Server 主机策略级别权限集

由 SQL Server 主机策略级别授予程序集的代码访问安全权限集由创建程序集时指定的权限集确定。 有三个权限集:SAFEEXTERNAL_ACCESSUNSAFE(使用 CREATE AS 的 PERMISSION_标准版T 选项指定标准版MBLY (Transact-SQL))。

SQL Server 在托管 CLR 时向 CLR 提供主机级安全策略级别;此策略是低于始终生效的两个策略级别的附加策略级别。 此策略是为 SQL Server 创建的每个应用程序域设置的。 此策略不适用于 SQL Server 创建 CLR 实例时生效的默认应用程序域。

SQL Server 主机级策略是系统程序集的 SQL Server 固定策略和用户程序集的用户指定策略的组合。

CLR 程序集和 SQL Server 系统程序集的固定策略授予它们完全信任。

SQL Server 主机策略的用户指定部分基于程序集所有者,为每个程序集指定三个权限存储桶之一。 有关以下列出的安全权限的详细信息,请参阅 .NET Framework SDK。

SAFE

仅允许内部计算和本地数据访问。 SAFE 是限制性最高的权限集。 具有 SAFE 权限的程序集执行的代码无法访问外部系统资源,例如文件、网络、环境变量或注册表。

SAFE 程序集具有以下权限和值:

权限 值/说明
SecurityPermission 执行: 执行托管代码的权限。
SqlClientPermission 上下文连接 = true上下文连接 = 是:只能使用上下文连接,连接字符串只能指定“context connection=true”或“context connection=yes”的值。

AllowBlankPassword = false: 不允许使用空白密码。

EXTERNAL_ACCESS

EXTERNAL_ACCESS程序集具有与 SAFE 程序集相同的权限,并且能够访问外部系统资源(如文件、网络、环境变量和注册表)。

EXTERNAL_ACCESS程序集还具有以下权限和值:

权限 值/说明
DistributedTransactionPermission 不受限制: 允许分布式事务。
DNSPermission 不受限制: 从域名服务器请求信息的权限。
EnvironmentPermission 不受限制: 允许完全访问系统和用户环境变量。
EventLogPermission 管理员注册:允许执行以下操作:创建事件源、读取现有日志、删除事件源或日志、响应条目、清除事件日志、侦听事件以及访问所有事件日志的集合。
FileIOPermission 不受限制: 允许完全访问文件和文件夹。
KeyContainerPermission 不受限制: 允许完全访问密钥容器。
NetworkInformationPermission 访问: 允许 Ping。
RegistryPermission 允许读取权限HKEY_CLAS标准版S_ROOTHKEY_LOCAL_MACHINE、HKEY_CURRENT_U标准版RHKEY_CURRENT_CONFIGHKEY_U标准版RS。
SecurityPermission 断言: 能够断言此代码的所有调用方都具有操作的必要权限。

ControlPrincipal: 能够操作主体对象。

执行: 执行托管代码的权限。

SerializationFormatter: 提供序列化服务的功能。
SmtpPermission 访问: 允许到 SMTP 主机端口 25 的出站连接。
SocketPermission 连接:允许传输地址上的出站连接(所有端口、所有协议)。
SqlClientPermission 不受限制: 允许对数据源进行完全访问。
StorePermission 不受限制: 允许完全访问 X.509 证书存储。
WebPermission 连接:允许与 Web 资源的出站连接。

UNSAFE

UNSAFE 允许程序集不受限制地访问 SQL Server 内外的资源。 从 UNSAFE 程序集内执行的代码还可以调用非托管代码。

为 UNSAFE 程序集提供 FullTrust

SAFE 是用于执行计算和数据管理任务的程序集的建议权限设置,无需访问 SQL Server 外部的资源。

对于访问 SQL Server 外部资源的程序集,建议使用EXTERNAL_ACCESS默认情况下,EXTERNAL_ACCESS 程序集作为 SQL Server 服务帐户执行。 EXTERNAL_ACCESS代码可以显式模拟调用者的 Windows 身份验证安全上下文。 由于默认值是作为 SQL Server 服务帐户执行 ,因此应仅向信任的登录名授予执行EXTERNAL_ACCESS 的权限,才能作为服务帐户运行。

从安全角度来看, EXTERNAL_ACCESSUNSAFE 程序集是相同的。 但是,EXTERNAL_ACCESS程序集提供各种可靠性和可靠性保护,这些保护不在 UNSAFE 程序集中

指定 UNSAFE 允许程序集中的代码针对 SQL Server 进程空间执行非法操作,因此可能会损害 SQL Server 的可靠性和可伸缩性。 有关在 SQL Server 中创建 CLR 程序集的详细信息,请参阅 管理 CLR 集成程序集

重要

SQL Server 包含数据库引擎用来提供某些功能的 CLR 程序集。 Microsoft.SQLServer.Types SQL Server 安装附带的程序集以 UNSAFE 程序集的形式显示在元数据中。 这是设计的结果。 默认情况下,这些程序集被视为受信任和安全。

访问外部资源

如果用户定义类型(UDT)、存储过程或其他类型的构造程序集注册到 SAFE 权限集,则在构造中执行的托管代码无法访问外部资源。 但是,如果 指定了EXTERNAL_ACCESSUNSAFE 权限集,并且托管代码尝试访问外部资源,SQL Server 将应用以下规则:

如果 Then
执行上下文对应于 SQL Server 登录名。 拒绝访问外部资源的尝试并引发一个安全异常。
执行上下文与 Windows 登录名相对应并且执行上下文为原始调用方。 外部资源在 SQL Server 服务帐户的安全上下文下访问。
调用方不是原始调用方。 拒绝访问并引发一个安全异常。
执行上下文与 Windows 登录名相对应并且执行上下文是原始调用方,而该调用方已被模拟。 访问使用调用方安全上下文,而非服务帐户。

权限集汇总

下图汇总了授予 SAFEEXTERNAL_ACCESS 和 UNSAFE 权限集的限制和权限。

功能 安全 EXTERNAL_ACCESS 安全
代码访问安全权限 仅执行 执行和访问外部资源 不受限制(包括 P/Invoke)
编程模型限制 无限制
可验证性要求
本地数据访问
调用本机代码的能力 No

另请参阅

CLR 集成安全性
宿主保护属性和 CLR 集成编程
CLR 集成编程模型限制
CLR 托管环境