数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT

常用的存取控制方法有:自主存取控制(DAC)、强取存取控制(MAC)
自主存取控制可以通过SQL的GRANT语句(授予权限)和REVOKE语句(收回权限)实现。
只有被授予了相应的权限了之后才能做下面的操作。
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
GRANT 授予权限
语义:将对指定操作对象的指定操作权限授予指定的用户
语句格式:

GRANT <权限>[,<权限>]... 
ON <对象类型> <对象名>[,<对象类型> <对象名>]…
TO <用户>[,<用户>]...
[WITH GRANT OPTION];

WITH GRANT OPTION子句:指定时可以再授予;没有指定时不能传播。
一次可以授予多个权限,没有指定时就是最终用户,不可以再由此用户将权限授予给其他用户。

在授予权限之前要保证已经有了要授予权限的用户。关于如何创建用户,之前的作业中已经提及过了,这里不再重复。数据库使用SQL语句新建数据库及新建用户WANG
用户U1创建成功后,在创建用户U2时出现下面的错误。
修改方法:新建不同的登录名,之后在建立用户名,登录名和用户名相同或者在【登录名】–【浏览】那里直接选不同的默认项。
这里采用第一种方法。
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT

【例4.1】把查询Student表权限授给用户U1.

/*标准SQL*/
GRANT SELECT
ON TABLE Student
TO U1

在SQL SERVER中出现错误:关键词"TO"附近有语法错误。
查询资料得到将语句改为下面的可以成功运行:

/*T-SQL*/
GRANT SELECT
ON  Student
TO U1

将登录名更改为U1登录,可以看到只有一个Student表,可以成功查询出来。
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
在U1的登陆下,只有Student一个表,只能对此表作查询操作,其他表和其他的操作都做不了。
【例4.2】把对Student表和Course表的全部权限授予用户U2和U3.

/*标准SQL*/
GRANT ALL PRIVILEGES
ON TABLE Student,Course
TO U2,U3;
/*T-SQL*/
GRANT ALL PRIVILEGES ON Student TO U2,U3
GRANT ALL PRIVILEGES ON Course TO U2,U3;

在实验过程中报错:“,”附近有语法错误。
在SQL SERVER中不支持将多个表的权限授予给多个用户,需要将表分开,依次授予。先将Student的全部权限授予给U2,U3,在将Course的全部权限授予给U2,U3;
ALL 权限已不再推荐使用,并且只保留用于兼容性目的。它并不表示对实体定义了 ALL 权限。
使用U2登录测试数据:
查询成功:
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
修改成功:将刘辰改为liu
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
删除成功:删除张兰11
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
【例4.3】把对表SC的查询权限授予所有用户.

/*标准SQL*/
GRANT SELECT 
ON TABLE SC
TO PUBLIC;
/*TSQL*/
GRANT SELECT 
ON SC
TO PUBLIC;

使用用户U6登录查询成功;其他用户登录查询也成功。
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
【例4.4】把查询Student表和修改学生学号的权限授给用户U4.

GRANT SELECT,UPDATE(Sno)
ON Student
TO U4;

登录U4测试成功:
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
对属性列的授权时必须明确指出相应属性列名 。
当主码没有在其他的表中使用时,可以修改,但是如果在其他的表中使用时则不可以修改。
例如学号‘201215121’在SC表中使用了,如果将其修改时则会出现错误。
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
【例4.5】把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户

GRANT INSERT
ON SC
TO U5
WITH GRANT OPTION

数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
WITH GRANT OPTION:U5不仅拥有了对表SC的INSERT权限,还可以传播此权限:
【例4.6】

GRANT INSERT
ON SC
TO U6
WITH GRANT OPTION;

同时U6还可以将此权限授予给U7
测试成功
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
【例4.7】

GRANT INSERT
ON SC
TO U7;

但是U7不能再传播此权限给其他用户。
测试成功。
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
U6的INSERT权限时是由U5传递过来的,U7的INSERT权限是由U6传递过来的,而由【例4.3】U5、U6、U7的SELECT 权限是由DBA传递过来的。(DBA拥有所有的权限)

REVOKE收回权限
语句的一般格式为:

REVOKE <权限>[,<权限>]... 
ON <对象类型> <对象名>[,<对象类型><对象名>]…
FROM <用户>[,<用户>]...[CASCADE | RESTRICT];

CASCADE:级联;RESTRICT:受限
【例4.8】把用户U4修改学生学号的权限收回.

/*标准SQL*/
REVOKE UPDATE(Sno)
ON TABLE Student
FROM U4;
/*T-SQL*/
REVOKE UPDATE(Sno)
ON  Student
FROM U4;

同样,T-SQL需要去掉对象类型TABLE;
在这里使用另一种方法来检测是否已经收回权限。
在sa登陆的情况下,点击Student数据库–【安全性】–【用户】–【U4】-【安全对象】
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
可以查看到已经收回了更新Sno的权限。
【例4.9】收回所有用户对表SC的查询权限

REVOKE SELECT 
ON SC
FROM PUBLIC;

【例4.10】把用户U5对SC表的INSERT权限收回

REVOKE INSERT
ON SC
FROM U5 CASCADE;

数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
将用户U5的INSERT权限收回的时候应该使用CASCADE,否则拒绝执行该语句 .
如果U6或U7还从其他用户处获得对SC表的INSERT权限,则他们仍具有此权限,系统只收回直接或间接从U5处获得的权限 .
收回U5INSERT权限的同时,U6、U7的INSERT权限也被收回了。

