DDL_admin和db_owner权限


15

我正在接管一个涉及删除和限制服务器场中所有数据库用户权限的项目。(娱乐时间)

当前受限制的权限之一是db_owner权限。
该权限将根据具体情况进行审查,但是一个常见的更改是将db_owner权限替换为以下内容:

我想定义两者之间的确切区别(以告知客户)。
但是,据我所知,两者之间的区别应该是:

  • db_accessadmin权限
  • db_backupoperator权限
  • db_securityadmin权限

所以实际上他们还是会输:
[ALTER ANY USER]
[CREATE SCHEMA]
[BACKUP DATABASE][BACKUP LOG][CHECKPOINT]
[ALTER ANY APPLICATION ROLE][ALTER ANY ROLE]
[DROP DATABASE]

将db_owner替换为上述四个角色后,用户还有其他事情会松动吗?
这实际上在很大程度上是出于安全目的吗?

Answers:


16

db_ddladmin和db_owner

从我所测试和阅读的内容中可以看出,除了db_ddladminDOES允许,您的清单在大多数情况下看起来都是准确的CREATE SCHEMA。我确实确认确实拒绝了您列出的其他安全权限。

仅拒绝DDLADMIN:

[ALTER ANY USER]

[BACKUP DATABASE][BACKUP LOG][CHECKPOINT]

[ALTER ANY APPLICATION ROLE][ALTER ANY ROLE]

[DROP DATABASE]

注意到了。。。

  1. db_datareader将允许SELECT访问所有表
  2. db_datarwriter将允许INSERTUPDATEDELETE访问所有表
  3. db_executor将允许EXECUTE访问所有可执行对象

另外,拥有db_ddladmin角色权限可能意味着。。。

注意: 由于您在2005年至2014年之间有许多不同版本的SQL Server,因此最好是由一小组用户对其进行初步测试,以查看谁尖叫来消除类似问题,等等。

  • 他们拥有的具有此角色的对象将不会归DBO所有,因此,如果此级别的任何内容出现问题,您可能必须处理所有权更改问题。我不能100%地确定这将是一个问题,但是为了以防万一,值得一提。

    资料来源:所有权链

  • 使用此角色(可能因SQL Server的版本而异),他们可以将当前数据库中定义的SQL安全性原理添加到它们仍然拥有的对象中,而不仅仅是所有对象(它们不拥有的对象),或者添加新的服务器级别定义的主体到数据库级别。


此外,没有DBO角色权限可能意味着。。。

注意: 由于您在2005年至2014年之间有许多不同版本的SQL Server,因此最好是由一小组用户对其进行初步测试,以查看谁尖叫来消除类似问题,等等。

  • 没有DBO角色可能会阻止某些SSMS设计器GUI界面(SQL Server版本不同)填充或打开而不会出现错误(例如,通过GUI修改表或列时),即使通过T-SQL可以正常工作并且权限已到位。在某些版本的SQL Server中,可以通过允许出现问题的GRANT VIEW DEFINITION地方来解决,也可以仅在某些版本的SQL Server上作为警告。

    资源资源

    • 您没有以数据库所有者或db_owner角色成员的用户身份登录。您将无法将更改保存到您不拥有的表中。

    • db_ddladmin角色不允许在SSMS中使用“设计”功能

      “我们试图尽可能避免在质量保证数据库中向用户/开发人员提供dbo。问题之一是他们仍然需要能够创建和修改数据库对象(例如用户表)。许多开发人员对于MS SQL,因此倾向于使用GUI(SSMS)进行此类工作;当我们授予它们db_ddladmin(而非dbo)并且它们不再能够通过表设计器GUI修改表或列时,就会出现问题。他们必须花更多的时间来学习TSQL命令及其语法(它们可能再也不需要)了,或者与DBA团队合作,这会使我们的工作减少时间。

      我不知道这是错误还是功能请求,但我认为这是错误,因为用户具有足够的权限通过TSQL更改表,但GUI却向他们显示以下消息:

      您尚未以数据库所有者或系统管理员身份登录。您可能无法将更改保存到您不拥有的表中。” AND“表[schema].[table]被设置为只读,用户对此表没有足够的权限。

      痕迹似乎表明该检查是一个is_member('db_owner'),即使该成员确实具有修改对象的权限,该检查也会排除db_ddladmin成员。Microsoft SQL Server Management Studio”


      由特工DBA在2010年1月25日上午7:06发布

      我遇到了类似的问题,并通过执行以下补助金设法解决了该问题

      GRANT view definition on schema:: <schemaname> to <username>

