第九章 安全管理
区分安全性和完整性:
- 安全性:保护数据以防止不合法用户故意造成的破坏,确保用户被允许做其想做的事情
- 完整性:保护数据以防止合法用户无意中造成的破坏,确保用户所做的事情是正确的
对有意的非法活动可采用加密存取数据的方法控制;对有意的非法的操作可使用用户身份验证、限制操作权限来控制;对无意的损坏可采用提高系统的可靠性和数据备份等方法控制。
存取控制
当某一用户(或某一主体)以标记Label注册到系统时,系统要求他对任何客体的存取必须遵循如下规则:
- 仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体
- 仅当主体的许可证级别等于(或小于等于)客体的密级时,该主体才能写相应的客体
身份验证模式
- Windows身份验证模式:Windows验证身份,SQL Server不验证
- 混合身份验证模式:非Windows用户通过提供登录名和密码进行验证
登录账户
1. 创建登录账户
/**
* 创建SQL Server身份验证的登录账户。登录名为SQL_User1,密码为a1b2c3XY。
*/
create login SQL_User1 with password='a1b2c3XY'
/**
* 创建Windows身份验证的登录账户。从Windows域账户创建[TEST\Win_User2]登录账户。
*/
create login [TEST\Win_User2] from windows
/**
* 创建SQL Server身份验证的登录账户。登录名为SQL_User3,密码为AD4h9fcdhx32MOP,要求该登录账户首次连接服务器
* 时必须更改密码。
*/
create login SQL_User3 with password='AD4h9fcdhx32MOP'
must_change
2.修改登录账户属性
/**
* 启用已禁用的登录账户。启用SQL_User1登录账户。
*/
alter login SQL_User1 enable
/**
* 更改登录账户的密码。将SQL_User1登录账户的密码改为IsaPwd324。
*/
alter login SQL_User1 with password='IsaPwd324'
/**
* 更改账户登录名。将SQL_User3登录账户名改为NewUser。
*/
alter login SQL_User3 with name='NewUser'
3.删除登录账户
注意:应该先删除数据库中映射的数据库用户,然后再删除登录账户,否则会产生没有对应的登录账户的孤立的数据库用户。
/**
* 删除SQL_User2登录账户
*/
drop login SQL_User2
数据库用户
让登录账户成为数据库用户的操作称为“映射”。管理数据库用户的过程实际上就是建立登录账户域数据库用户之间的映射关系的过程。默认情况下,新建立的数据库只有一个用户:dbo(database owner),它是数据库的拥有者。
1.建立数据库用户
/**
* 使SQL_User2登录账户成为某数据库中的用户,并且用户名同登录名
*/
create user SQL_User2
/**
* 首先创建名为SQL_JWC且具有密码的SQL Server身份验证的服务器登录名,
* 然后在test数据库中创建与此登录名对应的数据库用户JWC
*/
create login SQL_JWC
2.guest用户
guest是SQL Server中一个特殊的数据库用户,在实际应用中经常作为数据库的匿名访问者使用。当没有映射到数据库用户的登录账户试图访问数据库时,SQL Server将尝试用guest用户来连接。可以通过为guest用户授予CONNECT权限来启用用户数据库中的guest用户。
/**
* 启用guest用户
*/
grant connect to guest
/**
* 收回guest用户权限
*/
revoke connect to guest
3.删除数据库用户
从当前数据库中删除一个用户,实际就是接触登录账户和数据库用户之间的映射关系,但并不影响登录账户的存在。删除数据库用户之后,其对应的登录账户仍然存在。
权限管理
对象级别的权限
- SELECT
- INSERT
- UPDATE
- DELETE
- REFERENCES
- EXECUTE
/**
* 授予用户RosaQdM对Address表具有SELECT权限
*/
grant select on Address to RosaQdM
/**
* 授予用户RosaQdM对HumanResource.EmployeeInfo存储过程具有EXECUTE权限
*/
grant execute HumanResource.EmployeeInfo to RosaQdM
/**
* 使用GRANT OPTION选项,授予用户Wanida对vEmployee视图中EmployeeID列具有REFERENCES权限
*/
grant references(EmployeeID) on vEmployee to Wania with grant option
/**
* 拒绝用户RosaQdM对Person.Address表具有select权限
*/
deny select on object::Person.Address to RosaQdM
/**
* 拒绝用户RosaQdM对HumanResources.EmployeeInfo存储过程具有EXECUTE权限
*/
deny execute on HumanResource.EmployeeInfo to RosaQdM
/**
* 使用CASCADE选项。拒绝用户Wanida对HumanResources.vEmployee视图中EmployeeID列具有REFRENCES权限
*/
deny references(EmployeeID) on HumanResources.vEmployee to Wanida cascade
/**
* 撤销用户RosaQdM对Person.Address表的SELECT权限
*/
revoke select on Person.Address from RosaQdM
/**
* 撤销用户RosaQdM对HumanResources.EmployeeInfo存储过程的EXECUTE权限
*/
revoke execute on HumanResources.EmployeeInfo from RosaQdM
语句级别的权限
- CREATE DATABASE
- CREATE PROCEDURE
- CREATE TABLE
- CREATE VIEW
- CREATE FUNCTION
- BACKUP DATEABASE
- BACKUP LOG
/**
* 授予用户RosaQdM具有创建表的权限
*/
grant create table to RosaQdM
/**
* 授予用户user1和user2都具有创建表和视图的权限
*/
grant create table,create view to user1,user2
/**
* 拒绝用户user1具有创建视图的权限
*/
deny create view to user1
/**
* 收回用户RosaQdM创建表的权限
*/
revoke create table from RosaQdm
角色
为便于对用户及权限进行管理,可以将一组具有相同权限的用户组织在一起,这一组具有相同权限的用户就成为角色(Role)。角色类似于Linux中的用户组的概念。
固定服务器角色
用户不能添加、删除和更改固定服务器角色。可以将登录账户添加到固定服务器角色中,使其成为服务器角色中的成员,从而具有服务器角色的权限。
固定服务器角色:
- bulkadmin:具有执行BULK INSERT语句的权限
- dbcreator:具有创建、修改、删除和还原数据库的权限
- diskadmin:具有管理磁盘文件的权限
- processadmin:具有管理运行在SQL Server中的进程的权限
- securityadmin:管理登录账户、读取错误日志
- serveradmin:具有设置服务器级别的配置选项和关闭服务器的权限
- setupdamin:添加和删除链接服务器
- sysadmin:系统管理员。拥有所有权限。
/**
* 将Windows身份验证的TEST\Win_User1登录名添加到sysadmin角色中
*/
exec sp_addsrvrolemember 'TEST\Win_User1','sysadmin'
/**
* 将SQL身份验证的SQL_User2登录名添加到dbcreator角色中
*/
exec sp_addsrvrolemember 'SQL_User2','dbcreator'
/**
* 从dbcreatorzhong角色中删除SQL_User2
*/
exec sp_dropsrvrolemember 'SQL_User2','dbcreator'
固定数据库角色
固定数据库角色:
- db_accessadmin:具有添加和删除数据库用户的权限
- db_backupoperator:具有备份数据库、备份日志的权限
- db_datareader:具有查询数据库中所有用户数据的权限
- db_datawriter:具有插入、删除和更改数据库中所有用户数据的权限
- db_ddladmin:具有执行DDL的权限
- db_denydatareader:不允许具有查询数据库中所有用户数据的权限
- db_denydatawriter:不允许具有插入、删除和更改数据库中所有用户数据的权限
- db_owner:具有全部权限
- db_securityadmin:具有管理数据库角色、角色成员以及数据库中的语句和对象的权限
除了以上角色外,还有一个叫作public角色,如果未向某个用户授予或拒绝对安全对象的特定权限,则该用户将具有public角色的权限。
/**
* 将Windows登录名为TEST\Win_User1添加到当前数据库中的db_datareader中
*/
exec sp_addrolemember 'db_datareader','TEST\Win_User1'
/**
* 将SQL_User2添加到当前数据库的db_datawriter角色中
*/,
exec sp_addrolemember 'db_datawriter','SQL_User2'
/**
* 在当前数据库中,删除db_datawriter角色中的SQL_User2成员。
*/
exec sp_droprolemember 'db_datawriter','SQL_User2'
用户定义的角色
用户定义的角色的成员可以是数据库的用户,也可以是用户定义的角色。
用户所拥有的权限: 角色授予的权限+他们自己所具有的权限-角色中拒绝的权限-他们自己被拒绝的权限。
为用户定义的角色授予权限与对用户授权的方式一样。
注意:要想删除拥有安全对象的角色,必须先删除安全对象或转移安全对象。若要删除角色,必须先删除角色中的成员。
/**
* 在当前数据库中创建用户自定义角色CompDept,其拥有者为创建该角色的用户
*/
create role CompDept
/**
* 在当前数据库中创建用户自定义角色InfoDept,其拥有者为SQL_User1
*/
create role InfoDept authorization SQL_User1
/**
* 在当前数据库中创建用户自定义角色MathDept,其拥有者为Software角色
*/
create role MathDept authorization Software