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

时间:2009-04-23 13:16:44

标签: sql-server sql-server-2005 permissions grant

有没有办法让开发人员可以授予用户对对象的权限,而不给他们创建用户或函数的选项?

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

关于此事的任何好文章?

7 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

如果有人可以给别人许可,他也可以给自己做出他想要的许可。那有什么好处呢?可能我不了解你的情况。

答案 3 :(得分:1)

对象的所有者可以授予这些对象的权限。如果您的开发人员不需要授予CREATE TABLE权限等内容,您可以授予他们对您希望他们授予权限的对象的所有权。

答案 4 :(得分:0)

正如Stefan所说,给予他们授予权限会有效地授予他们所有权限,因为如果他们想要做某事,他们所要做的就是授予他们自己的权限。

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

答案 5 :(得分:0)

可以使用“GRANT EXECUTE ON。to;

来完成对存储过程等对象的设置权限

但是,您可能还希望在登录和用户级别授予安全权限。您将只想确定并授予需要访问(例如执行)的对象的必要权限。考虑使用“EXECUTE AS”功能,该功能允许模仿另一个用户来验证执行代码所需的权限,而不必为所有底层对象(例如表)授予所有必要的权限。可以将EXECUTE AS添加到存储过程,函数,触发器等中。

在存储过程中添加以下代码:创建过程dbo.MyProcedure WITH EXECUTE AS OWNER

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

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

通过这种方式,您无需提供隐式权限(例如:更新数据或调用其他过程)。所有权链为您处理此问题。这对动态sql特别有用,或者如果需要创建提升的安全性任务(如CREATE TABLE)。 EXECUTE AS是一个值得考虑的工具。

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

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

USE [master] GO CREATE LOGIN [NoPrivUser] WITH PASSWORD = N'ABC5%',DEFAULT_DATABASE = [dbadb],CHECK_EXPIRATION = ON,CHECK_POLICY = ON GO USE [DBAdb] GO CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser ] GO

注意:本程序的创建者或所有者将要求在目标数据库中创建表权。

使用DBAdb go CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER as IF NOT WISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo] .MyTable')AND输入(N'U')) CREATE TABLE MyTable(PKid int,column1 char(10))INSERT INTO MyTable VALUES(1,'ABCDEF')

GO

授予dEC.MyProcedure给NoPrivUser; GO

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

使用dbadb go

EXEC dbo.MyProcedure

(1行受影响)

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

您将获得以下内容:

从MyTable中选择*去

Msg 229,Level 14,State 5,Line 1对象'MyTable',数据库'DBAdb',架构'dbo'上的SELECT权限被拒绝。

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

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

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

答案 6 :(得分: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具有权限,但无法添加或删除固定数据库角色的成员。您应该能够在此时拒绝您需要的任何内容,例如备份证书,备份主密钥等。

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