其他注意事项

由于您声明正在逐案审查

当前受限制的权限之一是db_owner权限。

该权限将根据具体情况进行审查,但是一个常见的更改是将db_owner权限替换为以下内容:

  • db_datareader
  • db_datawriter
  • db_ddladmin
  • db_executor

您是否考虑过为每个人需要的更多“全对象”数据库级访问创建其他自定义角色,而不是授予他们该db_ddladmin角色,因为这样做可能会给他们带来比实际需要的更多的数据库级对象。

我通常会给出确切需要的内容,而他们所做的工作仅此而已,并且如果需要“正常”或“标准”的数据库级别对象访问数据库中的所有对象,我会创建一个类似于db_executor但请参阅下面的示例。这样,如果您没有在数据库中获得明确的对象级别以确保他们的安全性,就可以向人们授予特定数据库中所有DB对象真正需要的东西。

----Custom Database Roles

/* CREATE A NEW ROLE  -- Execute to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_Execute
GRANT EXECUTE TO db_All_StoredProc_Execute

/* CREATE A NEW ROLE  -- Alter to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_Alter
GRANT ALTER ANY SCHEMA TO db_All_StoredProc_Alter

/* CREATE A NEW ROLE  -- View Definition to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_View
GRANT VIEW DEFINITION TO db_All_StoredProc_View

/* CREATE A NEW ROLE - Any schema alter and create procedure permissions */
-- Database specific
CREATE ROLE db_All_CreateProc_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateProc_AlterSchema
GRANT CREATE PROCEDURE TO db_All_CreateProc_AlterSchema
GO

/* CREATE A NEW ROLE - Any schema alter and create table permissions */
-- Database specific
CREATE ROLE db_All_CreateTable_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateTable_AlterSchema
GRANT CREATE TABLE TO db_All_CreateTable_AlterSchema

/* CREATE A NEW ROLE - Any schema alter and create function permissions */
-- Database specific
CREATE ROLE db_All_CreateFunction_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateFunction_AlterSchema
GRANT CREATE FUNCTION TO db_All_CreateFunction_AlterSchema

/* CREATE A NEW ROLE - Any schema alter and create aggregate permissions */
-- Database specific
CREATE ROLE db_All_CreateAggregate_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateAggregate_AlterSchema
GRANT CREATE AGGREGATE TO db_All_CreateAggregate_AlterSchema

/* CREATE A NEW ROLE - Any schema alter and create view permissions */
-- Database specific
CREATE ROLE db_All_CreateView_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateView_AlterSchema
GRANT CREATE VIEW TO db_All_CreateView_AlterSchema

/* CREATE A NEW ROLE - Any schema alter and create schema permissions */
-- Database specific
CREATE ROLE db_All_CreateSchema_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateSchema_AlterSchema
GRANT CREATE SCHEMA TO db_All_CreateSchema_AlterSchema

我还想共享一个db_DDLAdmin_Restriction角色,您可能要考虑考虑使用其他方式创建显式对象,DENY以限制db_ddladmin授予访问权限的对象,因此您至少可以在授予该角色并DENY为实际对象类型设置显式对象的DB上创建它,等等。您不希望他们访问。

例如,如果你知道他们一定会创建存储过程和函数,可以排除DENY CREATE FUNCTIONDENY CREATE PROCEDUREDENY ALTER ANY SCHEMA

