在sql server 2012中设置trustworthy =的安全风险

cdu*_*dub 8 sql-server security sqlclr full-trust sql-server-2012

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

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
Run Code Online (Sandbox Code Playgroud)

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

Sol*_*zky 11

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

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

设置数据库TRUSTWORTHY还允许从此数据库中启动的任何进程到达服务器级别和/或其他数据库.通常,进程被限制/隔离到它启动的数据库.如果数据库由"sa"登录拥有,则在该数据库中启动并作为"dbo"运行的任何进程将实际具有"sa"权限(yikes!).

在完全传达有关模仿的详细信息,扩展所述模拟,签署模块等所需的详细信息中,我建议不要试图在此描述,我建议在此主题上仔细阅读以下资源:

您应该尽量避免将数据库设置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];
Run Code Online (Sandbox Code Playgroud)

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

ALTER ASSEMBLY [MyAssembly] WITH PERMISSION_SET = UNSAFE;
Run Code Online (Sandbox Code Playgroud)

或者您可以包含WITH PERMISSION_SET = UNSAFECREATE ASSEMBLY命令的末尾.

  • +1提供有效的解决方法,但您还没有真正解决真正的问题(一般来说,有关TRUSTWORTHY的具体和明确的风险). (2认同)