【发布时间】:2017-05-17 17:46:25
【问题描述】:
我想部署自己的 CLR,这需要不安全的权限并将数据库设置为可信任。
我发现可以使用非对称密钥对具有外部访问权限的程序集进行签名,但我没有找到使用它对不安全程序集进行签名的方法。
这可能吗?如果是,具体步骤是什么?
【问题讨论】:
标签: sql-server sqlclr assembly-signing
我想部署自己的 CLR,这需要不安全的权限并将数据库设置为可信任。
我发现可以使用非对称密钥对具有外部访问权限的程序集进行签名,但我没有找到使用它对不安全程序集进行签名的方法。
这可能吗?如果是,具体步骤是什么?
【问题讨论】:
标签: sql-server sqlclr assembly-signing
感谢您深入挖掘以避免将数据库设置为 TRUSTWORTHY ON,不幸的是,这是一种太常见的做法。
使用相同的步骤对程序集进行签名并从程序集 DLL 在master 中创建非对称密钥,然后从该非对称密钥创建登录。唯一的区别是授予基于密钥的登录UNSAFE ASSEMBLY 权限而不是EXTERNAL ACCESS ASSEMBLY 权限。
您永远需要这两个权限,因为UNSAFE ASSEMBLY 权限允许将程序集设置为EXTERNAL ACCESS,尽管同时拥有这两个权限并没有什么坏处。
有关使用 SQLCLR 的更多信息,请参阅我在 SQL Server Central 上撰写的系列文章(需要免费注册才能阅读其内容):
如果您使用 Visual Studio/SSDT 部署/发布您的 SQLCLR 项目,请参阅该 Stairway 系列中的“Stairway to SQLCLR Level 7: Development and Security”,因为它展示了一种自动创建非对称密钥和基于密钥的登录的技术,无论是其中可以使用常规 SSDT 对象处理。另一种更简单的技术将在下一篇(即将发表的)文章中展示。
SQL Server 2017 引入了一项新的安全功能(“CLR 严格安全”,一个高级选项),该功能默认启用,并要求所有程序集,即使是那些标记为 SAFE 的程序集,都使用非对称密钥(即强名称)或证书并具有具有UNSAFE ASSEMBLY 权限的登录名(基于用于签署程序集的任何内容)。有关如何使用或不使用 Visual Studio / SSDT 的详细信息,请参阅我的以下两篇文章:
请避免使用新的受信任程序集“功能”,因为它的缺陷多于好处,更不用说它完全没有必要,因为现有功能已经处理了“受信任程序集”旨在解决的情况。有关这方面的完整详细信息以及处理现有未签名程序集的正确方法的演示,请参阅:SQLCLR vs. SQL Server 2017, Part 4: “Trusted Assemblies” – The Disappointment。
【讨论】:
适用于任何想要使用 Visual Studio 签署和部署 CLR 项目的人
打开 Visual Studio 并转到项目属性。
打开 SQL Management Studio 并通过替换占位符运行以下脚本。
在运行以下命令之前,请确保您有权访问 MASTER 数据库和 CLR 项目目录。
USE master;
GO
-- Create asymmetric key
CREATE ASYMMETRIC KEY [PROJECT_NAME]_Key
FROM EXECUTABLE FILE
= [CLR_PROJECT_DIRECTORY]\bin\Debug\[PROJECT_NAME].dll'
-- Create a new login with the asymmetric key
CREATE LOGIN [PROJECT_NAME]_Login
FROM ASYMMETRIC KEY [PROJECT_NAME]_Key
-- Grant External access to login
GRANT EXTERNAL ACCESS ASSEMBLY TO [PROJECT_NAME]_Login
GO
-- Uncomment the following for UNSAFE assembly
-- GRANT UNSAFE ASSEMBLY TO [PROJECT_NAME]_Login
【讨论】: