第 12章 SQL Server 2000数据库的安全性管理
12,1对 SQL Server的访问
12,2数据库的安全性权限
12,3角色
12,4与安全有关的 Transact-SQL语句
12,5 视图与数据访问
12,6存储过程与数据访问第 12章 SQL Server 2000数据库的安全性管理
SQL Server的安全性管理是建立在登录验证和权限许可的基础上的 。 登录验证是指核对连接到 SQL Server实例的登录帐户名和密码是否正确,以此确定用户是否具有连接到 SQL Server实例的权限 。 通过了登录验证,并不意味着用户能够访问 SQL Server实例中的各个数据库 。 用户只有在被授于访问数据库的权限许可之后才能够对服务器上的数据库进行权限许可下的各种操作 。
SQL Server还引入了角色的概念,来简化对权限许可的管理,
在 SQL Server中,安全性管理可以通过企业管理器的图形界面进行,但对于熟练的 DBA来说,使用 Transact-SQL语句进行安全性管理可能更有效率 。。
在 SQL Server中,通过使用视图和存储过程也可以控制用户对数据的访问,实现对数据安全管理 。
返回目录
12.1对 SQL Server的访问
在 SQL Server 2000中,用登录帐户来控制用户是否具有连接到
SQL Server实例的权限 。 用数据库用户帐户来控制用户是否具有操纵 SQL Server实例中的各个数据库的权限 。 而对用户身份的验证,是通过核对登录帐户名和密码是否正确来完成的 。
1,身份 验证模式 ( Authentication Modes)
SQL Server能在两种身份验证模式下运行,Windows身份验证模式和混合模式 。 在 Windows身份验证模式下,SQL Server依靠
Windows 身份验证来验证用户的身份 。 在混合模式下,SQL
Server依靠 Windows 身份验证或 SQL Server身份验证来验证用户的身份 。
( 1) Windows身份验证模式
( 2) 混合模式
在混合模式下,用户既可以使用 Windows 身份验证,也可以使用
SQL Server身份验证 。
使用 SQL Server身份验证时,用户必须提供登录帐户名和密码,
这里的登录帐户是数据库管理员在 SQL Server中创建并分配给用户的
(3) 配置身份验证模式 返回目录
2,登录帐户 ( logins) 和数据库用户帐户 ( database users)
SQL Server用数据库用户帐户来指出哪一个人可以访问哪一个数据库 。 用户对数据的访问权限以及与数据库对象的所有关系都是通过用户账号来控制的 。 数据库用户帐户通常是由数据库管理员在 SQL Server实例的各个数据库中创建的 。
一个登录账号总是与一个或多个数据库用户账号相关联 。 这个关联工作,
由数据库管理员在为用户新建登录账户或修改登录帐户属性时完成的 。
但对于一些特殊登录帐户,这个过程是由 SQL服务器自动完成的 。 如,sa
是 SQL Server内置的管理员登录账号,sa登录账号自动与每一个数据库的
dbo用户相关联 。
数据库用户账号总是与某一登录账号相关联的,但有一个例外,那就是
guest用户 。 Guest用户不具体与某一登录帐户相关联,但 Guest用户允许没有与用户帐户关联的登录帐户访问数据库 。
用户访问 SQL Server实例中的某一数据库,SQL Server检查该登录用户是否与该数据库中的某一用户帐户相关联,如果有,则允许它以该用户帐户访问数据库;如果没有,则 SQL Server检查该数据库中是否有 guest用户,如果有,则允许用户以 guest用户来访问该数据库,如果没有,则该用户对该数据库的访问被拒绝 。 在安装 SQL Server时,系统自动在 master、
pubs,tempdb和 Northwind数据库中创建 guest 用户 。
返回目录
(1) 创建登录帐户
创建登录帐户的方法有三种:使用企业管理器,使用
Transact-SQL语句,使用创建登录向导 。
(2) 授予 Windows NT/2000用户或组连接 SQL Server的权限
在 Windows NT/2000帐户 (用户或组 )可以访问数据库之前,必须授予它们连接到 SQL Server实例的权限。
(3) 创建数据库用户帐户
可以使用企业管理器或 Transact-SQL语句来创建数据库用户帐户,也可以使用企业管理器来创建数据库用户帐户。为了创建一个新的数据库用户帐户,必须事先确定一个将与该数据库用户相关的登录帐户。
返回目录
(4) sa登录帐号,dbo数据库用户帐号及数据库对象所有者 。
系统管理员 ( System Administrator) 登录帐号 sa 是为向后兼容而提供的特殊登录 。 sa是 SQL Server自动创建的,内置的登录帐号,
不能被删除 。 默认情况下,sa被授予固定服务器角色 sysadmin,
可以在 SQL Server 中进行任何活动 。
dbo是 SQL Server自动创建的,内置的数据库用户帐号,具有在数据库中执行所有活动的权限 。 SQL Server将固定服务器角色
sysadmin 的任何成员都映射到每个数据库内的 dbo用户上 。 另外,
由固定服务器角色 sysadmin 的任何成员创建的任何对象都自动属于 dbo。
创建数据库对象的用户称为数据库对象所有者 。 创建数据库对象的权限必须由数据库所有者或系统管理员授予 。 数据库对象所有者可以授予其他用户访问其所创建的对象的权限 。 数据库对象所有者没有特殊的登录 ID 或密码 。 对象创建者在创建对象时,被隐性地授予该对象的所有权限,但其他用户必须被显式授予权限后才能访问该对象 。
返回目录
14.2 数据库的安全性权限
SQL Server通过为用户分配权限来决定用户能够执行什么样的数据库操作 。 在 SQL Server中,可以为用户设置服务器权限和数据库权限 。 数据库权限又分为对象权限和语句权限 。
1,服务器权限
服务器权限用来为数据库管理员分配执行数据库管理任务的许可 。
服务器权限被预先赋于固定的服务器角色,为用户的登录帐户分配某一服务器角色,则用户具有该服务器角色所具有的服务器权限 。
服务器权限包括:关闭数据库系统,新建数据库,备份数据库等等 。
2,数据库对象权限
对象权限是用户在处理数据或执行过程时需要的权限 。 可以使用企业管理器或 Transact-SQL语句为用户分配对象权限 。 在企业管理器中分配对象权限的方法有两种,一种是针对用户来分配对象权限,另一种是针对数据库对象来分配对象权限 。
(1) 对象权限的类型:对象权限主要有 SELECT,UPDATE,INSERT、
DELETE,EXECUTE等几种类型 。
返回目录
(2) 基于用户管理对象权限
基于用户管理对象权限,可以方便地为用户分配多个数据库对象的对象权限 。 可以使用企业管理器针对用户来分配对象权限 。
(3) 基于数据库对象管理对象权限 。
基于数据库对象管理对象权限,可以方便地为多个用户分配数据库对象的对象权限 。 可以使用企业管理器针对数据库对象来分配对象权限 。
返回目录
3,数据库语句权限
对象权限使用户能够访问数据库中已经存在数据库对象 。 语句权限则使用户可以创建数据库和数据库对象 。 例如,如果用户要在数据库中创建表,则应该向该用户授予 CREATE TABLE语句权限 。 语句权限 ( 如 CREATE DATABASE) 适用于语句自身,
而不适用于特定数据库对象 。 语句权限有:
① BACKUP DATABASE 权限,允许用户执行 BACKUP
DATABASE命令 。
② BACKUP LOG权限,允许用户执行 BACKUP LOG命令
③ CREATE DATABASE权限,允许用户创建数据库 。
④ CREATE DEFAULT权限,允许用户创建列的缺省值 。
⑤ CREATE FUNCTION权限,允许用户创建函数 。
① CREATE PROCEDURE权限,允许用户创建存储过程 。
② CREATE RULE权限,允许用户创建规则 。
③ CREATE TABLE权限,允许用户创建表 。
④ CREATE VIEW权限,允许用户创建视图 。
可以使用企业管理器或 Transact-SQL语句为用户分配语句权限。
返回目录
12.3 角色
角色用来为成组的用户赋于相同的数据库权限,而不需要为每个用户单独赋权 。 用户可以根据管理需要,划分和创建出几种权限不同的角色,并将相应的数据库权限授于各个角色,然后可以将角色赋于一个或多个数据库用户帐户,这样,这些数据库用户帐户就具有了该角色所具有的权限 。。
1,角色的类型
在 SQL Server中,角色有两种类型:服务器角色和数据库角色 。
(1) 服务器角色
服务器角色是由 SQL Server自动创建的,是固定的,不能被删除,
其权限也不能被修改,用户也不能创建新的服务器角色 。
SQL Server根据 SQL Server服务器管理任务的不同,预定义了 8种固定的服务器角色,它们是,sysadmin角色,serveradmin角色,
setupadmin 角色,securityadmin 角色,processadmin 角色,
dbcreator角色,diskadmin角色,bulkadmin角色 。
返回目录
(2) 固定数据库角色
固定数据库角色,是指由 SQL Server自动创建的,固定的,不能被数据库管理员或用户修改或删除的数据库角色 。 在 SQL Server中,预定义了 9种固定数据库角色,它们是:
① db_owner角色,数据库的所有者,以执行任何数据库管理工作 。 可以对数据库内的任何对象进行任何操作 。
② db_accessadmin角色,可以在数据库中添加或删除 Windows NT 4.0 或
Windows 2000组和用户以及 SQL Server用户 。
③ db_datareader角色,可以查看来自数据库中所有用户表的全部数据 。
④ db_datawriter角色,可以添加,更改或删除来自数据库中所有用户表的数据 。
⑤ db_ddladmin角色,可以添加,修改或删除数据库中的对象 。
⑥ db_securityadmin角色,管理数据库角色和角色的成员,并管理数据库的语句权限和对象权限 。
⑦ db_backupoperator角色,可以进行数据库的备份工作 。
⑧ db_denydatareader角色,不能查看数据库中任何表的数据 。
⑨ db_denydatawriter角色,不能修改数据库中任何表的数据 。
可将任何有效的数据库用户帐户 (包括组 )或角色添加为固定数据库角色成员 。 返回目录
(3)用户自定义的数据库角色
用户自定义的数据库角色是指由用户自己创建并定义权限的数据库角色 。 用户自定义的数据库角色提供了分配给用户特定权限的能力,而这是固定数据库角色所不能提供的 。 如果要为一些数据库用户设置相同的权限,但是这些权限又与固定数据库角色的权限不同,就可以创建用户自定义的数据库角色 。
用户自定义的数据库角色有两种类型:标准角色和应用程序角色 。
标准角色是基于用户的,用于一般的数据库权限管理工作 。 应用程序角色一种比较特殊的角色类型,是基于应用程序的 。 使用应用程序角色可以限制用户只能通过特定应用程序来访问数据 。
(4) public角色
SQL Server还有一个特殊的数据库角色 pulbic。在创建数据库时,
public角色就在其中自动创建好了。 public角色不能被删除,也不能为这个角色增加或删除用户。数据库中每个用户都自动属于
public角色。如果需要提供一种缺省的权限给所有用户时,可以将这种权限赋于 public角色,由于数据库中每个用户都自动属于
public角色,所以所有的用户都自动拥有了这种权限。
返回目录
2,管理角色
( 1) 为服务器角色添加成员
通过将用户登录帐号添加到服务器角色,用户可以获得服务器角色所具有的权限 。 可以使用企业管理器或 Transact-SQL语句将用户添加到服务器角色 。
(2) 创建用户自定义的数据库角色
使用自定义的数据库角色,可以简化数据库权限的管理工作,可以使用企业管理器创建用户自定义的数据库角色。
(3) 为用户自定义的数据库角色授权
可以 使用企业管理器或 Transact-SQL语句为数据库角色授权。
(4) 为数据库角色添加成员
将数据库用户添加到数据库角色 (固定数据库角色和用户自定义的数据库角色 ),可以使用数据库用户获得数据库角色所具有的数据库权限 。 可以 使用企业管理器或 Transact-SQL语句为数据库角色赋权 。
返回目录
12.4 与安全有关的 Transact-SQL语句
除了企业管理器外,SQL Server还提供了 Transact-SQL语句来进行安全管理 。
1,与登录帐户相关的 Transact-SQL语句
SQL Server提供了一些系统存储过程,用以管理 SQL Server登录帐户 。
① sp_addlogin,创建新 SQL Server登录帐户 。
② sp_droplogin,删除 SQL Server登录帐户 。
③ sp_grantlogin,授予 Windows NT/2000用户或组帐户登录
SQL Server的权限 。
④ sp_denylogin,阻止 Windows NT/2000用户或组帐户登录到
SQL Server。
⑤ sp_revokelogin,删除用 sp_grantlogin或 sp_denylogin创建的登录项
⑥ sp_helplogins,提供有关每个数据库中的登录及相关用户的信息
返回目录
2,与数据库用户相关的 Transact-SQL语句
SQL Server提供了一些系统存储过程,用以管理数据库用户帐户 。
① sp_granddbaccess,为 SQL Server登录帐户在当前数据库中添加一个用户帐户 。
② sp_revokedbaccess,从当前数据库中删除数据库用户帐户 。
③ sp_helpuser,报告当前数据库中指定用户的信息 。
3,与权限管理相关的 Transact-SQL语句
SQL Server提供了 GRANT,REVOKE和 DENY三种 Transact-SQL
语句来管理权限 。
① GRANT,把数据库对象权限或语句权限授于指定的数据库用户,组或角色 。
② REVOKE,取消已经授于数据库用户,组或角色的数据库对象权限或语句权限 。
③ DENY,禁止数据库用户,组或角色对某一对象或语句的权限 。
返回目录
4,与角色管理相关的 Transact-SQL语句
在 SQL Server中,管理服务器角色的系统存储过程主要有:
① sp_addsrvrolemember,将登录帐号添加到固定服务器角色,使其成为固定服务器角色的成员 。
② sp_dropsrvrrolemember,从固定服务器角色中删除登录帐户,
使其不再是固定服务器角色的成员 。
在 SQL Server 中,管理数据库角色管理的系统存储过程主要有:
① sp_addrole,创建新的用户自定义的数据库角色 。
② sp_droprole,删除用户自定义的数据库角色 。
③ sp_addapprole,创建新的应用程序角色 。
④ sp_dropapprole,删除应用程序角色
⑤ sp_addrolemember,将数据库用户,组或角色添加到数据库角色,使其成为数据库角色的成员 。
⑥ sp_droprolemember,从数据库角色中,删除数据库用户,
组或角色,使其不再是数据库角色的成员 。
⑦ sp_helprole,显示当前数据库中所有数据库角色的信息 。
⑧ sp_helprolemember,显示当前数据库中所有角色的成员信息 。 返回目录
12.5 视图与数据访问
视图能作为一种安全性机制使用,以控制用户对数据的访问 。 视图是由查询语句定义的,是一张虚表,
授于用户访问视图的权限,不会使用户拥有访问视图所引用的基表或数据库的其余部分的权限 。 另外,用户只需要拥有访问视图的权限,就可以对视图中的数据进行操作
1,使用视图实现行级数据安全
可以定义一个视图,其中只包含从基表中抽取的,要让用户访问的数据行 。 授予用户访问这个视图的权限 。 这样,用户就能访问到这些数据行,而无法访问基表中其它的数据行 。
【 例 12.1】 采用视图使用户只能查看某 Employees表中来自美国的员工的信息 。
CREATE VIEW usa_employees
AS
SELECT * FROM Employees WHERE Country = 'USA'
创建视图 usa_employees后,将视图 usa_employees的 SELECT权限授予用户 。 当用户执行语句 SELECT * FROM usa_employees时,只显示 employees表中来自美国的员工信息 。 返回目录
2,使用视图实现列级数据安全
可以定义一个视图,其中只包含从基表中抽取的,要让用户访问的数据列 。 授予用户访问这个视图的权限 。 这样,用户就能访问到这些数据列,而无法访问基表中其它的数据列 。
【 例 12.2】 采用视图使用户只能查看某 Employees表的 LastName,
FirstName,Title,Country列 。
CREATE VIEW employees_ common_info
AS
SELECT LastName,FirstName,Title,Country FROM Employees
创 建 视 图 employees_ common_info 后,将 视 图 employees_
common_info的 SELECT权限授予用户,当用户执行语句 SELECT *
FROM employees_ common_info 时,只显示 employees 表的
LastName,FirstName,Title,Country列 。 返回目录
12.6 存储过程与数据访问存储过程能作为一种安全性机制使用 。 当用户拥有某个存储过程 EXEC权限时,他将能够执行这个存储过程而不必具有访问在存储过程中被访问的下层对象的权限 。
通过使用存储过程可以尽量避免用户对底层对象的直接访问,增加底层对象的安全性 。 使用存储过程控制数据访问的方法与视图类似:首先,创建存储过程;然后,
将存储过程的 EXEC权限授予相应的用户,这样,用户就可以执行存储过程了 。
返回目录