Gzi*_*ina 2 sql-server permissions role restore sql-server-2019
在数据库中,我创建了一个具有以下角色的用户:
问题是我不想更改用户的角色,但我想授予恢复数据库的权限。
是否有解决方法只授予还原权限但不删除或更改数据库?
背景资料:
我工作的公司创建了一个应用程序,他们希望该应用程序的用户有权备份和恢复数据库,但不能创建另一个数据库或删除现有数据库。而且,他们不希望有另一个具有 角色的用户db_owner
,这将允许客户随心所欲地操纵事物。
该应用程序的价格取决于客户拥有的员工人数,因此在客户端安装该应用程序时,他们使用一个文件来创建一个数据库,在其中指定所有详细信息(包括员工人数),但他们担心有人可能会多次更改文件并添加数据库,因此他们希望通过不授予任何用户执行任何操作的权限来保护实例。这很复杂,但这正是他们想要的。
是的,这实际上很容易使用Module Signing来完成。通过模块签名,您可以创建一个模块(在本例中为存储过程)并授予该模块所需的权限,而不是授予用户或登录名。您只授予用户执行模块的权限。并且,通过这样做,您不仅可以足够细化以有效地仅授予恢复能力,通过对RESTORE
语句进行硬编码,您实际上是授予仅恢复此特定数据库的权限。
可以在此处找到详细说明、解释和演练演示:
但为了简化,以下是基本步骤:
(我们假设存储过程将在[master]
DB 中创建,这意味着我们不需要将证书复制到另一个 DB。存储过程可以很容易地在实用程序数据库中创建,在这种情况下,您只需要将证书复制到[master]
链接博客文章中的说明中)
RESTORE
特定数据库的语句一样简单,或者它可以接受输入参数@DBName sysname
并使用该参数值构造动态 SQL,这允许恢复任何特定的数据库,或者可能@DbToRestore TINYINT
是CASE
语句中使用的参数允许用户从一组有限的预定义数据库名称中进行选择以进行恢复。dbcreator
固定服务器角色。[master]
登录用户:[master]
为客户的登录创建一个用户。EXECUTE
对存储过程的用户权限。为了增加安全性:如果他们以某种方式设法获得密码,那么阻止他们签署另一个模块或重新签署这个模块可能是一个好主意。这并不总是必要的,但在这里可能是一个好主意,因为您将系统分发给客户。
如果没有私钥,证书只能验证模块是否已用它签名,但不能再对任何内容进行签名。由于对模块进行签名会应用关联的基于证书的登录(即添加到 的登录dbcreator
)的权限,因此这会阻止客户将这些权限应用于他们自己的模块(如果他们曾经设法创建任何模块)。此外,如果客户设法更改此存储过程以执行您试图阻止的某些操作,则签名将被删除,这意味着该模块不再具有提升的权限(即使他们将存储过程放回原始代码) .
另请查看我的以下回答,同样在 DBA.StackExchange 上,对类似问题: