(六)数据库安全性

一、数据库安全性控制

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的创建)等。

关系数据库中存取控制权限

对象类型 对象 操作类型
数据库 模式 CREATE SCHEMA
模式 基本表 CREATE TABLE,ALTER TABLE
模式 视图 CREATE VIEW
模式 索引 CREATE INDEX
数据

基本表和

视图

SELECT ,INSERT,UPDATE,DELECT,REFERENCES,ALL PRIVILEGES

       数据

 

属性列 SELECT,INSERT,UPDATE,REFERENCES,ALL PRICILEGES

 

 

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 <用户>[,<用户>]……[CASCADE|RESTRICT];

 

把用户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][DBA|RESOURCE|CONNECT];

.只有系统的超级用户才有权创建一个新的数据库用户;

.新创建的数据库用户有三种权限:CONNECT、RESOURCE和DBA;

.CREATE USER 命令中如果没有指定创建的新用户的权限,默认该用户拥有CONNECT 权限。拥有CONNECT 权限的用户不能创建新用户,不能创建模式,也不能创建基本表,只能登录数据库。然后由DBA或其他用户授予他应有的权限,根据获得的授权情况它可以对数据库对象进行权限范围内的操作。

.拥有RESOURCE权限的用户能创建基本表和视图,成为所创建的属主。但不能创建模式,不能创建新的用户。数据库对象的属主可以使用GRANT语句吧该对象上的存取权限授予其它用户。

.拥有DBA权限的用户是系统中的超级用户,可以创建新的用户、创建模式、创建基本表和视图等,DBA拥有对所有数据库对象的存取权限,还可以把这些权限授予一般用户。

 

权限与可执行的操作对照表

拥有的权限 CREATE USER CREATE SCHEMA CREATE TABLE 登录数据库 执行数据查询和操作
DBA 可以 可以 可以 可以
RESOURCE 不可以 不可以 可以 可以
CONNECT 不可以 不可以 不可以 可以,但必须拥有相应权限

5、数据库角色

数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。

1.角色的创建

创建角色的SQL语句格式为:

CREATE ROLE<角色名>;

刚刚创建的角色是空的,没有任何内容。可以用GRANT为角色授权。

2.给角色授权

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

 

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

GRANT <角色1>[,<角色3>]……
TO<角色3>[,<用户1>]……
[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次查询。

你可能感兴趣的:(SQL)