代码之家  ›  专栏  ›  技术社区  ›  Alan Featherston

如何向开发人员授予权限以向用户授予权限?

  •  1
  • Alan Featherston  · 技术社区  · 15 年前

    有没有一种方法可以让开发人员在不给对象创建用户或函数的选项的情况下授予用户对对象的权限?

    我正试图限制开发人员的权限,最近我发现开发人员 db_owner 开发和生产环境中的权限!所以我在尽力阻止这种疯狂。

    关于这件事有什么好文章吗?

    7 回复  |  直到 8 年前
        1
  •  2
  •   David    15 年前

    如前所述,如果有人可以分发权限,他们可以将权限分发给自己(或虚拟帐户)。我不确定SQL Server中是否有提供“让用户权限小于我”的技巧。

    我的方法是使用存储过程。

    创建一个存储过程,该存储过程为指定用户提供 具体的 权利或一组权利(这些权利是允许普通用户拥有的权利)。然后让开发人员执行对该存储过程的访问。实际上,您使用存储过程来创建一个有限版本的grant,同时保留完整的grant命令。

        2
  •  3
  •   Jose Basilio    15 年前

    您可以使它们成为“db_securityadmin”数据库角色的成员

        3
  •  1
  •   Stefan Steinegger    15 年前

    如果有人可以给别人权限,他也可以给自己做他想做的事情的权限。那么这有什么好处呢?可能我不理解你的处境。

        4
  •  1
  •   Ryan Brunner    15 年前

    对象的所有者可以授予这些对象的权限。如果您的开发人员不需要授予诸如创建表权限之类的权限,那么您可能能够授予他们您希望他们授予权限的对象的所有权。

        5
  •  0
  •   Adam Robinson    15 年前

    正如Stefan所说,授予他们授予权限实际上会授予他们所有的权限,因为如果他们想做什么,他们所要做的就是授予他们自己做这件事的权限。

    不过,您可以考虑给开发人员一个用于管理数据库的第二个用户帐户,而不是将开发人员视为敌人。通常不给开发人员任何生产许可,至少在他们的开发帐户上是这样。

        6
  •  0
  •   Richard Ouimet    12 年前

    使用“grant execute on”可以完成对存储过程等对象的权限设置。去;

    但是,您也可能希望在登录和用户级别授予安全权限。您将只想为需要访问的对象(如执行)确定并授予必要的权限。考虑使用“执行为”功能,该功能允许模拟其他用户来验证执行代码所需的权限,而无需授予所有基础对象(例如表)的所有必要权限。可添加到存储过程、函数、触发器等的执行方式。

    在存储过程中按如下方式添加到代码中:创建过程dbo.myprocedure,并将execute作为owner

    在这种情况下,您将模拟被调用模块的所有者。您还可以模拟自我,或用户创建或更改模块,或…专横的调用者,这将使模块接受当前用户的权限,或…模拟所有者,该所有者将获得被调用过程的所有者的权限,或者…模拟“用户名”,它将模拟特定用户或…用模拟“登录名”将模拟特定的登录名。

    大多数情况下,您只需要授予存储过程的执行权限,然后将权限授予存储过程中引用的所有对象。

    这样,您就不需要授予隐式权限(例如:更新数据或调用其他进程)。所有权链接为您处理这个问题。这对于动态SQL或需要创建提升的安全任务(如创建表)特别有用。作为一个方便的工具来考虑这些问题。

    这个例子可能有助于澄清所有这些:

    创建一个名为noprivuser的用户,该用户具有对数据库的公共访问权限(例如dbadb)

    使用[master]创建登录名[noprivuser],密码=n'abc5%,默认值为[dbadb],检查到期值=on,检查策略=on go使用[dbadb]创建用户[noprivuser]登录名[noprivuser]go

    注意:此过程的创建者或所有者需要在目标数据库中创建表权限。

    使用dbadb go create procedure dbo.myprocedure,将execute as owner视为不存在(select*from sys.objects where object_id=object_id(n'[dbo].mytable')并键入(n'u'))create table mytable(pkid int,column1 char(10))insert into mytable values(1,'abcdef')

    将dbo.myprocedure上的exec授予noprivuser;go

    --现在以noprivuser身份登录数据库服务器并运行以下命令。

    使用DBADB围棋

    执行dbo.myprocedure

    (1行受影响)

    现在尝试在以noprivauser身份登录时从新表中进行选择。

    您将获得以下信息:

    从我的表格中选择“*”,开始

    msg 229,level 14,state 5,line 1对象'mytable',数据库'dbadb',架构'dbo'的select权限被拒绝。

    这是预期的,因为您在以noprivuser身份登录时仅在所有者的安全上下文下运行该过程。 没有权限实际读取表。只执行创建和插入行的过程。

    使用EXECUTEAS子句,存储过程将在对象所有者的上下文中运行。此代码成功创建dbo.mytable,并且成功插入行。在本例中,用户“noprivuser”绝对没有被授予修改表或读取或修改此表中任何数据的权限。 它只具有完成此特定任务所需的权限,此任务是在本过程的上下文中编码的。

    这种创建存储过程的方法非常有用,它可以执行需要提升的安全权限而不永久分配这些权限的任务。

        7
  •  0
  •   Alexei - check Codidact    8 年前

    我发现db-owner角色最危险的方面是,如果您对某个权限发出拒绝,那么该角色的成员可以将其授予自己。我刚开始读这个,我正在测试这个

    Create role db_ControlDatabase
    
    grant control to db_ControlDatabase
    
    deny backup database to db_ControleDatabase
    
    alter role db_ControlDatabase add member TestUser
    

    到目前为止,我发现 TestUser 具有权限,但无法添加或删除固定数据库角色的成员。此时,您应该能够拒绝您需要的任何内容,如备份证书、备份主密钥等。

    Here 是可以拒绝或授予的权限列表:

    推荐文章