---Create ddladmin restriction custom DB role
DENY ALTER ANY ASSEMBLY                    TO db_DDLAdmin_Restriction
DENY ALTER ANY ASYMMETRIC KEY              TO db_DDLAdmin_Restriction
DENY ALTER ANY CERTIFICATE                 TO db_DDLAdmin_Restriction
DENY ALTER ANY CONTRACT                    TO db_DDLAdmin_Restriction
DENY ALTER ANY DATABASE DDL TRIGGER        TO db_DDLAdmin_Restriction
DENY ALTER ANY DATABASE EVENT NOTIFICATION TO db_DDLAdmin_Restriction
DENY ALTER ANY DATASPACE                   TO db_DDLAdmin_Restriction
DENY ALTER ANY FULLTEXT CATALOG            TO db_DDLAdmin_Restriction
DENY ALTER ANY MESSAGE TYPE                TO db_DDLAdmin_Restriction
DENY ALTER ANY REMOTE SERVICE BINDING      TO db_DDLAdmin_Restriction
DENY ALTER ANY ROUTE                       TO db_DDLAdmin_Restriction
DENY ALTER ANY SCHEMA                      TO db_DDLAdmin_Restriction
DENY ALTER ANY SERVICE                     TO db_DDLAdmin_Restriction
DENY ALTER ANY SYMMETRIC KEY               TO db_DDLAdmin_Restriction
DENY CHECKPOINT                            TO db_DDLAdmin_Restriction
DENY CREATE AGGREGATE                      TO db_DDLAdmin_Restriction
DENY CREATE DEFAULT                        TO db_DDLAdmin_Restriction
DENY CREATE FUNCTION                       TO db_DDLAdmin_Restriction
DENY CREATE PROCEDURE                      TO db_DDLAdmin_Restriction
DENY CREATE QUEUE                          TO db_DDLAdmin_Restriction
DENY CREATE RULE                           TO db_DDLAdmin_Restriction
DENY CREATE SYNONYM                        TO db_DDLAdmin_Restriction
DENY CREATE TABLE                          TO db_DDLAdmin_Restriction
DENY CREATE TYPE                           TO db_DDLAdmin_Restriction
DENY CREATE VIEW                           TO db_DDLAdmin_Restriction
DENY CREATE XML SCHEMA COLLECTION          TO db_DDLAdmin_Restriction
DENY REFERENCES                            TO db_DDLAdmin_Restriction
GO

8

我使用SQL脚本列出了所有权限,然后为每种情况创建了用户。

EXECUTE AS USER = 'test_user'
SELECT 
    permission_name 
FROM fn_my_permissions(null, 'DATABASE')
ORDER BY subentity_name, permission_name
REVERT;

然后,我比较了结果,并从主要来自msdn的文档中获得了以下列表(未特别引用的所有引号均来自msdn链接)。
下面是一些我用来告知谁就会失去DBO权限的人的文件究竟是什么,他们正在失去。

改变

赋予更改特定安全性资产(所有权除外)属性的能力。当在某个范围内被授予权限时,ALTER还具有更改,创建或删除该范围内包含的任何可担保资产的能力。例如,对模式的ALTER权限包括从模式创建,更改和删除对象的能力。

更改任何应用程序角色
更改任何数据库审计
更改任何角色
更改任何用户

赋予创建,更改或删除数据库安全实例的能力。例如,ALTER ANY SCHEMA赋予了创建,更改或删除数据库中任何模式的能力。

应用程序角色是数据库主体,使应用程序可以使用其自己的类似用户的权限运行。

审核 SQL Server或SQL Server数据库的实例涉及跟踪和记录系统上发生的事件。数据库级审核规范对象属于审核。您可以为每个SQL Server数据库创建一个数据库审核规范。

数据库角色用于轻松管理数据库中的权限,SQL Server提供了几个角色,这些角色是将其他主体组合在一起的安全主体。它们就像Microsoft Windows操作系统中的组。数据库级角色的权限范围在整个数据库范围内。

身份验证
在msdn中找到。

仅在跨数据库和服务器访问场景中分别使用EXECUTE AS时,才使用AUTHENTICATE和AUTHENTICATE SERVER权限。

备份数据库
备份日志

连接复制

用于数据库复制权限。

控制

在被授予者身上赋予所有权类似的功能。被授予者实际上对安全对象具有所有定义的权限。已被授予CONTROL权限的主体也可以授予对安全对象的权限。

创建角色

授予被授予者创建安全数据库的能力。

展示计划

与Transact-SQL批处理一起使用时 Showplan权限可用于各种Showplan SET语句选项

订阅查询通知

有关查询通知的文档。

查询通知基于Service Broker基础结构而构建,可以在数据更改时通知应用程序。对于从数据库提供信息缓存的应用程序(例如Web应用程序),并且在源数据发生更改时需要通知的应用程序,此功能特别有用。

取得所有权

使受让人能够获得授予它的证券的所有权。

查看数据库状态

用于查看动态管理视图和功能(Transact-SQL)

查看定义

有关视图定义权限的文档

VIEW DEFINITION权限使用户可以查看授予该权限的安全对象的元数据。但是,VIEW DEFINITION权限不授予对安全对象本身的访问权限。例如,仅被授予对表的“查看定义”权限的用户可以在sys.objects目录视图中查看与该表相关的元数据。但是,没有其他权限(例如SELECT或CONTROL),用户将无法从表中读取数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.