⚠‼请不要设置... TRUSTWORTHY ON
⚠
...除非绝对必要‼ 而且,它几乎永远不会是“必要的”,即使在加载您未构建的程序集时(您总是可以添加另一个证书,或者最坏的情况:加载到 SQL Server后签名),或者在加载不受“支持”并因此不在 SQL Server 的 CLR 主机中的 .NET Framework 库时(您可以使用它们签名的证书,或者最坏的情况:加载到 SQL Server后签名)。将数据库设置为TRUSTWORTHY ON
打开一个安全漏洞,有关此的更多信息,请参阅:
请,请,请停止使用模拟、可信和跨数据库所有权链接
反而,
最好执行以下操作:
USE [master];
CREATE ASYMMETRIC KEY [SomeKey]
AUTHORIZATION [dbo]
FROM EXECUTABLE FILE = 'C:\path\to\Some.dll';
CREATE LOGIN [SomeLogin]
FROM ASYMMETRIC KEY [SomeKey];
GRANT EXTERNAL ACCESS ASSEMBLY TO [SomeLogin]; -- or "UNSAFE" instead of "EXTERNAL ACCESS"
每个实例,每个键只需要执行上述操作一次。因此,如果您对所有程序集使用相同的snk
/pfx
文件,那么上面显示的步骤只需为每个 SQL Server 实例执行一次;包含这些程序集的程序集和数据库的数量无关紧要。或者,如果使用证书签名,则只需在上面显示的示例代码中替换ASYMMETRIC KEY
为。CERTIFICATE
这种方法允许您在数据库上保持更好的安全性(通过保持TRUSTWORTHY
设置为OFF
)并允许更精细地控制甚至允许将哪些程序集设置为EXTERNAL_ACCESS
和/或UNSAFE
(因为您可以通过使用不同的密钥进行签名和基于登录的在那些不同的键上)。
但是,如果必须使用该TRUSTWORTHY ON
方法,则数据库所有者不必是sa
. 要求仅仅是注册为数据库所有者的登录已被授予EXTERNAL ACCESS ASSEMBLY
或UNSAFE ASSEMBLY
(与上面显示的基于非对称密钥的登录相同的两个权限)。意义:
USE [master];
GRANT UNSAFE ASSEMBLY TO [{Login-that-is-dbo-for-DB-containing-Assembly}];
有关安全选项的更详细演练,请参阅我在 SQL Server Central 上撰写的以下文章:SQLCLR 级别 4 的阶梯:安全性(外部和不安全的程序集)。
有关如何通过 Visual Studio / SSDT 自动执行此操作的详细演练,请参阅 SQL Server Central 上的以下 3 篇文章(由 3 部分组成的系列):
另外,自从写了这 3 篇文章后,我想出了一个使用 T4 模板的更简单的方法,但还没有时间写出来。当我这样做时,我将使用该文章的链接更新此答案。
更新
SQL Server 2017 以名为“CLR strict security”的服务器级配置选项的形式引入了一个新的复杂功能。它默认启用,并要求所有程序集,即使是标记为 的程序SAFE
集,都使用证书或非对称密钥进行签名,具有关联的登录名,并且登录名具有授予的UNSAFE ASSEMBLY
权限(不足以授予EXTERNAL ACCESS ASSEMBLY
)。有关此新“功能”的更多详细信息,请参阅我对以下 SO 问题的回答:
SQL Server 2017 上的 CLR 严格安全性