在 SQL Server 中使用 IMPERSONATE 权限?

kar*_*n_r 5 sql-server permissions impersonation

在一些阅读中,了解了 Impersonate 权限。从我读过的内容来看,这更像是创建一个用户的副本,该用户的所有权限级别都使用不同的名称。我知道这可用于在不同的登录名下执行任何查询,但最终它的用途是什么?

为什么要引入这个功能?

Ken*_*her 8

我个人将模拟用于三大类任务。

测试 如果我需要测试某人拥有的访问权限,我可以模拟他们,尝试该任务,看看它是否有效。当我已授予权限但用户仍然告诉我他们无法执行给定任务时,这特别有用。

收集信息 有许多系统视图/功能可为您提供有关连接主体权限的信息(甚至一些 AD 信息)。例如,如果我模拟数据库主体(用户)并查询 sys.user_token,我可以获得他们所属的所有 AD 组的列表,以及哪些组允许他们访问当前数据库。

在不授予权限情况下授予对任务的访问权这里的一个具体示例是截断表的能力。要截断表,您必须拥有ALTER该表的权限。我想让一些人截断该表,但我不想冒险让他们对其进行更改。

  1. 创建一个对表有更改的数据库主体(用户)
  2. 创建一个存储过程,该过程执行TRUNCATE和 用于EXECUTE AS使 SP 以我创建的用户身份运行。
  3. 授予执行权限执行存储过程。

您甚至可以使用此技术来授予系统管理员级别的权限,尽管它确实有其自身的困难和风险。

编辑:

我可以看到您可能授予某人冒充权限的两个可能原因。

将应用程序权限与直接访问权限分开

ApplicationA 要求用户 Joe 有权读取任何表。但作为 Joe 职责的一部分,他还需要更新状态表,以防需要重写某些内容。通过向用户授予更新权限UpdatePerms并授予 Joe 模拟访问权限,他可以登录到 SSMS,模拟该用户并更新表。这意味着他无法通过应用程序进行更新访问,但仍可以执行此临时任务。

在执行任务之前需要额外的思考/行动

与上面类似。Joe 需要能够从表中删除行,但您不希望他意外执行此操作(或至少使其更难)。通过要求他在执行删除之前模拟另一个用户,他至少必须更加努力地考虑它以减少错误发生的可能性。

注意:我从来没有在生产中做过这些。这似乎是合乎逻辑的可能性。