一、数据库安全性控制
1.使用者标记与鉴别使用者标识与鉴别是系统提供的最外层安全保护措施。其方法是由系统提供一定的方式让使用者标识自己的名字或身份。每次使用者要求进入系统时,由系统进行核对,通过鉴定后才提供机器使用权。
使用者标识(User Identification)
用一个使用者名称(User Name)或使用者标识号(ID)来标明使用者身份。系统记录着所有合法所有合法使用者的标识,系统鉴别此使用者是否是合法使用者,若是,则可以进入下一步的核实;若不是,则不能使用系统。
口令(Password)
为了进一步核实使用者,系统常常要求输入口令为了保密起见,使用者在终端上输入的口令不显示在屏幕上。系统核对口令以鉴别使用者身份。
2.存取控制
数据库安全性所关心的主要是DBMS的存取控制机制。数据库安全最重要的一点就是确保只授权给有资格的使用者访问数据库的许可权,同时令所有未授权的人员无法接近数据库,这主要通过数据库系统的存取控制机制实现。
存取控制机制主要包括两部分:
1.定义使用者许可权,并将使用者许可权等级到资料字典中
使用者对某一资料物件的操作权力称为许可权。DBMS系统提供适当的语言来定义使用者许可权,这些定义经过编译后存放在资料字典中,被称为安全规则或授权规则。
2.合法许可权检查
每当使用者发出存取数据库的操作请求后(请求一般应包括操作型别、操作物件和操作使用者等资讯),DBMS查询资料字典,根据安全规则进行合法许可权检查,若使用者的操作请求超出了定义的许可权,系统将拒绝执行此操作。
使用者许可权定义和合法许可权检查机制一起组成了DBMS的安全子系统。
当前大型的DBMS一般都支援C2级中的自主存取控制,有些DBM同时支援B1级中的强制存取控制。
这两类方法的简单定义是:
(1)在自助存取控制方法中,使用者对于不同的数据库物件有不同的存取许可权,不同的使用者对同一物件也有不同的许可权,而且使用者还可将其拥有的存取许可权转授给其他使用者。因此自主存取控制非常灵活。
(2)在强制存取控制方式中,没一个数据库物件被标以一定密级,每一个使用者也被授予某一个级别的许可证。对于任意一个物件,只有具有合法许可证的使用者才可以存取。强制存取控制因此相对比较严格。
3、自主存取控制(DAC)方法
使用者许可权是由两个要素组成的:数据库物件和操作型别。定义一个使用者的存取许可权就是要定义这个使用者可以在哪些数据库物件上进行哪些操作。数据库系统中,定义存取许可权称为授权。
在非关系系统中,使用者只能对资料进行操作,存取控制的数据库物件也仅限于资料本身。
在关系数据库系统中存取控制的物件不仅有资料本身(基本表中的资料、属性列上的资料),还有数据库模式(包括数据库SCHEMA、基本表TABLE、检视VIEW和索引INDEX的建立)等。
关系数据库中存取控制权限
关系数据库中存取控制权限
4、授权与回收
GRANT语句向用户授予许可权,REVOKE语句收回使用者许可权
1.GRANT
GRANT语句的一般格式为
GRANT [,]……
ON [,]……
TO [,]……
[WITH GRANT OPTION];
将对指定操作物件的指定操作许可权授予指定使用者。发出该GRANT语句的可以是DBA,也可以是该数据库物件建立者,也可以是已经拥有该许可权的使用者。接受许可权的的使用者可以是一个或多个具体使用者,也可以全体使用者即PUBLIC。
如果指定了WITH GRANT OPTION子句,则获得某种许可权的使用者还可以把这种许可权再授予使用者。如果没有指定WITH GRANT OPTION子句,则获得某种许可权的使用者只能使用该许可权,不能传播该许可权。
SQL标准允许具有WITH GRANT OPTION的使用者把相应许可权或其子集传授与其他使用者,但不允许循环授权,即被授权者不能把许可权再授回给授权者。
把查询Student表的许可权授给使用者U1。
GRANT SELECT
ON TABLE Student
TO U1;
把对Student表和Course表全部操作许可权授予使用者U2和U3.
GRANT ALL PRIVIEGES
ON TABLE Student,Course
TO U2,U3;
把对SC表的查询权授予所有使用者。
GRANT SELECT
ON TABLE SC
TO PUBLIC;
把查询Student表和修改学生学号的许可权授给使用者U4。
GRANT UPDATE(Sno),SELECT
ON TABLE Student
TO U4;
这里实际上要授予U4使用者的是对基本表Student的SELECT 许可权和对属性列Sno的UPDATE许可权。对属性列的授权时必须明确指出相应属性列名。
把对表SC的INSERT许可权授予U5使用者,并允许此许可权再授予使用者。
GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION;
执行此SQL语句后,U5不仅拥有了对表SC的INSERT许可权,还可以传播此许可权,既由U5使用者发上述GRANT命令给其他使用者,例如U5可以把此许可权授予U6:
GRANT INSERT
ON TABLE SC
TO U6
WHTH GRANT OPTION;
同样,U6还可以将此许可权授予使用者。
2.REVOKE
REVOKE语句一般格式为:
REVOKE [,]
ON [,]……
FROM [,]……[CASCADERESTRICT];
把使用者U4修改学生学号的许可权收回。
REVOKE UPDATE(Sno)
ON TABLE Student
FROM U4;
收回所有使用者对表SC的查询许可权。
REVOKE SELECT
ON TABLE SC
FROM PUBLIC;
把使用者U5对SC表的INSERT许可权收回。
REVOKE INSERT
ON TABLE SC
FROM PUBLIC;
将使用者U5的INSERT许可权收回的时候必须级联(CASCADE)收回,不然系统将拒绝(RESTRICT)执行该命令。因为U5将对SC表的INSERT许可权授予U6。而U6又将其授予了U7。
注:这里预设值为RESTRICT,有的DBMS预设CASCADE,会自动执行级联操作而不必明显地写出CASCADE。如果U6或U7还从其他使用者获得对SC表的INSERT许可权,则他们仍具有此许可权,系统只收会直接或间接从U5处获得的许可权。
3.建立数据库模式许可权
GRANT 和REVOKE语句向用户授予或收回对资料的操作许可权。对数据库模式的授权则由DBA在建立使用者是实现。
CREATE USER语句一般格式如下:
CREATE USER
[WITH][DBARESOURCECONNECT];
.只有系统的超级使用者才有权建立一个新的数据库使用者;
.新建立的数据库使用者有三种许可权:CONNECT、RESOURCE和DBA;
.CREATE USER 命令中如果没有指定建立的新使用者的许可权,预设该使用者拥有CONNECT 许可权。拥有CONNECT 许可权的使用者不能建立新使用者,不能建立模式,也不能建立基本表,只能登入数据库。然后由DBA或其他使用者授予他应有的许可权,根据获得的授权情况它可以对数据库物件进行许可权范围内的操作。
.拥有RESOURCE许可权的使用者能建立基本表和检视,成为所建立的属主。但不能建立模式,不能建立新的使用者。数据库物件的属主可以使用GRANT语句吧该物件上的存取许可权授予使用者。
.拥有DBA许可权的使用者是系统中的超级使用者,可以建立新的使用者、建立模式、建立基本表和检视等,DBA拥有对所有数据库物件的存取许可权,还可以把这些许可权授予一般使用者。
许可权与可执行的操作对照表
5、数据库角色
数据库角色是被命名的一组与数据库操作相关的许可权,角色是许可权的集合。
1.角色的建立
建立角色的SQL语句格式为:
CREATE ROLE;
刚刚建立的角色是空的,没有任何内容。可以用GRANT为角色授权。
2.给角色授权
GRANT [,]……
ON
TO [,]……;
3.将一个角色授予其他使用者
GRANT [,]……
TO[,]……
[WITHADMIN OPTION];
该语句把角色授予某使用者,或授予另一个角色。这样,一个角色所拥有的许可权就是授予它的全部角色所包含的许可权总和。
授予者或者是角色的建立者,或者拥有在这个角色上的ADMIN OPTION.
如果指定了WITH ADMIN OPTION子句,则获得某种许可权的角色或使用者还可以把这种许可权再授予其他角色。
4.角色许可权的收回
REVOKE [,]……
ON
FROM[,]……;
使用者可以回收角色的许可权,从而改变角色拥有的许可权。
通过角色来实现将一组许可权授予一个使用者。步骤如下:
1.建立一个角色R1
CREATE ROLE R1;
2.使用GRANR 语句,是角色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 王平;
角色许可权修改。
GRANT DELECT
ON TABLE Student
TO R1;
是角色R1在原来的基础上增加了Student表的DELETE许可权。
收回R1对Student表的SELECT许可权
REVOKE SELECT
ON TABLE Student
FROM R1;
6、控制(MAC)方法
自主存取控制能够通过授权机制有效地对敏感资料的存取。但是由于使用者对资料的存取许可权是“自主”的,使用者可以自由地决定将资料的存取许可权授予何人、决定是否也将“授权”的许可权授予别人。在这种授权机制下,仍可能存在资料的”无意泄露“。比如,甲将自己许可权范围内的某些资料存取许可权授权给乙,甲的意图是只允许乙本人操作这些资料。但甲的这种安全性要求并不能得到保证,因为乙一旦获得了对资料的许可权,就可以将资料备份,获得自身许可权内副本,并在不征的甲同意的前提下传播副本。造成这一问题的根本原因就在于,这种机制仅仅通过对资料的存取许可权来进行安全控制,而资料本身并无安全性标记。要解决这一问题,就需要对系统控制下的所有主客体实施强制存取控制策略。
MAC是指系统为保证更高程度的安全性,按照TdI/TCSEC标准中安全策略的要求,所采取的强制存取检查手段。他不是使用者直接感知或进行控制的。MAC适用于那些对资料有严格而固定密级分类的部门。
在MAC中,DBMS所管理的全部实体被分为主体和客体两大类。
主体是系统中活动实体,即包括DBMS所管理的实际使用者,也包括代表使用者的各程序。客体是系统中的被动实体,是受主体操纵的,包括档案、基本表、索引、检视等。对于主体和客体,DBMS为它们每个例项(值)指派一个敏感度标记(Label)。
敏感度标记被分成若干级别,例如绝密(Top Secret)、机密(Secret)、可信(Confidential)、公开(Public)等。主体的敏感度标记称为许可证级别,客体的敏感度标记称密级(Classification Level).MAC机制就是通过对比主体的Label和客体的Label,最终确定主体是否能够存取客体。
当某一使用者(或某一主体)以标记Label注册入系统时,系统要求他对任何课题的存取必须遵循如下规则:
(1)仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体;
(2)仅当主体的许可证级别等于客体的密级时,该主体才能写相应的客体。
较高安全性级别提供的安全保护要包括较低级别的所有保护,因此在实现MAC时要首先实现DAC,即DAC与MAC共同构成DBMS的安全机制,如图,系统首先进行DAC检查,对通过DAC检查的允许存取的数据库物件再有系统自动进行MAC检查,只有通过MAC检查的数据库物件访客存取。
二、检视机制
还可以为不同的使用者定义不同检视,把资料物件限制在一定的范围内,也就是说,通过试图机制把要保密的资料对无权存取的使用者隐藏起来,从而自动地对资料提供一定程度的安全保护。检视机制间接地实现支援存取谓词的使用者许可权定义。例如,在某大学中假定王平老师只能检索计算机系学生的资讯,系主任张明具有检索和增删改计算机系学生资讯的所有许可权。这就要求系统能支援”存取谓词“的使用者许可权定义。在不直接支援存取谓词的系统中,可以先建立计算机系学生的检视CS_Student,然后在检视上进一步定义存取许可权。
建立计算机系学生的检视,把对该检视的SELECT许可权授予王平,把该检视上的所有操作许可权授予张明。
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERE Sdept=\CS\;
GRANT SELECT
ON CS_Student
TO 王平;
GRANT ALL PRIVILEGES
ON CS_Student
TO 张明;
三、审计(Audit)
因为任何系统的安全保护措施都不是完美无缺的,蓄意盗窃,破坏资料的人总是想方设法打破控制。审计功能把使用者对数据库的所有操作自动记录下来放入审计日志(Audit Log)中。DBA可以利用审计跟踪的资讯,重现导致数据库现有状况的一系列事件,找出非法存取资料的人、时间和内容等。审计一般可以分使用者级审计和系统级审计。使用者级审计是任何使用者可设定的审计,主要是使用者针对自己建立的数据库表或检视进行审计,记录所有使用者对这些表或检视的一切成功或不成功的访问要求以及各种型别的SQL操作。
系统级审计只能由DBA设定,用以监测成功或失败的登入要求、监测GRANT和REVOKE操作以及其他数据库级许可权下的操作。
AUDIT语句用来设定审计功能,NOAUDIT语句取消审计功能。
对修改SC表结构或修改SC表资料的操作进行审计。
AUDIT ALTER,UPDATE
ON SC;
取消对SC表的一切审计。
NOAUDIT ALTER,UPDATE
ON SC;
审计设定以及审计内容一般都存放在资料字典中。必须把审计开关开启(即把系统引数audit_trail设为ture),才可以在系统表SYS_AUDITTRAIL中检视审计资讯。
四、资料加密
资料加密是防止数据库中资料在储存和传输中的有效手段。加密的基本思想是根据一定的算法将原始资料(明文)变换为不可直接识别的格式(密文),从而使得不知道解密算法的人无法获知资料的内容。加密方法主要有两种,一种是替换方法,该方法使用金钥将明文中的每一个字元转换为密文中的一个字元。另一种是置换方法,该方法仅将明文的字元按不同的顺序重新排列。单独使用这两种方法的任意一种都不够安全的。但是将这两种方法结合起来就能提供相当高的安全程度。
五、统计数据库安全性
统计数据库允许使用者查询聚集型别的资讯(例如合计、平均值等),但是不允许查询单个记录资讯。例如,查询”程序员的平均工资是多少?”是合法的,但是查询“程序员张勇的工资是多少?”就不充许。
在统计数据库中存在着特殊的安全性问题,即可能存在着隐蔽的资讯通道,使得可以从合法的查询中推汇出不合法的资讯。例如下面两个查询都是合法的:
1.本公司共有多少女高阶程序员?
2.本公司高阶程序员的工资总额是多少?
如果第1个查询的结果是“1”,那么第2个查询的结果显然就是这个程序员的工资数。这样统计数据库的安全性机制就失效了。为了解决这个问题,可以规定任何查询至少要涉及N个以上的记录(N足够大)。但是即使这样,还是存在另外的泄露途径,看下面例子:
某个使用者A想知道另一使用者B的工资数额,他可以通过下列两个合法查询获取:
1.使用者A和其他N个程序员的工资总额是多少?
2.使用者B和其他N个程序员的工资总额是多少?
假设第一个查询的结果是X,第二个查询的结果Y,由于使用者A知道自己的工资是Z,那么他可以计算出使用者B的工资=Y-(X-Y).
这个例子的关键之外在两个查询之间有很多重读的资料项(即其他N个程序员的工资)。因此可以在规定任意两个查询的相交资料项不能超过M个。这样就是的获取他人的资料更加困难。可以证明,在上述两条规定下,如果想获知使用者B的工资额,使用者A至少需要进行1+(N-2)/M次查询。