Sol*_*zky 2 sql-server errors sql-clr sql-server-2017
我有一个 SQL Server 2017 之前的数据库,我恢复到/升级到 SQL Server 2017。在这个数据库中,我有一个 SQLCLR 程序集。程序集被标记为SAFE
因为它不执行任何需要更高级别权限的操作,并且数据库已TRUSTWORTHY
禁用 / OFF
。SQLCLR 函数和存储过程在迁移到 SQL Server 2017 之前按预期工作,但现在当我尝试执行其中任何一个时,我收到以下错误:
消息 10314,级别 16,状态 11,服务器 XXXXXXXXXXX,行 YYYYYY
在 Microsoft .NET Framework 中尝试加载程序集 ID ZZZZZ 时出错。服务器可能会耗尽资源,或者程序集可能不受信任。再次运行查询,或检查文档以了解如何解决程序集信任问题。有关此错误的更多信息:
System.IO.FileLoadException:无法加载文件或程序集“{assembly_name}”,版本=0.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。发生与安全相关的错误。(来自 HRESULT 的异常:0x8013150A)
我已确认已在服务器/实例上启用 CLR 集成/SQLCLR。
该错误是由clr strict security
SQL Server 2017 中新的服务器级配置选项造成的。这个新的安全设置禁止任何程序集,即使是那些标记为 的程序集,也不允许SAFE
创建或加载到内存中以供执行,除非:
TRUSTWORTHY
is的 Database 属性ON
(不要这样做,因为这是一个不必要的安全风险)并且作为数据库所有者的 Login(即[dbo]
用户使用的相同 SID )需要具有UNSAFE ASSEMBLY
权限(如果所有者可能已经拥有该权限)是sa
或sysadmin
固定服务器角色的成员,或者可能具有CONTROL SERVER
权限)。clr strict security
被禁用/ 0
(不要这样做,因为这是一个不必要的安全风险)UNSAFE ASSEMBLY
权限(请执行此操作)为了解决这种情况,您需要做的只是以下步骤(这些步骤并不困难并提供最高级别的安全性):
SAFE
:
[master]
(仅限公钥!)UNSAFE ASSEMBLY
权限一个简单的例子(减去可选的备份和私钥删除)是:
USE [{database_containing_unsigned_safe_assembly}];
CREATE CERTIFICATE [{certificate_name}]
ENCRYPTION BY PASSWORD = '{some password}'
WITH SUBJECT = '{simple description}',
EXPIRY_DATE = '2099-12-31';
ADD SIGNATURE
TO Assembly::[{assembly_name}]
BY CERTIFICATE [{certificate_name}]
WITH PASSWORD = '{some password}';
DECLARE @PublicKey VARBINARY(MAX),
@SQL NVARCHAR(MAX);
SET @PublicKey = CERTENCODED(CERT_ID(N'{certificate_name}'));
SET @SQL = N'
CREATE CERTIFICATE [{certificate_name}]
FROM BINARY = ' + CONVERT(NVARCHAR(MAX), @PublicKey, 1) + N';';
PRINT @SQL; -- DEBUG
EXEC [master].[sys].[sp_executesql] @SQL;
EXEC [master].[sys].[sp_executesql] N'
CREATE LOGIN [{login_name}]
FROM CERTIFICATE [{certificate_name}];
GRANT UNSAFE ASSEMBLY TO [{login_name}]; -- REQUIRED!!!!
';
Run Code Online (Sandbox Code Playgroud)
可以在 PasteBin: Avoiding“Trusted Assemblies” - Demo上找到一个完整的示例(减去备份和私钥删除)
为什么你一个详细的解释应该使用证书,以及为什么你应该不使用“可信大会”,来解决这个问题,在我的博客文章提供:
SQLCLR与SQL服务器2017年,第4部分:“受信任的组件” -失望
此外,鉴于围绕它的众多问题(包括安全问题),以及总体上缺乏使用它的好处,请考虑支持我让 Microsoft 删除新的“可信程序集”功能的请求:
归档时间: |
|
查看次数: |
4025 次 |
最近记录: |