第2章 SQL Server安全管理

2.1. 权限管理的基本方法
可以使用下面几种方式授予登录操作数据库的权限:
(1) 将登录加入到服务器角色中。例如,将登录加入到sysadmin服务器角色中,登录就具有对所有数据库的全部操作权限。
(2) 将登录映射到某一个数据库的某一个用户,并将映射的用户加入到具有相应操作权限的数据库角色中。
(3) 将登录映射到某一个数据库的某一个用户,授予该用户对某些特定的数据库对象的操作权限。
其中,方法1和方法2都是一种隐含的授权操作,有时这些方法会将过多的权限授予登录。方法3是一种更为细化的授权操作。
2.2. 使用服务器角色给登录授予权限
2.2.1. 数据库服务器角色
SQL Server 2012提供了9个服务器角色(“角色”类似于Windows中的“组”),这些角色从服务器一级定义了对数据库服务器操作的权限。但这些角色的管理只限于给这些角色添加或删除成员,并不能创建新的服务器角色或删除已有的服务器角色,也不能修改它们中的权限,所以它们也被你为固定服务器角色。
除固定服务器角色外,SQL Server 2012及以后的版本中,可以创建删除用户定义的服务器角色,也可以修改用户定义的服务器角色的权限。
需要注意的是服务器角色与数据库角色的区别,后者是在数据库一级定义的操作权限,它是针对某一数据库而不是数据库服务器的。
服务器角色的成员是数据库服务器的登录或者其它服务器角色,既可以是Windows登录也可以是SQL Server登录。通过将某一登录添加到某一个服务器角色中,该登录就继承服务器角色的权限,拥有对整个数据库服务器相应的操作权限。例如,将前面创建的Windows登录GUO\david加入到sysadmin服务器角色中,该登录就拥有对整个数据库服务器的所有操作权限(sysadmin拥有对数据库服务器操作的所有权限)。
如果不需要对整个服务器进行管理,则一般不需要将登录添加到某一个服务器角色中,而是使用数据库角色来完成安全权限的配置。
2.2.2. 权限不足的操作
创建一个使用SQL Server验证模式的SQL Server的登录student,首先使用具有相应操作权限的登录(如sa)连接到SQL Server数据库服务器,在“安全性”节点中点击右键并选择“创建新登录”进入到创建新登录的对话框,在对话框中输入新创建的登录的名称student,选择SQL Server验证模式,如果不需要设置登录的密码则不能选择“强制实施密码策略”,否则必须设置由字母和数字混合组成的密码。
现在,使用新创建的登录student 连接到SQL Server数据库服务器,并创建另一个新登录的操作或其它的操作,则会出现如下的错误信息:

2.2.3. 修改登录的服务器角色集
使用sa或Windows的administrators用户组的用户连接到数据库服务器,选择“安全性/登录”节点中的student登录,修改属性将sysadmin服务器角色加入到student登录的服务器角色集中。
注解:修改登录的服务器角色集类似于Windows中修改用户的组属性,即修改Windows用户隶属于组的集合。

也可以使用如下的T-SQL命令将登录添加到服务器成员列表中:

–将登录student添加到服务器角色sysdamin中
ALTER SERVER ROLE [sysadmin] ADD MEMBER [student]
GO
注解:在联机文档中提供的命令示例ALTER SERVER ROLE diskadmin ADD [Domain\Juan]有误。

在将新的登录student添加到sysadmin角色中后,登录student就具有了对数据库服务所有的操作权限。
再次进行前面的创建一个新登录的操作,这次发现student登录可以完成这一操作。实际上,student可以完成所有对数据库服务器的操作。
完成操作后使用下面的命令将登录student从sysadmin中删除。
–从服务器角色sysadmin中删除角色成员student
ALTER SERVER ROLE [sysadmin] DROP MEMBER [student]
GO
2.3. 使用数据库角色授权
使用数据库角色授权是将对某一数据库的所有对象某些操作权限授予某一登录。但这种授权不是直接将操作权限授予登录,而是首先将登录映射到某一个数据库的某一用户,再将用户添加到数据库角色成员列表中。例如,图2-3中的登录student映射到数据库AdventureWorks的stu_user用户,然后将stu_user添加到db_owner数据库角色成员列表中,这样stu_user就继承了db_owner的所有权限,而student登录又继承了stu_user对数据库AdvertureWorks的操作权限,因为db_owner包含了对数据库的所有操作权限,所以,student登录就获得了对数据库AdventureWorks的所有操作权限。
操作步骤如下:
(1) 使用系统管理员登录(在Windows Administrators组中的Windows用户或SQL Server的sa登录)连接到数据库。
(2) 创建一个登录(也可以使用没有经过授权的已有的登录)student。
CREATE LOGIN student
WITH PASSWORD=”, DEFAULT_DATABASE=master
(3) 设置登录在数据库AdventureWorks的用户映射。
USE AdventureWorks
GO
CREATE USER stu_user FOR LOGIN student
GO
(4) 将用户stu_user添加到数据库角色db_owner(数据库拥有者)中。
USE [AdventureWorks]
GO
ALTER ROLE [db_owner] ADD MEMBER [stu_user]
GO
经过上面的操作(图2-3),登录student就成为数据库AdventureWorks的拥有者,可以对该数据库进行相应的操作,如创建、修改、删除数据库对象等。
2.4. 指定特定对象的权限
使用数据库服务器角色是对所有数据库中的所有对象授权,而使用数据库角色则是对某一个数据库中的所有对象进行授权。当需要对特定的数据库对象进行授权时, 则必须创建应用程序角色或对特定对象进行授权。下面的操作过程演示了对数据库AdventrueWorks中的表Person.Address(其中,Person是架构名,Address是表名)进行查询和更新的授权操作。
(1) 创建一个SQL Server验证的登录application,设置它的默认数据库为AdventureWorks并设置在该数据库中的用户映射。
(2) 以该登录连接数据库服务器,查看数据库AdventureWorks下的数据库对象,结果只能看到数据库的系统对象,数据库的其它对象则看不到。
(3) 选择数据库AdventureWorks的用户application修改其属性。
(4) 在属性对话框中选择“安全对象”页,如图2-4所示:

