数据库的数据保护主要包括数据的安全性
和 完整性
,本篇博客只介绍数据库的完整性。
一、数据库安全性概述
数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。
1、数据库的不安全因素
- a、非授权用户对数据库的恶意存取或破坏
- b、数据库中重要或敏感数据被泄露
- c、安全环境的脆弱性
2、安全标准简介
TCSEC/TDI(即紫皮书)
从四个方面描述了安全性级别的划分指标,即 安全策略
、责任
、 保证
以及 文档
。每个方面的细节又分为若干项。
根据计算机系统对各项指标的支持情况, TCSEC/TDI
将系统划分为4组(division)7个等级,依次为: D、C1、C2、···、A(A1)
,按照系统的可靠或可信程度逐渐增高,如下表所示:
D级
最低级别,保留该级的目的是为了将一切不符合更高标准的操作系统统归于D组
C1级
能够实现对用户和数据的分离,进行自主存取控制(DAC),保护或限制用户权限的传播
C2级
安全产品的最低档,提供受控的存取保护
B1级
标记安全保护,对系统数据加以标记,并对标记的主体与客体实施强制存取控制(MAC)以及审计等安全机制
B2级
结构化保护,建立形式化的安全策略模型
B3级
安全域,该级的TCB(Trust Computing Base)必须满足访问监控器的要求,审计能力更强,并提供系统恢复过程
A1级
验证设计
二、数据库安全性控制
1、用户身份鉴别
- 静态口令鉴别
- 动态口令鉴别
- 生物特征鉴别
- 智能卡鉴别
2、存取控制
存取控制主要包括 定义用户权限
和 合法权限检查
两部分
(1)定义用户权限
用户对某一数据对象操作的权利称为权限
(2)合法权限检查
定义用户权限
和合法权限检查机制
一起组成了数据库管理系统的存取控制子系统
- C2级数据库管理系统支持
自主存取控制(Discretionary Access Control,DAC)
- B1级数据库管理系统支持
强制存取控制(Mandatory Access Control,MAC)
这两类方法的简单定义为:
(1)在 自主存取控制方法
中,用户对于不同数据库对象有不同的存取权限,不同的用户对同一个对象也有不同的存储权限,而且用户还能将其拥有的权限转授给其他用户
(2)在强制存取控制方法
中,每一个数据库对象被标以一定的密级,每一个用户授予某一个级别的许可证,对于任意对象,只有具有合法许可证的用户才能进行强制存取
3、自助存取控制方法
用户权限有两要素组成: 数据库对象
和 操作类型
,定义一个用户的存储权限就是定义该用户可以再那些数据库对象上进行哪些操作。数据自系统中,定义存取权限就称为 授权(authorization)
。
在关系数据库系统中,存取控制的对象不仅有 数据本身(基本表的数据、属性列上的数据)
,还有 数据库模式(数据库、基本表、视图、索引的创建)
,如下图所示:
4、授权:授予与收回
a、GRANT
GRANT用于向用户授予权限,一般格式如下:
GRANT <权限> [, <权限>]······
ON <对象类型> <对象名> [, <对象类型> <对象名>]······
TO <用户> [, <用户>]······
[ WITH GRANT OPTION ];
其语义为:将指定操作对象的指定操作权限授予指定的用户
,发出该语句的可以是: 数据库管理员
、 数据库创建者
、 已经拥有该权限的用户
。接受该权限的可以是一个或者对个用户,也可以是PUBLIC(全体用户)。
若使用了 WITH GRANT OPTION子句,则获得这种权限的用户还可以把这种权限再授予给其他人,若没有使用
WITH GRANT OPTION子句,获得某种权限的用户只能使用该权限而不能传播。
SQL标准不允许循环授权,即被授权者不能将权限再授回给授权者或者其祖先:
例题
把查询Student表的权限授予给用户UI
1
2
3GRANT SELECT
ON TABLE Student
TO UI;把对Student表和Course表的全部操作权限赋予给用户U2和U3
1
2
3GRANT ALL PRIVILEGES
ON TABLE Student, Course
TO U2, U3;把对SC表的查询权限授予给所有用户
1
2
3GRANT SELECT
ON TABLE SC
TO PUBLIC;把查询Student表和修改学生学号的权限授给用户U4(对属性列授权时要明确指明属性列)
1
2
3GRANT UPDATE(Sno), SELECT
ON TABLE Student
TO U4将对表SC的插入(INSERT)权限授予给U5,并允许该用户传播该权限
1
2
3
4GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION
b、REVOKE
授予用户的权限可以由数据库管理员或者其他授权者用REVOKE语句收回,该语句一般格式为:
REVOKE <权限> [, <权限>]······
ON <对象类型> <对象名> [, <对象类型> <对象名>]······
FROM <用户> [, <用户>]······[ CASCADE | RESTRICT ];
废话少说,直接上例题!
例题
将用户U4修改学生学号的权限收回
1
2
3REVOKE UPDATE(Sno)
ON TABLE Student
FROM U4;收回所有用户对SC表的查询权限
1
2
3REVOKE SELECT
ON TABLE SC
FROM PUBLIC;把用户U5对SC表的INSERT权限收回(将U5权限收回时,会级联收回U5赋予给其他用户的权限,如果其他用户从其他地方获得有对SC表的INSERT的权限则不影响,系统只回收直接或间接从U5获得的权限)
1
2
3REVOKE INSERT
ON TABLE SC
FROM U5 CASCADE;可见,用户可以“自主”地决定将数据的存储权限授予给何人,决定是否也将“授权”的权限授予别人,因此称之为
自主存取控制
c、创建数据库模式的权限
GRANT
和 REVOKE
语句用于向用户授予或回收对数据的操作权限,对创建数据库模式一类的数据库对象的授权则由数据库管理员在创建用户时实现
CREATE USER
语句格式一般如下:
CREATE USER
[ WITH ] [ DBA | RESOURCE | CONNECT ];
- 只有系统的超级用户才有权限创建一个新的数据库用户
- 新创建的数据库用户有三种权限:
CONNECT
、RESOURCE
、DBA
GREATE USER
如果没有为新建的用户指定权限,则该用户默认拥有CONNECT
权限- 拥有
RESOURCE
权限的用户能创建基本表和视图- 拥有
DBA
权限的用户是系统中心的超级用户,可以创建新的用户、创建模式、创建基本表和视图等;DBA拥有所有对数据库对象的存储权限,还可以将这些权限授予给一般用户
使用下表进行总结:
5、数据库角色
数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合
(1)角色的创建
CREATE ROLE <角色名>
刚刚创建的角色是空的,可以使用GRANT为角色授权
(2)给角色授权
GRANT <权限> [, <权限>]······
ON <对象类型> 对象名······
TO <角色> [, <角色>]······
数据库管理员和用户可以利用GRANT语句将权限授予给一个或几个角色
(3)将一个角色授予其他角色或用户
GRANT <角色1> [, <角色2>]······
TO <角色3> [, <用户1>]······
[ WITH ADMIN OPTION ]
将角色授予给某用户或者其他角色,如果指定了 WITH ADMIN OPTION
子句,则获得某权限的角色或用户还可以将这种权限授予给其他的角色,一个角色的权限包括: 直接授予给该角色权限 + 其他角色授予给该角色的权限
。
(4)角色权限的收回
REVOKE <权限> [, <权限>]······
ON <对象类型> <对象名>
FROM <角色> [, <角色>]······
例题
通过角色来将一组权限授予给用户
1、创建一个角色R1
1
CREATE ROLE R1;
2、使用GRANT语句,使角色R1拥有Student表的SELECT、UPDATE、INSERT权限
1
2
3GRANT SELECT, UPDATE, INSERT
ON TABLE Student
TO R1;3、将这个角色授予给王平、张明、赵玲,使他们具有该角色的权限
1
2GRANT R1
TO 王平, 张明, 赵玲;4、可以一次性的通过R1来收回王平的三个权限
1
2REVOKE R1
FROM 王平;5、角色权限的修改(去掉在Student表删除权限)
1
2
3GRANT DELETE
ON TABLE Student
TO R1;
由此可以看出,数据库角色是一组权限的集合,可以简化授权的过程
6、强制存取控制方法
如果使用自主存取控制方法,甲将某些数据的存储权限授予给乙,乙就可备份这些数据,并传播这些副本。为了解决此类问题,我们就有了强制存取控制策略:对数据进行敏感性标记。
在这个系统中,数据库管理系统所管理的全部实体被分为主体和客体两大类:
- 主体:系统中的活动实体,数据库管理系统所管理的实际用户,也包括代表用户的各进程
- 客体:系统中的被动实体,受主体操控,包括文件、基本表、索引、视图等
对于主体和客体,数据库管理系统为他们每一个实例(值)指派了一个 敏感度标记(label)
敏感度标记被分成若干级别,例如: 绝密(Top Secret, TS)
、 机密(Secret,S)
、 可信(Confidential,C)
、 公开(Public,P)
等,密级次序为 TS >= S >= C >= P。
主体的敏感度称为 许可证级别(clearance level)
,客体的敏感度等级称为` 密级(classification level)。
强制存取方法就是通过对比主体和客体的敏感度标记来判断主体是否可以进行存取客体
(1)仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体
(2)仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体强制存取控制是对数据本身进行密级标记