数据库的一大特点是数据可以共享,数据共享必然带来数据库的安全性问题,数据库系统中的数据共享不能是无条件的共享,比如:军事秘密、国家机密、新产品实验数据、市场需求分析、市场营销策略、销售计划、客户档案、医疗档案、银行储蓄数据等。
数据库的安全是指保护数据库以防止不合法的使用造成的数据泄露、更改或破坏。换句话说,就是防止数据被非法访问。
随着计算机安全性问题的突出,人们在计算机以及信息安全技术方面出台了一系列的安全标准,最有影响的当推TCSEC和CC这两个标准。
TCSEC(TrustedComputerSystemEvaluationCriteria)是指1985年美国国防部(DoD)正式颁布的《DoD可信计算机系统评估准则TCSEC》;1991年4月美国NCSC(国际计算机安全中心)颁布了《可信计算机系统评估标准关于可信数据库系统的解释TDI》,将TCSEC扩展到数据库管理系统。TDI中定义了数据库管理系统的设计与实现中需满足和用以进行安全性级别评估的标准。
TCSEC/TDI从以下四个方面来描述安全性级别划分的指标:安全策略、责任、保证和文档。每个方面又细分为若干项。即四组七个等级:
A1——验证设计(有形式化方法可证明安全)
B3——安全域(有跟踪审计能力)
B2——结构化保护(有安全策略模型)
B1——标记安全保护(加标记,ORACLE)
C2——受控存取保护(用户口令权限+审计,ORACLE)
C1——自主安全保护(用户口令权限SQL-SERVER)
D——最小保护(基本无保护ACCESS,FOXPRO)
2数据库安全性控制
非法使用数据库的情况有:
计算机系统中,安全措施是一级一级层层设置:
在上图所示安全模型中,用户要求进入计算机系统时,系统首先根据输入的用户标识进行用户身份鉴定,只有合法的用户才准许进入计算机系统。对已进入系统的用户,DBMS还要进行存取控制,只允许用户执行合法操作。操作系统也会有自己的保护措施。数据最后还可以以密码形式存储到数据库中。
在这里我们只讨论与数据库有关的用户标识和鉴定、存取控制、视图和密码存储等安全技术。
2.1用户标识与鉴别
用户标识与鉴别是系统提供的最外层安全保护措施,其方法是由系统提供一定的方式让用户标识自己的名字和身份。
用户标识:用一个用户名或者用户标识号来标明用户身份
口令:为了进一步核实用户,系统常常要求用户输入口令,核对口令以鉴别用户身份
2.2存取控制
数据库安全性所关心的主要是DBMS的存取控制机制。
存储机制主要包含两个部分:
常用存取控制方法:
2.3自主存取控制方法
大型数据库管理系统几乎都支持自主存取控制,目前的SQL标准也对自主存取控制提供支持,这主要通过SQL的GRANT语句和REVOKE语句实现。
用户权限由两个要素组成:
1对象权限
例如:对SC表的SELECT,INSERT,DELETE权
2操作类型权限(语句权.系统权)
例如:执行CREATETABLE权,CREATEVIEW权
某个用户对某类数据库对象具有何种操作权力是个政策问题而不是技术问题。GRANT语句向用户授予权限,REVOKE语句收回授予的权限。
1)GRANT
GRANT语句的一般格式:
GRANT<权限>[,<权限>]...
[ON<对象类型><对象名>]
TO<用户>[,<用户>]...
[WITHGRANTOPTION];
其语义为:将对指定操作对象的指定操作权限授予指定的用户。发出GRANT语句的可以是DBA,也可以是数据库对象创建者(即属主Owner),也可以是已经拥有该权限的用户。接受受权限的用户可以是一个或多个具体用户,也可以是PUBLIC(全体用户)。WITHGRANTOPTION表示获得某种权限的用户还可以把这种权限再授予其他的用户,如果没有指定则表示权限不能再传播。
示例1:把查询Student表权限授给用户U1
GRANTSELECT
ONTABLEStudent
TOU1;
示例2:把对Student表和Course表的全部权限授予用户U2和U3
GRANTALLPRIVILIGES
ONTABLEStudent,Course
TOU2,U3;
示例3:把对表SC的查询权限授予所有用户
ONSC
TOPUBLIC;
示例4:把查询Student表和修改学生学号的权限授给用户U4
GRANTUPDATE(Sno),SELECT
ONStudent
TOU4;
示例5:把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户
GRANTINSERT
TOU5
WITHGRANTOPTION;
执行例5后,U5不仅拥有了对表SC的INSERT权限,还可以传播此权限。比如U5将该权限授予U6:
示例6:GRANTINSERTONSCTOU6
同样,U6还可以将此权限授予U7:
示例7:GRANTINSERTONSCTOU7;
但U7不能再传播此权限。
2)REVOKE
REVOKE<权限>[,<权限>]...
FROM<用户>[,<用户>]...;
示例1:把用户U4修改学生学号的权限收回
REVOKEUPDATE(Sno)
FROMU4;
示例2:收回所有用户对表SC的查询权限
REVOKESELECT
FROMPUBLIC;
示例3:把用户U5对SC表的INSERT权限收回
REVOKEINSERT
ONTABLESC
FROMU5CASCADE;
注:将用户U5的INSERT权限收回的时候必须级联(CASCADE)收回,不然系统将拒绝执行该命令;有的DBMS缺省值为CASCADE,会自动执行级联操作而不必明显地写出CASCADE;如果U6和U7还从其他用户处获得对SC表的INSERT权限,则他们仍具有此权限,系统只收回直接或间接从U5处获得的权限。
不同的权限授予不同的用户
GRANT:授予其他用户
2.5数据库角色
1)角色的创建
CREATEROLE<角色名>
GRANT<权限>[,<权限>]…
ON<对象类型>对象名
TO<角色>[,<角色>]…
3)将一个角色授予其他的角色或用户
GRANT<角色1>[,<角色2>]…
TO<角色3>[,<用户1>]…
[WITHADMINOPTION]
4)角色权限的收回
REVOKE<权限>[,<权限>]…
ON<对象类型><对象名>
FROM<角色>[,<角色>]…
通过角色来实现将一组权限授予一个用户。步骤如下:
1.首先创建一个角色R1
CREATEROLER1;
2.然后使用GRANT语句,使角色R1拥有Student表的SELECT、UPDATE、INSERT权限
GRANTSELECT,UPDATE,INSERT
TOR1;
3.将这个角色授予王平,张明,赵玲。使他们具有角色R1所包含的全部权限
GRANTR1
TO王平,张明,赵玲;
4.可以一次性通过R1来回收王平的这3个权限
REVOKER1
FROM王平;
角色的权限修改如下:
GRANTDELETE
TOR1
FROMR1;
2.6强制存取控制方法(MAC)
自主存取的缺点:可能存在数据的“无意泄露”,某人有权访问某表,制作了复本,当权限被收回后,对复本仍可访问
原因:这种机制仅仅通过对数据的存取权限来进行安全控制,而数据本身并无安全性标记
解决:对系统控制下的所有主客体实施强制存取控制策略
主体是系统中的活动实体:
客体是系统中的被动实体,是受主体操纵的:
敏感度标记(Label):
主体的敏感度标记称为许可证级别(ClearanceLevel)
客体的敏感度标记称为密级(ClassificationLevel)
强制存取控制规则:
(1)仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体
(2)仅当主体的许可证级别等于客体的密级时,该主体才能写相应的客体
MAC保证更高程度的安全性。适用于对数据有严格而固定密级分类的部门:军事部门、政府部门。
DAC与MAC共同构成DBMS的安全机制。
3视图机制
为不同用户定义不同的视图,把数据对象限制在一定的范围内。也就是说通过视图,把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护。
视图机制间接实现了支持存取谓词(带查询条件)的用户权限定义。
示例:建立计算机系学生的视图,把对该视图的SELECT权限授于王平,把该视图上的所有操作权限授于张明
先建立计算机系学生的视图CS_Student
CREATEVIEWCS_Student
AS
SELECT*
FROMStudent
WHERESdept='CS';
在视图上进一步定义存取权限:
ONCS_Student
TO王平;
GRANTALL
TO张明;
4审计
AUDIT语句用来设置审计功能,NOAUDIT语句取消审计功能:
示例:对修改SC表结构或修改SC表数据的操作进行审计
AUDITALTER,UPDATE
ONSC;
示例:取消对SC表的一切审计
NOAUDITALTER,UPDATE
5数据加密
数据加密是防止数据库中数据在存储和传输中失密的有效手段。
加密方法有:
替换方法:将明文中的每一个字符转换为密文中的一个字符
置换方法:将明文中的字符按照不同的顺序重新排列
混合方法:将替换方法和置换方法结合起来使用
6统计数据库安全性
一般地,统计数据库允许用户查询聚集类型的信息(如合计、平均值等),但是不允许查询单个记录信息。例如,查询“程序员的平均工资是多少”是合法的,但是查询“程序员张勇的工资是多少”就不允许。
统计数据库中特殊的安全性问题:可能存在隐蔽的信息通道,使得能从合法的查询中推导出不合法的信息。例如下面两个查询都是合法的:
(如果只有1名女高级程序员,就泄密了)
解决方法:1次查询至少涉及N个。但是即使是这样,还是存在另外的泄密途径,看下面的例子:
(用户A本人查询,可推算出B的工资)
解决方法:两次交叉不多于M个。
数据库安全机制的设计目标:试图破坏安全的人所花费的代价远远大于得到的利益。