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

问题描述 投票:1回答:7

有没有一种方法可以授予开发人员权限,以授予用户对对象的权限而又不给他们创建用户或功能的选项?

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

关于这个问题有什么好的文章吗?

sql-server sql-server-2005 permissions grant
7个回答
3
投票

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


2
投票

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

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

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


1
投票

如果某人可以授予其他人许可,那么他也可以授予自己做他想做的事情的权限。 那么,这有什么好处呢? 我可能不了解您的情况。


1
投票

对象的所有者可以授予这些对象的权限。 如果您的开发人员不需要授予诸如CREATE TABLE权限之类的权限,则您可以向他们授予要其授予权限的对象的所有权。


0
投票

可以通过“ GRANT EXECUTE ON。

但是,您可能还想在登录和用户级别上授予安全权限。 您将只需要确定和授予需要访问(例如执行)对象的必要权限。 考虑使用“ EXECUTE AS”功能,该功能可以模拟其他用户来验证执行代码所需的权限,而不必向所有基础对象(例如表)授予所有必要的权限。 可以将EXECUTE AS添加到存储的proc,函数,触发器等。

在存储过程中,将以下代码添加到以下代码中:CREATE PROCEDURE dbo.MyProcedure(以所有者身份执行)

在这种情况下,您要冒充被调用模块的所有者。 您也可以模拟SELF,或者用户创建或更改模块OR ... imperonate CALLER,这将使模块能够获得当前用户的权限,或者OR ...模拟OWNER,它将获得当前用户的许可。过程的所有者被称为OR ...冒充'user_name',将模拟特定的用户,或者......冒充'login_name'与将模拟特定的登录名。

在大多数情况下,您只需要向存储的proc授予EXECUTE权限,然后将权限授予存储的proc中引用的所有对象。

这样,您无需授予隐式权限(例如:更新数据或调用其他proc)。 所有权链接可以为您解决这个问题。 这对于动态sql或需要创建增强的安全性任务(例如CREATE TABLE)特别有用。 EXECUTE AS是考虑这些因素的便捷工具。

这个例子可以帮助澄清所有这些:

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

USE [master]使用PASSWORD = N'ABC5%',DEFAULT_DATABASE = [dbadb],CHECK_EXPIRATION = ON,CHECK_POLICY = ON来创建登录[NoPrivUser]进入使用[DBAdb]创建用户[NoPrivUser]进行登录[NoPrivUser]

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

使用DBAdb进入CREATE PROCEDURE dbo.MyProcedure,如果不存在,则以自己的身份执行(SELECT * FROM sys.objects,其中object_id = OBJECT_ID(N'[dbo] .MyTable')并键入(N'U'))创建表MyTable (PKid int,column1 char(10))插入MyTable值(1,'ABCDEF')

将dbo.MyProcedure授予NoPrivUser; 走

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

使用dbadb go

执行dbo.MyProcedure

(影响1行)

现在,以NoPrivuser登录时尝试从新表中选择。

您将获得以下内容:

选择*从MyTable转到

消息229,级别14,状态5,第1行1对对象“ MyTable”,数据库“ DBAdb”,模式“ dbo”的SELECT权限被拒绝。

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

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

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


0
投票

我发现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拥有权限,无法添加或删除固定数据库角色的成员。 此时,您应该可以拒绝所需的任何内容,例如备份证书,备份主密钥等。

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


0
投票

正如Stefan所说,授予他们授予权限将有效地授予他们所有权限,因为如果他们想做某事,他们要做的就是授予自己执行该操作的权限。

但是,您可能要考虑给开发人员第二个用于管理数据库的用户帐户,而不是将开发人员视为敌人。 通常不给开发人员任何生产权限,至少在他们的开发帐户上是很常见的。

© www.soinside.com 2019 - 2024. All rights reserved.