在数据库层面,以授权到安全主体来实现安全性。 相对于服务器级别,数据库级别称为数据库用户和数据库角色。
用户:
通常情况下,数据库用户是从实例层面创建的登录名来实现。相同实例下,一个登录名可以映射到多个数据库用户中,并且可以单独授权到数据库层面。从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审计。
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。