在 SQL Server 2012 中,启用 "可信任" 设置的安全风险。

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"吗?这样做会有什么安全顾虑吗?

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;

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

它们实际上是使用非对称密钥签名并设置为不安全,但仍然出现了错误。不确定原因。 - cdub
2
虽然你提供了一个有效的解决方法,但你并没有真正回答实际问题(关于TRUSTWORTHY的具体和明确风险)。 - Aaron Bertrand
@chris 你确定程序集设置为 UNSAFE 吗?你发布的错误是当程序集未设置为 unsafe 时会出现的。或者,当它被设置为 UNSAFE 但是 Login 被删除或至少已经删除了 UNSAFE ASSEMBLY 权限时也会出现这个错误。如果以上情况都不是问题所在,那么你在 proc 方法中调用了哪些框架方法? - Solomon Rutzky
@AaronBertrand:谢谢。我现在已经更新了答案,提供了一些关于TRUSTWORTHY影响的详细信息和链接。 - Solomon Rutzky
Solomon和Aaron你们怎样在SQL Server 2016上注册System.DirectoryServices.AccountManagement.dll而不使用TRUSTWORTHY呢?我尝试了很多次,但是无论如何都不能通过ASYMMETRIC密钥来实现。 - SpaceGhost440
显示剩余2条评论

0

设置TRUSTWORTHY ON会通过允许任何代码以数据库模拟身份访问外部资源,打开潜在的安全漏洞。允许你的数据库使用你控制的代码访问受保护的网络共享是完全可以的,但是允许任何代码这样做可能不明智。

设置此标志只会为任何获得特定数据库dbo权限的人打开大门,因为您可能会注册任何程序集,并且它将由DB冒充上下文自由支配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接