本文属于SQL Server安全专题系列


 接上文SQL Server 安全篇——SQL Server 安全模型(2)——实例级别安全性

 在数据库层面,以授权到安全主体来实现安全性。 相对于服务器级别,数据库级别称为数据库用户和数据库角色。


用户:


 通常情况下,数据库用户是从实例层面创建的登录名来实现。相同实例下,一个登录名可以映射到多个数据库用户中,并且可以单独授权到数据库层面。从SQL 2012开始,也可以创建没有登录名的用户(包含数据库)


带有登录名的用户:


通过SSMS或者T-SQL来创建用户,一般需要关联到一个被配置好权限的实例层面登录。常用的选项有:
  • DEFAULT_SCHEMA:用户的默认架构,将在后续介绍。
  • ALLOW_ENCRYPTED_VALUE_MODIFICATIONS:允许在大容量复制(bulk copy)中使用数据加密。在后续章节介绍。
比如下面例子:在AdventureWorks2016CTP3中创建一个用户Danni,关联到用户Danni登录,并且默认架构为Sales:
USE AdventureWorks2016CTP3 
GO 
CREATE USER Danni FOR LOGIN Danni  WITH DEFAULT_SCHEMA =  Sales  ; 
虽然没有强制规定必须与登录名一模一样,但是作为良好的管理来说应该保持一致,如果不指定默认架构,则默认为dbo。


不需要登录名的用户:


 创建不带登录名的用户时,用户要么映射到Windows安全主体,要么使用SQL Server身份验证, 如果使用身份验证,前提条件是数据库必须已经配置为包含数据库,具体内容可见:包含的数据库
这种情况下可用选项有:
  • DEFAULT_SCHEMA/ALLOW_ENCRYPTED_VALUE_MODIFICATIONS:同上。
  • DEFAULT_LANGUAGE:用户使用的默认语言。
  • SID:仅对SQL Server身份验证有效,指定用户关联的SID,多个库的同一个用户使用相同的SID,特别适合在灾难恢复和AlwaysON环境。
例子:创建一个叫做Phil用户,用户来自于Windows安全主体(域名\登录名:cartersecuresafe\phil),默认架构dbo。
USE AdventureWorks2016CTP3 
GO 
CREATE USER [cartersecuresafe\phil]  WITH DEFAULT_SCHEMA=dbo ; 


数据库角色:


 跟服务器角色类似,数据库也有内建角色,这些角色也具有预定好的一系列权限。也称为固定数据库角色(fixed database roles)。固定数据库角色跟服务器角色一样,只能增删用户,不能修改权限。


固定数据库角色
角色 描述
db_accessadmin 成员可在数据库中增删数据库用户。
db_backupoperator 默认为了备份所用,对第三方工具不可用,第三方工具一般需要sysadmin权限。
db_datareader 成员可以执行select命令在所有的表,可以使用DENY来禁用某些表的SELECT,因为DENY总覆盖GRANT。
db_datawriter 成员可以执行DML语句到库的任何一个表。同理可以使用DENY来控制。
db_denydatareader 与db_datareader相反,拒绝对库的所有select权限。
db_denydatawriter 与db_datawriter相反。
db_ddladmin 可以执行DDL命令,相对少用。
db_owner 库的所有者,拥有库的所有权限。
db_securityadmin 可以对用户,针对安全对象进行GRANT 、DENY、REVOKE,也可以修改除db_onwer之外的所有成员。

 除了固定数据库角色之外,也可以在数据库层面创建用户自定义角色。比如下面案例,可以创建一个SalesRole角色,属于dbo并只有Danni用户,对Sales架构的表有增删改查权限:
USE AdventureWorks2016CTP3 
GO 
--创建角色
CREATE ROLE SalesRole AUTHORIZATION dbo ; 
GO 
--对角色授权
GRANT DELETE ON SCHEMA::Sales TO SalesRole ; 
GRANT INSERT ON SCHEMA::Sales TO SalesRole ; 
GRANT SELECT ON SCHEMA::Sales TO SalesRole ; 
GRANT UPDATE ON SCHEMA::Sales TO SalesRole ; 
--添加成员
ALTER ROLE SalesRole ADD MEMBER  Danni  ; 


小结:


 SQL Server实际的安全层级相当复杂。基于角色的安全性可以简化管理工作。另外充分合理地使用两种授权:Windows身份验证和SQL Server身份验证。能够更好地降低安全风险,另外建议优先使用Windows身份验证。
 SQL Server数据库引擎通常使用登录来实现实例级别的身份验证。一般登录名在数据库层会有用户对应,但是在包含数据库中则不需要非要有登录名。

 下一篇会介绍SQL Server审计。

本文转载:CSDN博客