图 2 4 修改数据库用户的安全对象属性
(5) 在图2-4中,选择右边窗口中的“添加”按钮,添加对特定数据库对象的操作权限,进入到图2-5所示的操作。
图 2 5 用户授权中选择对象类型
选择相应的对象,如图2-5中只选择了表Person.Address,可以选择多个对象。

图 2 6 选择授权的数据库对象
(6) 点击“确定”按钮后回到修改“安全对象”属性对话框,如图2-7所示。在该对话框中选择Select的授权。它也可以使用如下的命令完成:
图 2 7 授予用户操作数据库对象Person.Address的权限
(7) 选择Update权限,点击“列权限”按钮将更新某些列的权限授予用户,如图2-8。在此,我们授予更新列AddressLine1、AddressLine2、City和PostalCode的权限。

图 2 8 授予操作某些列的权限
更新这些列的授权操作也可以使用下面的命令完成:

(8) 点击图2-8中的“确定”完成授权的操作。
通过上面的授权操作,使用登录application连接数据库后可以对数据库AdventureWorks中的Person.Address进行查询所有列和更新表中的AddressLine1、AddressLine2、City和PostalCode列的操作。下面演示经过授权的操作和没有经过授权的操作的结果。
(9) 使用application登录连接查询分析器,在查询分析器中输入查询表Person.Address的命令并执行,得到的结果如所示。
图 2 9 查询数据库的表
(10) 输入相应的命令查询表Person.AddressType,得到的结果如所示,这是因为该登录没有将查询该表的权限。
图 2 10 没有授权的查询操作
(11) 更新表中的列,在查询分析器中使用命令更新表Person.Address的列AddressLine1,如图2-11所示。
图 2 11 更新表中经过授权的列
(12) 更新表Person.Address中的列StateProvinceID,这是一个没有操作权限的列,结果如图2-12所示。
图 2 12 更新表中没有授权的列
2.5. 实验目的、内容与要求
2.5.1. 实验目的
通过本实验,掌握SQL Server安全管理中的登录、数据库服务器角色、用户、数据库角色、特定对象权限等基本概念与安全机制,掌握数据库服务器角色授权、数据库角色授权和特定对象授权的方法与各种方法的差异。
2.5.2. 实验内容
实验一 SQL Server的基本安全管理
使用管理员登录连接到数据库服务器创建一个SQL Server登录并使用它完成如下的操作:
创建一个数据库,在数据库中创建一个表,创建表可以使用如下的命令。
具体的实验内容:
(1) 创建一个登录并将创建的数据库设置为该登录的默认数据库。
(2) 设置登录在默认数据库中的用户映射。
(3) 尝试将登录加入到两个不同的数据库服务器角色中对默认数据库进行操作(如创建表Score,查询表StudentInfo等)。注意每次只使用一个数据库服务器角色来验证授权。
(4) 尝试使用两个不同的数据库角色进行相应的授权操作。
(5) 只使用特定对象授权,完成相应的操作以验证授权的成功和没有授权时发生的错误。
2.5.3. 实验要求
实验报告中要求给出实验内容中(1)—(5)的每一个的描述。其中,
(1) 使用T-SQL命令而非图形界面描述具体的操作过程。
(2) 内容(3)要求使用不同的服务器角色进行实验,要求至少使用2个以上的服务器角色进行测试,简单描述如何将登录加入到服务器角色的操作过程,给出加入不同服务器角色的测试方法与测试结果。注意,加入服务器角色是分别加入,是即加入一个服务器角色进行测试后,将其从服务器角色中删除然后再加入另一个服务器角色。验证授权前后及不同服务器角色授权之间的差异
(3) 内容(4)与内容(3)类似,只是所使用的是数据库角色而不是服务器角色。
(4) 内容(5)要求选择一个或多个具体的数据库对象(如表)设置查询、更新或插入的权限进行相应的测试。其中,有一部分内容必须是仅能够对部分列具有操作权限而对其它列没有操作权限。对于有操作权限与没有操作权限的都要进行相应的测试,给出测试的方法、结果与结果分析。要求结合在数据库原理中所学习的SQL语言的知识使用命令完成而不是使用图形界面。
每个小的实验都必须给出具体的实验方法、实验结果与结果分析。在对每个实验结果的分析中要描述产生正确结果或错误的原因,有些可以写出相应的解决方法。例如,操作了对某个表的查询是因为登录XXX在数据库YYY中映射到用户UUU,而用户又属于数据库角色DB_ROLEX,数据库的角色DB_ROLEX具有对数据库的…操作权限,所以能够查询该表。对于不能完成的操作也必须做出相应的分析。

猜你喜欢

转载自blog.csdn.net/maguanzhan7939/article/details/77924643