T-SQL 中经过 Windows 身份验证的用户需要啥访问权限才能创建 External_Access 或 Unsafe 程序集?

Posted

技术标签:

【中文标题】T-SQL 中经过 Windows 身份验证的用户需要啥访问权限才能创建 External_Access 或 Unsafe 程序集?【英文标题】:What access does a Windows authenticated user in T-SQL need to create an External_Access or Unsafe Assembly?T-SQL 中经过 Windows 身份验证的用户需要什么访问权限才能创建 External_Access 或 Unsafe 程序集? 【发布时间】:2018-01-11 10:03:41 【问题描述】:

我正在尝试使用 Sqlclr 和 C# 进行 POC,以从存储过程中调用 .Net 代码 (dll)。我正在尝试写入事件日志。我能够创建一个安全程序集,然后在我的 dll 周围创建一个存储过程包装器。但是在执行代码时它失败了 - 对于事件日志访问,需要使用 External_Access/ Unsafe 权限集创建程序集。

当我尝试使用外部组件进行相同操作时,它不起作用。所以我选择了从签名的 dll 创建登录的路线。

我使用 Visual Studio 对 dll 进行了签名。在项目属性签名选项卡下,我在没有密码(snk 文件)的情况下对其进行了签名。

然后我使用 dll 在 sql 中创建了一个非对称密钥。

使用这个非对称密钥,我在 Master 中创建了一个登录。 然后我授予此登录外部访问程序集。 已更改数据库以使用我尝试在其中创建包装程序的特定数据库 在下一步中,我尝试使用 External_Access 创建程序集 权限集。 失败并显示错误消息 -

消息 300 - 对象“服务器”、数据库“主服务器”上的外部访问程序集权限被拒绝

然后我尝试通过设置数据库可信赖的路线 到 ON 只是为了检查这个概念是否真的有效。 这失败了,同样的异常。

我的问题是我的 Windows 身份验证登录是否需要更多权限才能设置 External_Access 权限。是否需要 SA 帐户?

【问题讨论】:

【参考方案1】:

首先,您的意思是在 master 上运行它(根据错误消息)?

要使用TRUSTWORTHY,用户需要按照here的sysadmin,但使用TRUSTWORTHY通常是个坏主意。

要使用EXTERNAL_ACCESS 创建程序集,登录需要服务器上的EXTERNAL ACCESS ASSEMBLY 权限。要将程序集创建为UNSAFE,登录需要服务器上的 UNSAFE ASSEMBLY 权限。你可以阅读更多关于here的信息。

尼尔斯

【讨论】:

尼尔斯:+1。关于第一句话,它没有在 master 中运行。权限正在签入master,因为这是存储登录名的地方,因此管理服务器级权限。我刚刚复制了这个确切的错误消息,包括 master 部分,并且不在 master 中。这与第 3 段中提到的两个权限有关,即服务器级权限。关于不使用TRUSTWORTHY:ModuleSigning.info 感谢@NielsBerglund 您的回答和链接文章确认了访问问题。【参考方案2】:

鉴于 SQL Server 2017 中与创建程序集相关的安全性方面发生了相当大的变化,因此了解您使用的 SQL Server 版本将大有帮助。我写了一系列文章来解释 SQL Server 2017 中的整体问题,并提供了一些可以在 Visual Studio / SSDT 中自动化的解决方案:

SQLCLR vs. SQL Server 2017, Part 1: “CLR strict security” – The Problem

第 1 部分主要是解释,而第 2 部分和第 3 部分是在这些约束下工作的两种方法。

    如果您使用的是 SQL Server 2017,您是否尝试过授予基于非对称密钥的登录 UNSAFE ASSEMBLY 权限? 除了GRANT EXTERNAL ACCESS ASSEMBLY 之外,您是否为该登录做了其他操作?你DENY 什么了吗?

    要尝试的另一件事是将基于非对称密钥的登录添加到sysadmin 固定服务器角色:

    ALTER SERVER ROLE [sysadmin] ADD MEMBER [LoginName];
    

    虽然这个不应该是必要的,但较早的文档(2008 R2 及之前)声明这是一项要求。我从来不需要这样做,但值得测试,因为如果没有其他工作,它会让我们更接近实际问题。请务必将TRUSTWORTHY 设置回OFF 在您将其转为ON 的数据库中。

此外,您可能想查看我在 SQL Server Central 上撰写的系列文章,这些文章解释了使用 SQLCLR 的各个方面:

Stairway to SQLCLR

【讨论】:

嗨 Solomon,我正在使用 SQL Server 2016。实际上是您的文章让我走到了这一步。谢谢:) 我会尝试将系统管理员添加到登录中。再次感谢。 我没有拒绝任何权限,我尝试了 External_Access 和 Unsafe 权限。 我担心的是我刚刚通过 Windows 帐户登录。执行上述操作是否需要我成为 dba 的所有者或类似权限? 您是在谈论您的登录名拥有的权限吗?你是系统管理员吗?您可能需要临时创建程序集。 ..我可以稍后回家测试。 . @LavinSharma 嘿,我刚刚测试并确认您的登录,即执行CREATE ASSEMBLY 语句的登录,确实需要授予EXTERNAL ACCESS ASSEMBLY 权限才能执行此操作,而不仅仅是CREATE ASSEMBLY在那个数据库中。对不起,我误解了这个问题。这就是尼尔斯在回答的第 3 段中提出的建议。需要明确的是,不,您的登录或基于非对称密钥的登录都不需要sysadmin。此外,我将尝试更新我的文章以澄清这一点。我通常从不使用非管理员登录创建程序集。

以上是关于T-SQL 中经过 Windows 身份验证的用户需要啥访问权限才能创建 External_Access 或 Unsafe 程序集?的主要内容,如果未能解决你的问题,请参考以下文章

我如何通过 .net 远程调用模拟经过 Windows 身份验证的 Web 用户?

在 Blazor 中的视图之外访问经过身份验证的用户

IIS Express - 临时模拟经过身份验证的用户

检查用户是不是在 OpenFire 中经过身份验证

仅针对经过身份验证的用户的 Django 缓存

sql server 数据库连接