数据库角色:被命名的一组与数据库操作相关的权限
角色是权限的集合。可以为一组具有相同权限的用户创建一个角色。
优点:简化授权的过程
如果一个个的授权再收回比较麻烦,使用角色就可以批量处理了。
1.角色的创建

CREATE  ROLE  <角色名> 

2.给角色授权

GRANT  <权限>[,<权限>]… 
 ON <对象类型>对象名  
 TO <角色>[,<角色>]…

3.将一个角色授予其他的角色或用户

GRANT  <角色1>[,<角色2>]…
TO  <角色3>[,<用户1>]… 
[WITH ADMIN OPTION]
  • 该语句把角色授予某用户,或授予另一个角色
  • 授予者是角色的创建者或拥有在这个角色上的ADMIN OPTION
  • 指定了WITH ADMIN OPTION则获得某种权限的角色或用户还可以把这种权限授予其他角色

一个角色的权限:直接授予这个角色的全部权限加上其他角色授予这个角色的全部权限
4.角色权限的收回

REVOKE <权限>[,<权限>]…
ON <对象类型> <对象名>
FROM <角色>[,<角色>]…

用户可以回收角色的权限,从而修改角色拥有的权限。
REVOKE执行者是角色的创建者或者拥有在这个(些)角色上的ADMIN OPTION。
【例4.11】通过角色来实现将一组权限授予一个用户。
(1)首先创建一个角色R1

CREATE ROLE R1;

数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
(2)然后使用GRANT语句,使角色R1拥有Student表的 SELECT、UPDATE、INSERT权限

GRANT SELECT,UPDATE,INSERT
ON TABLE Student
TO R1;

(3)将这个角色授予王平,张明,赵玲。使他们具有角色R1所包含的全部权限

GRANT R1
TO 王平,张明,赵玲;

在执行这一步时,出现”R1“附近有语法错误。
解决方法:新建用户王平、张明和赵玲

EXEC sp_addrolemember 'R1','王平';
/*或者*/
ALTER ROLE R1
ADD MEMBER 王平;
ALTER ROLE R1
ADD MEMBER 张明;
ALTER ROLE R1
ADD MEMBER 赵玲;

数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
(4)可以一次性通过R1来回收王平的这3个权限

REVOKE R1
FROM 王平;

还是出现错误出现”R1“附近有语法错误。
解决方法:

EXEC sp_droprolemember 'R1','王平';

再次查看王平的【成员身份】,R1已经不在选中,表示王平的三个权限已经被收回了。
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
如果要收回张明和赵玲的UPDATE权限,只需要将R1的UPDATE权限收回就行

REVOKE UPDATE
ON TABLE Student
FROM R1;

【4.12】角色的权限修改
使角色R1在原来的基础上增加了Student表的DELETE 权限,权限增加了

GRANT DELETE
ON  TABLE Student
TO R1;

【4.13】角色权限的删除
使R1减少了SELECT权限

REVOKE SELECT 
ON TABLE Student
FROM R1;

所有有R1的SELECT 权限都被收回了。

强制存取控制方法
主体的敏感度标记称为许可证级别;
客体的敏感度标记称为密级.
敏感度标记分成若干级别:绝密、机密、可信、公开。
强制存取控制规则:
(1)仅当主体的许可证级别大于或等于客体的密级时,该主体才能读相应的客体;
(2)仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体。(简单记作:向下读,向上写)

视图机制
把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护
间接地实现支持存取谓词的用户权限定义

【例4.14】建立计算机系学生的视图,把对该视图的SELECT权限授于王平,把该视图上的所有操作权限授于张明

/*先建立计算机系学生的视图*/
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERE Sdept='CS'
/*在视图上进一步定义存取权限*/
GRANT SELECT 
ON CS_Student
TO 王平;
GRANT ALL PRIVILIGES
ON CS_Student
TO 张明;

数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT
Q1:什么是存取谓词?
查找出部分内容的约束条件

Q2:为什么要用视图间接实现,直接用基本表不可以吗?
为不同的用户定义不同的视图,把数据对象
限制在一定范围内,可以通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而对数据提供一定程度的安全保护。
审计(Audit)
审计日志:将用户对数据库的所有操作记录在上面
审计员利用审计日志,监控数据库中的各种行为,找出非法存取数据的人、时间和内容。

AUDIT语句:设置审计功能
NOAUDIT语句:取消审计功能

【例4.15】对修改SC表结构或修改SC表数据的操作进行审计

AUDIT ALTER,UPDATE
ON SC;

结构修改使用ALTER,数据修改使用UPDATE
【例4.16】取消对SC表的一切审计

NOAUDIT ALTER,UPDATE
ON SC;

总结:1、在创建用户名时一个登录名对应一个用户名,可以使用多个登录名创建多个用户名,登录名与用户名一一对应。
2、标准SQL 与T-SQL 对于授予权限的不同:T-SQL在ON后面不加类型TABLE,去掉TABLE。
3、T-SQL不能同时将多个表的全部权限授予给多个用户,可以一个一个表的将所有权限授予给多个用户。
4、在检测权限是否被授予和收回时,除了用户登录挨个测试之外,还可以通过【安全性】-【用户】双击打开相应的用户,在【安全对象】中查看被授予的权限。

这次的作业有好多和标准SQL不一样的地方,测试起来经常出错,让人有点崩溃!

上一篇:数据库作业11:SQL练习7 - GRANT/ REVOKE / AUDIT


下一篇:Fortify Audit Workbench 笔记 Path Manipulation