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

时间:2017-01-03 15:26:33

标签: sql-server sqlclr assembly-signing

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

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

这可能吗?如果是,那么采取什么措施呢?

2 个答案:

答案 0 :(得分:3)

感谢您深入挖掘以避免将数据库设置为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"在Stairway系列中,它展示了一种自动创建非对称密钥和基于密钥的登录的技术,这两种方法都不能使用常规SSDT对象来处理。另一种更简单的技术将在下一篇(待发表)文章中展示。

关于SQL Server 2017的更新

SQL Server 2017引入了一项新的安全功能(" CLR严格安全性",一种高级选项),默认情况下已启用,并要求所有程序集(即使标记为SAFE的程序集)都必须签名使用非对称密钥(即强名称)或证书,并具有UNSAFE ASSEMBLY权限的登录(基于用于签署程序集的任何内容)。有关如何使用Visual Studio / SSDT的详细信息,请参阅以下两篇帖子:

请避免使用新的受信任程序集"功能"因为它有更多的缺陷而不是好处,更不用说它首先是完全没有必要的,因为现有的功能已经处理了这种情况" Trusted Assemblies"本来打算解决。有关该内容的完整详细信息以及处理现有未签名大会的正确方法的演示,请参阅:SQLCLR vs. SQL Server 2017, Part 4: “Trusted Assemblies” – The Disappointment

答案 1 :(得分:1)

对于任何想要使用Visual Studio签名和部署CLR项目的人

  1. 打开Visual Studio并转到项目属性。

    • 根据需要将“权限级别”更改为EXTERNAL_ACCESS或UNSAFE。
    • 按下“签名”按钮,生成一个新密钥,然后如下图所示对项目进行签名

enter image description here

  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