数据库安全主要是指DBMS的存取控制机制.数据库安全最重要的一点就是确保只有授权用户访问数据库,同时令所有未被授权的人员无法接近数据,这主要通过数据库系统的存取控制机制实现.
存取控制机制主要包括两部分:
(1)用户权限定义.用户权限是指不同的用户对于不同的数据对象允许执行的操作权限.系统必须提供适当的语言定义用户权限,这些定义经过编译后存放在数据字典中,被称作安全规则.
(2)合法权限检查.每当用户发出存取数据库的操作请求后,DBMS查找数据字典,根据安全规则进行合法权限检查,若用户的操作请求超出了定义的权限,系统将拒绝执行此操作.
用户权限定义和合法权限检查一起组成了DBMS的安全子系统,支持自主存取控制(DAC)和强制存取控制(MAC).这两类方法的简单定义是:
(1)自主存取控制DAC方法:用户对于不同的数据对象有不同的存取权限,不同的用户对同一对象也有不同的权限,而且用户还可将其拥有的存取权限转授给其他用户.因此自主存取控制非常灵活.
(2)强制存取控制MAC方法:每一个数据对象被标以一定的密级,每一个用户也被授予某一个级别的许可证.对于任意一个对象,只有具有合法许可证的用户才可以存取.强制存取控制因此相对比较严格.
1. 自主存取控制
自主存取控制DAC是在用户标识和鉴别的基础上,对用户进行授权.大型数据库管理系统几乎都支持C1级的自主存取控制,目前的SQL标准也对自主存取控制提供支持,这主要通过SQL 的GRANT语句和REVOKE语句来实现.
用户权限是由四个要素组成:权限授出用户(Grantor),权限接受用户(grantee),操作数据对象(Object),操作类型(Operate).定义一个用户的存取权限就是要权限授出用户定义权限接受用户可以在哪些数据对象上进行哪些类型的操作.在数据库管理系统中,定义存取权限称为授权(Authorization).
数据对象的建立者(拥有者)和超级用户(DBA)自动拥有数据对象的所有操作权限,包括权限授出的权限;接受权限用户可以是系统中标识的任何用户;数据对象不仅有表和属性列等数据本身,还有模式,外模式,内模式等数据字典中的内容,常见的数据对象有基本表(Table),视图(View),过程(Procedure)等;操作类型有建立(CREATE),增加(INSERT),修改(UPDATE/ALTER),删除(DELETE/DROP),检索(SELECT)等.
例如:基本表student的建立者usera使用GRANT将student表的操作权限授予不同的用户,使用REVOKE收回权限.
GRANT SELECT ON student TO user1;
GRANT INSERT,UPDATE,DELETE ON student TO user2;
GRANT SELECT,INSERT,UPDATE,DELETE ON student TO user3;
REVOKE SELECT ON student FROM user1;
REVOKE INSERT ON student FROM user2;
REVOKE ALL ON student FROM user3;
用户权限定义中数据对象范围越小授权就越灵活.有的系统可精细到字段级,而有的系统只能对关系授权.授权粒度越细,系统定义与检查权限的开销也会相应地增大.关系数据库中授权的数据对象横向粒度有:数据库,表,属性列等.
衡量授权精巧程度的另一个尺度是丛向粒度,能否提供与数据值有关的授权.一般的授权定义是独立于数据值的,即用户能否对某类数据对象执行的操作与数据值无关,完全由数据名决定.若授权依赖于数据对象的内容,则称为是与数据值有关的授权.
实现与数据值有关的授权可以使用存取谓词,定义存取的条件,限制存取的记录.同时也可以使用系统变量,限制存取的时间,存取使用的终端等等.
数据库管理系统一般都支持视图数据对象,使用视图机制实现属性列的授权和与数据值有关的授权.将属性列的存取限制和数据值的存取限制定义在合适的视图中,然后针对视图进行授权.例如:student表的建立者usera建立视图v_student并授权userb查询权限,其中属性列只选择sno(学号),sname(姓名),sclass(班级),其它列不能存取;只选取系部编号为"0001"的记录,其它记录不能存取.
CREATE VIEW v_student AS
SELECT sno,sname,sclass FROM student WHERE sdept="0001";
GRANT SELECT ON v_student TO userb;
自主存取控制能够通过授权机制有效地控制其他用户对敏感数据的存取.但是由于用户对数据的存取权限是"自主"的,用户可以自由地决定将数据的存取权限授予其它用户.在这种授权机制下,仍可能存在数据的"无意泄露".如:用户usera将数据对象权限授予用户userb,usera的意图是只允许userb操纵其这些数据,但是userb可以在usera不知情的情况下进行数据备份并进行传播.出现这种问题的原因是,这种机制仅仅通过限制存取权限进行安全控制,而没有对数据本身进行安全标识.解决这一问题需要对所有数据进行强制存取控制.
2. 强制存取控制
强制存取控制MAC是指系统为保证更高程度的安全性,按照TDI/TCSEC标准中安全策略的要求,所采取的强制存取检查手段.它不是用户能直接感知或进行控制的.MAC适用于那些对数据有严格而固定密级分类的部门,例如军事部门或政府部门.
在MAC中,DBMS所管理的全部实体被分为主体和客体两大类.
主体是系统中的活动实体,既包括DBMS所管理的实际用户,也包括代表用户的各进程.客体是系统中的被动实体,是受主体操纵的,包括文件,基本表,索引,视图等等.对于主体和客体,DBMS为它们指派一个敏感度标记(Label).
敏感度标记被分成若干级别,例如绝密(Top Secret),机密(Secret),可信(Confidential),公开(Public)等.主体的敏感度标记称为许可证级别(Clearance Level),客体的敏感度标记称为密级(Classification Level).MAC机制就是通过对比主体的Label和客体的Label,最终确定主体是否能够存取客体.
当某一用户或某一主体以标记label注册进入系统时,系统要求他对任何客体的存取必须遵循如下规则:
(1)仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体;
(2)仅当主体的许可证级别等于客体的密级时,该主体才能写相应的客体.
在某些系统中,与第2条规则有些差别:仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体,即用户可以为写入的数据对象赋予高于自己的许可证级别的密级.这样一旦数据被写入,该用户自己也不能再读该数据对象了.这两种规则的共同点在于它们均禁止了拥有高许可证级别的主体更新低密级的数据对象,从而防止了敏感数据的泄漏.
强制存取控制(MAC)是对数据本身进行密级标记,无论数据如何复制,标记与数据是一个不可分的整体,只有符合密级标记要求的用户才可以操纵数据,从而提供了更高级别的安全性.
在实现MAC时要首先实现DAC,即DAC与MAC共同构成DBMS的安全机制.系统首先进行DAC检查, 对通过DAC检查的允许存取的数据对象再由系统自动进行MAC检查,只有通过MAC检查的数据对象方可存取.
在有些系统中,为了保护数据本身的安全性,采用了数据加密技术,对高度敏感数据进行保护.数据加密是防止数据库中数据在存储和传输中失密的有效手段.加密的基本思想是根据一定的算法将原始数据(明文,Plain text)变换为不可直接识别的格式(密文,Cipher text),从而使得不知道解密算法的人即使获取了密文无法获知原文.数据加密与解密是比较费时,占用较多的系统资源,DBMS往往都将其作为可选特征,允许DBA根据应用对安全性的要求,自由选择,只对高度机密的数据如:财务数据,军事数据,国家机密等数据进行加密.

