我想部署自己的CLR,这需要不安全的权限并将数据库设置为值得信赖。
我在interwebz上发现可以使用非对称密钥签署具有外部访问权限的程序集,但我没有找到用它来签署不安全程序集的方法。
这可能吗?如果是,那么采取什么措施呢?
答案 0 :(得分:3)
感谢您深入挖掘以避免将数据库设置为TRUSTWORTHY ON
,遗憾的是,这是一种非常常见的做法。
采用相同的步骤对程序集进行签名,并在程序集DLL中创建master
中的非对称密钥,然后从该非对称密钥创建登录。唯一的区别是然后授予基于密钥的登录UNSAFE ASSEMBLY
权限而不是EXTERNAL ACCESS ASSEMBLY
权限。
您不会需要这两种权限,因为UNSAFE ASSEMBLY
权限允许将程序集设置为EXTERNAL ACCESS
,但同时拥有这两种权限并不会有任何损失。
有关使用SQLCLR的更多信息,请参阅我在SQL Server Central上编写的系列(需要免费注册才能阅读其内容):
如果您使用Visual Studio / SSDT部署/发布您的SQLCLR项目,请参阅" Stairway to SQLCLR Level 7: Development and Security"在Stairway系列中,它展示了一种自动创建非对称密钥和基于密钥的登录的技术,这两种方法都不能使用常规SSDT对象来处理。另一种更简单的技术将在下一篇(待发表)文章中展示。
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项目的人
打开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