问题的提出
数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏 。
系统安全保护措施是否有效是数据库系统主要的性能指标之一。
非授权用户对数据库的恶意存取和破坏
数据库中重要或敏感的数据被泄露
安全环境的脆弱性
数据库安全性控制的常用方法:
DBMS对提出SQL访问请求的数据库用户进行身份鉴别,防止不可信用户使用系统。
在SQL处理层进行自主存取控制和强制存取控制,进一步可以进行推理控制。
对用户访问行为和系统关键操作进行审计,对异常用户行为进行简单入侵检测。
用户身份鉴别(Identification & Authentication)
(1) 静态口令鉴别
(2) 动态口令鉴别
(3) 智能卡鉴别
(4) 生物特征鉴别
存取控制机制组成:
用户权限定义和合法权检查机制一起组成了DBMS的存取控制子系统。
自主存取控制(Discretionary Access Control ,简称DAC)
GRANT
语义:将对指定操作对象的指定操作权限授予指定的用户
GRANT <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型> <对象名>]…
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
发出GRANT
按受权限的用户
[例4.1]:把查询Student表权限授给用户U1
(将一种权限授予一个用户)
GRANT SELECT
ON TABLE Student
TO U1;
[例4.2]:把对Student表和Course表的全部权限授予用户U2和U3
(一次向多个用户传播多种同类对象的权限。)
GRANT ALL PRIVILEGES
ON TABLE Student, Course
TO U2, U3;
[例4.3]:把对表SC的查询权限授予所有用户
GRANT SELECT
ON TABLE SC
TO PUBLIC;
[例4.4]:把查询Student表和修改学生学号的权限授给用户U4
(一次完成了对基本表和属性列这些不同对象的授权)
对属性列的授权时必须明确指出相应属性列名
GRANT UPDATE(Sno), SELECT
ON TABLE Student
TO U4;
[例4.5]:把对表SC的INSERT
权限授予U5用户,并允许他再将此权限授予其他用户
方法一:
GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION; #允许他再将此权限授予其他用户
执行该语句后,U5不仅拥有了对表SC的INSERT
权限,还可以传播此权限:
[例4.6]
GRANT INSERT
ON TABLE SC
TO U6
WITH GRANT OPTION;
同样U6还可以将此权限授予U7。
[例4.7]
GRANT INSERT
ON TABLE SC
TO U7;
但U7不能再传播此权限。
REVOKE
授予的权限可以由数据库管理员或其他授权者用REVOKE
语句收回。
REVOKE <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型><对象名>]…
FROM <用户>[,<用户>]...[CASCADE | RESTRICT];
# CASCADE:级联回收
# RESTRICT:受限回收
[例4.8] 把用户U4修改学生学号的权限收回
REVOKE UPDATE(Sno)
ON TABLE Student
FROM U4;
[例4.9] 收回所有用户对表SC的查询权限
REVOKE SELECT
ON TABLE SC
FROM PUBLIC;
[例4.10] 把用户U5对SC表的INSERT权限收回
REVOKE INSERT
ON TABLE SC
FROM U5 CASCADE ;
如果系统缺省值为RESTRICT
,回收U5的INSERT
权限时应该使用CASCADE
,否则拒绝执行该语句
如果U6或U7还从其他用户处获得对SC表的INSERT
权限,则他们仍具有此权限,系统只收回直接或间接从U5处获得的权限
执行例4.8~4.10语句后学生-课程数据库中的用户权限定义表:
模式、基本表、视图、索引是由数据库管理员在创建用户时实现。
基本表和视图、属性列是由GRANT/REVOKE
决定的。
CREATE USER语句格式:
CREATE USER <username>
[WITH][DBA|RESOURCE|CONNECT];
注:CREATE USER
不是SQL标准,各个系统的实现相差甚远。
如果要对多个用户赋予相同的权限,下面操作会很麻烦;
GRANT SELECT, UPDATE, INSERT
ON TABLE Student
TO U1, U2;
GRANT SELECT, UPDATE(Ccredit)
ON TABLE Course
TO U1, U2;
GRANT SELECT, INSERT
ON TABLE SC
TO U1, U2;
##########################
GRANT SELECT, UPDATE, INSERT
ON TABLE Student
TO U3;
GRANT SELECT, UPDATE(Ccredit)
ON TABLE Course
TO U3;
GRANT SELECT, INSERT
ON TABLE SC
TO U3;
数据库角色:被命名的一组与数据库操作相关的权限
权限
使用角色来管理数据库权限,可以简化授权和回收的过程。
创建角色:
CREATE ROLE <角色名>
给角色授权:
GRANT <权限>[,<权限>]…
ON <对象类型>对象名
TO <角色>[,<角色>]…
将一个角色授予其他的角色或用户:
GRANT <角色1>[,<角色2>]…
TO <角色3>[,<用户1>]…
[WITH ADMIN OPTION]
一个角色的权限:直接授予这个角色的全部权限加上其他角色授予这个角色的全部权限指定WITH ADMIN OPTION
,则获得权限的角色或用户还可以把这种权限授予其他角色
授予者是角色的创建者或拥有在这个角色上的ADMIN OPTION
角色权限的收回:
REVOKE <权限>[,<权限>]…
ON <对象类型> <对象名>
FROM <角色>[,<角色>]…
用户可以回收角色的权限,从而修改角色拥有的权限
REVOKE
执行者是
ADMIN OPTION
[例4.11] 通过角色来实现权限管理。
步骤如下:
(1)首先创建一个角色 R1
CREATE ROLE R1;
(2)然后使用GRANT
语句,使角色R1拥有Student表的SELECT
、UPDATE
、INSERT
权限
GRANT SELECT, UPDATE, INSERT
ON TABLE Student
TO R1;
(3)将这个角色授予王平,张明,赵玲。使他们具有角色R1所包含的全部权限
GRANT R1
TO 王平,张明,赵玲;
(4)可以一次性通过R1来回收王平的这3个权限
REVOKE R1
FROM 王平;
[例4.12] 增加角色的权限
GRANT DELETE
ON TABLE Student
TO R1;
使角色R1在原来的基础上增加了Student表的DELETE
权限。
[例4.13] 减少角色的权限
REVOKE SELECT
ON TABLE Student
FROM R1;
使R1减少了SELECT
权限。
自主存取控制缺点:
在强制存取控制中,数据库管理系统所管理的全部实体被分为主体和客体两大类
主体是系统中的活动实体
客体是系统中的被动实体,受主体操纵
敏感度标记(Label)
主体的敏感度标记称为许可证级别(Clearance Level)
客体的敏感度标记称为密级(Classification Level)
强制存取控制规则:
强制存取控制是对数据本身进行密级标记,无论数据如何复制,标记与数据是一个不可分的整体,只有符合密级标记要求的用户才可以操纵数据。
实现强制存取控制MAC时要首先实现自主存取控制DAC
原因:较高安全性级别提供的安全保护要包含较低级别的所有保护
自主存取控制DAC与强制存取控制MAC共同构成数据库管理系统的安全机制。
数据库角色
强制存取控制
把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护。
授予用户查询整个表的权限:
GRANT SELECT
ON TABLE Student
TO U1;
授予用户查询某些列的权限:
GRANT SELECT(Sno, Sname)
ON TABLE Student
TO U2;
授予用户查询某些行的权限?
GRANT
语句实现[例4.14] 授权王平老师能查询计算机系学生的情况,授权系主任张明能对计算机系学生的信息进行所有操作。
(1)先建立计算机系学生的视图CS_Student
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERE Sdept='CS';
(2)在视图上进一步定义存取权限
GRANT SELECT
ON CS_Student
TO 王平;
GRANT ALL PRIVILIGES
ON CS_Student
TO 张明;
实现数据库系统安全性的技术和方法