【问题标题】:SQL SERVER: Lack of permissions for user to create copy of database with all privilegesSQL SERVER:用户缺少创建具有所有权限的数据库副本的权限
【发布时间】:2021-03-02 23:12:36
【问题描述】:

首先,这是我所拥有的:

  • 两个用户:user 和 sa
  • sa 是数据库管理员
  • 一个主数据库,具有只读权限(db_datareader 角色)并为用户执行一些选定的存储过程(包括数据库复制过程)
  • 用户具有全局 dbcreator 角色
  • SQL Server 位于具有读取/写入文件权限的 Windows Server 计算机上
  • 数据库复制存储过程,当 sa 或用户执行该过程时,它会复制 db 及其所有内容并授予用户在原始 db 中的权限。之后 sa 必须将用户映射到复制的 db 并添加他 db_owner 角色。

我已经尝试过的:

  • 将作为 sa 执行添加到过程中,但用户不能 IMPERSONATE sa(管理员限制)
  • 将行添加到过程中,例如: ALTER AUTHORIZATION ON DATABASE::copyDB TO user

只是想知道,是否有可能向用户授予临时权限或以任何其他方式授予他复制数据库的所有权。

【问题讨论】:

  • 如果用户创建数据库,他们所有者。你是如何“复制”它的?通过使用不同的名称备份和恢复它?如果是这样,那将完全恢复数据库,包括权限。如果最初没有访问权限的人恢复它,他们仍然不会。
  • 你是对的,但是有没有什么方法可以自动更改权限,而不需要 sa 对此类备份数据库的干预?

标签: sql-server tsql permissions windows-server


【解决方案1】:

处理此问题的安全方法是创建一个可以执行数据库复制的签名过程。用户只需具有执行权限即可运行该过程。该过程将使用用于签名的帐户的上下文运行,而不是以用户身份运行。对程序的任何更改都需要重新签名。 (不希望有人修改代码来做坏事。)

例如,我使用具有系统管理员访问权限的帐户签署了一个程序。它允许用户使用 xp_cmdshell 执行一个过程来执行 COBOL,而无需授予用户 sysadmin 访问权限。如果开发人员更改了代码,则不再对其进行签名并使用连接的正常上下文执行。如果执行 xp_cmdshell,这将导致它失败。 DBA 需要对代码进行验证并辞职,然后才能再次工作。这种管理开销就是安全成本。

https://docs.microsoft.com/en-us/sql/relational-databases/tutorial-signing-stored-procedures-with-a-certificate?view=sql-server-ver15

如果将备份还原到同一台服务器,则会保留签名。恢复到不同的服务器将需要辞职。 (master 数据库主密钥通常不同。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2012-03-29
    • 2011-06-07
    • 2016-10-12
    • 1970-01-01
    相关资源
    最近更新 更多