8

我的开发数据库中出现以下错误:

A .NET Framework error occurred during execution of user-defined routine or aggregate "SpCreateTable": 
System.Security.HostProtectionException: Attempted to perform an operation that was forbidden by the CLR host.

The protected resources (only available with full trust) were: All
The demanded resources were: Synchronization, ExternalThreading

设置 trustworthy = on 的正确解决方案是什么?这有什么安全问题?

4

2 回答 2

11

数据库的TRUSTWORTHY属性(当设置为 时ON)本质上向 SQL Server 声明,包含在该数据库中并在模拟上下文中执行的代码应该被允许到达该数据库之外,同时维护该模拟安全上下文。它还允许将该数据库中的所有SQLCLR 程序集设置为EXTERNAL_ACCESSUNSAFE,无论该代码是否到达服务器外部(外部含义:网络访问、文件系统访问、注册表访问、环境访问等)。

这是一种相当通用的方法,因为它涵盖了数据库中的所有代码。使用证书和/或非对称密钥对模块(过程和/或程序集)进行签名可以更精细地控制哪些代码具有哪些权限。

将数据库设置为TRUSTWORTHY还允许在此数据库中启动的任何进程达到服务器级别和/或跨越其他数据库。通常,一个进程被限制/隔离到它启动的数据库中。如果数据库由“sa”登录拥有,那么在该数据库中启动并以“dbo”身份运行的任何进程都将有效地拥有“sa”权限(哎呀!)。

与其试图在这里描述,不如在完全传达有关模拟的细节、扩展所述模拟、签署模块等所需的详细信息方面,我建议仔细阅读有关此主题的以下资源:

您应该避免将数据库设置TRUSTWORTHY为尽可能多。如果您确实必须进行多线程/异步调用并且如果您有源代码并且正在编译程序集,那么我想不出使用该SET TRUSTWORTHY ON选项的理由。相反,您应该使用密码对程序集进行签名,并使用以下命令设置允许EXTERNAL_ACCESSUNSAFE程序集的首选方法:

USE [master];
  CREATE ASYMMETRIC KEY [ClrPermissionsKey]
    AUTHORIZATION [dbo]
    FROM EXECUTABLE FILE = 'C:\path\to\my\assembly.dll';

CREATE LOGIN [ClrPermissionsLogin]
  FROM ASYMMETRIC KEY [ClrPermissionsKey];

GRANT UNSAFE ASSEMBLY TO [ClrPermissionsLogin];

一旦到位,您可以转到已加载并运行程序集的数据库:

ALTER ASSEMBLY [MyAssembly] WITH PERMISSION_SET = UNSAFE;

或者您可以在命令WITH PERMISSION_SET = UNSAFE末尾包含。CREATE ASSEMBLY

于 2014-11-19T01:00:34.770 回答
0

设置TRUSTWORTHY ON通过允许任何代码在数据库模拟上下文下访问外部资源来打开潜在的安全漏洞。允许您的数据库使用您控制的代码访问受保护的网络共享是完全可以的,但是允许任何代码使用相同的代码可能不是那么明智。

设置此标志只会为任何获得特定数据库的 dbo 权限的人打开一扇门,因为您可以注册任何程序集,并且它会自行决定拥有数据库模拟上下文。

于 2017-06-17T20:28:09.797 回答