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

7
我想部署自己的CLR,这需要不安全的权限和将数据库设置为可信任。
我发现可以使用非对称密钥签名具有外部访问权限的程序集,但我没有找到一种方法来使用它签名不安全的程序集。
这是否可能?如果是,应该如何操作?
2个回答

9
谢谢您深入挖掘,避免设置数据库为TRUSTWORTHY ON,这是一种非常常见但不好的做法。
在创建程序集和创建master中的非对称密钥时,采取相同的步骤,然后从该非对称密钥创建登录。唯一的区别是将基于密钥的登录授予UNSAFE ASSEMBLY权限,而不是EXTERNAL ACCESS ASSEMBLY权限。
您永远不需要同时拥有两个权限,因为UNSAFE ASSEMBLY权限允许设置程序集为EXTERNAL ACCESS,但同时具备两个权限也无妨。
如需了解与SQLCLR相关的更多信息,请参见我在SQL Server Central上撰写的系列文章(需要免费注册才能阅读其内容):Stairway to SQLCLR
如果您使用Visual Studio / SSDT部署/发布SQLCLR项目,请参见该Stairway系列中的“Stairway to SQLCLR Level 7: Development and Security”,因为它展示了一种自动创建非对称密钥和基于密钥的登录的技术,这两者都不能使用常规SSDT对象处理。在接下来(即将发布)的文章中,还将展示一种更简单的技术。

关于SQL Server 2017的更新

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

请避免使用新的可信程序集 "功能",因为它比好处更多,更不必说它在第一次给出时完全是不必要的,因为现有功能已经处理了 "可信程序集" 所要解决的问题。有关详细信息和演示如何正确处理现有的未签名程序集,请参见:SQLCLR vs. SQL Server 2017,第4部分:“可信程序集” - 令人失望

4

对于任何希望使用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发布你的项目。 完成 :)

这些脚本是从创建程序集中获取的。


你是 SQL CLR 的大师! - elle0087

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