使用非对称密钥签署不安全程序集

Signing unsafe assemblies with asymmetric key

我想部署自己的 CLR,这需要不安全的权限并将数据库设置为可信。

我发现可以使用非对称密钥对具有外部访问权限的程序集进行签名,但我没有找到用它对不安全的程序集进行签名的方法。

这可能吗?如果可以,具体步骤是什么?

感谢您深入挖掘以避免将数据库设置为 TRUSTWORTHY ON,不幸的是,这是一种过于普遍的做法。

采取相同的步骤对程序集进行签名并从程序集 DLL 在 master 中创建非对称密钥,然后从该非对称密钥创建登录。唯一的区别是授予基于密钥的登录 UNSAFE ASSEMBLY 权限而不是 EXTERNAL ACCESS ASSEMBLY 权限。

您永远 不需要 这两个权限,因为 UNSAFE ASSEMBLY 权限允许将程序集设置为 EXTERNAL ACCESS,尽管同时拥有这两个权限也无妨。

有关使用 SQLCLR 的更多信息,请参阅我在 SQL Server Central 上撰写的系列文章(需要免费注册才能阅读其内容):

Stairway to SQLCLR

如果您正在使用 Visual Studio / SSDT 来部署/发布您的 SQLCLR 项目,请参阅该阶梯系列中的“Stairway to SQLCLR Level 7: Development and Security”,因为它展示了一种自动化技术创建非对称密钥和基于密钥的登录,这两者都不能使用常规 SSDT 对象处理。另一种更简单的技术将在下一篇(即将发表的)文章中展示。


有关 SQL Server 2017 的更新

SQL Server 2017 引入了一项默认启用的新安全功能("CLR strict security",一个高级选项),并且要求所有程序集,即使是标记为 SAFE 的程序集,也是使用非对称密钥(即强名称)或证书签名,并具有具有 UNSAFE ASSEMBLY 权限的登录名(基于用于签署程序集的内容)。有关如何使用或不使用 Visual Studio / SSDT 的详细信息,请参阅我的以下两篇文章:

请避免使用新的 Trusted Assemblies "feature",因为它的缺陷多于好处,更不用说它一开始就完全没有必要,因为现有功能已经处理了 "Trusted Assemblies" 是意在解决。有关这方面的完整详细信息以及处理现有未签名程序集的正确方法的演示,请参阅:SQLCLR vs. SQL Server 2017, Part 4: “Trusted Assemblies” – The Disappointment.

对于想要使用 Visual studio

签署和部署 CLR 项目的任何人
  1. 打开 visual studio 并转到项目属性。

    • 根据需要将 'Permission level' 更改为 EXTERNAL_ACCESS 或 UNSAFE。
    • 按下“签名”按钮,生成一个新密钥并如下图所示对项目进行签名

  1. 构建项目
  2. 打开 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

  1. 从 Visual Studio 发布您的项目。完成:)

脚本取自Creating an assembly