以下内容为参考课件和《数据库系统概论》(第5版,王珊等著)的个人整理,若有错误欢迎指出
防止不合法的使用造成数据的泄露、更改和破坏。它包括向授权用户提供可靠的信息服务和拒绝非法访问请求,保证数据的可用性、完整性和一致性。
不安全因素主要来自于非授权用户的恶意存取破坏、敏感信息泄露和安全环境的脆弱性。
(1)分类
外部安全控制:解决内部安全控制的不足
内部安全控制:由计算机系统的软硬件实现
(2)数据库自身的安全机制
用户标识和鉴别
最外层安全保护措施。即提供用户标识(用户名+标识号UID),系统会记录合法用户的标识。鉴别方式包括静态口令、动态口令、生物特征、智能卡等。
存取控制
根据不同用户给不同的存取权限。存取控制机制主要包括定义用户权限(存在数据字典——系统表)和合法权限检查两个部分。方法分为:
自主存取控制(DAC)
用户权限由数据库对象(模式、表、视图等)和操作类型(创建、查询、插入等)两个要素组成。
创建一个用户后,需要被授权,这些权限可分为用户级权限(DBMA授予,与具体关系无关,是与数据库相关的)和关系级权限(DBMA或拥有者授予的与关系或视图相关的权限)。为了方便授权,数据库支持角色(一组权限的集合)和用户组(一组具有相同特性用户的集合)。
下面给出sql语句,首先是用户级权限的授权:
-- sql 用户级权限 授权语句,public是全部用户 -- With Grant Option:允许被授权用户将权限授予他人 -- 可以把权限或角色授给另一个角色,相当于加到权限集合当中 Grant <用户级权限>|<角色> [{,<用户级权限>|<角色>}] To <用户名>|<角色>|public [{,<用户名>|<角色>}] [With Grant Option] -- 收回权限 Revoke <用户级权限>|<角色> [{,<用户级权限>|<角色>}] From <用户名>|<角色>|public [{,<用户名>|<角色>}]
关系级权限授权(类似):
-- sql 关系级权限 授权语句,all表示该表/视图的全部权限 -- 可以控制列级的权限,而这也可以用视图完成 Grant ALL| <权限> [{,<权限>}] On <表名> | <视图名> [{,<表名> | <视图名>}] To {<用户> [{, <用户>}] | public} [With Grant Option] -- 收回权限 Revoke ALL|<表级权限> [{,<表级权限>}] On <表名>|<视图名> [{,<表名> | <视图名>}] From {<用户>[{,<用户>}]|PUBLIC}
自主存取控制的特点就是用户可以自主决定把自己的权限授予他人,甚至存在多重授权(A授权B,B授权C,若B权限被收回,但C仍有权限),因此有不安全隐患。
强制存取控制(MAC)
定义:主体是系统中的活动实体,包括所有用户及其进程。客体是系统中被动实体,受主体操纵,包括文件、基本表等。
MAC中对所有主体和客体指定一个敏感度标记(于主体称为许可证级别,于客体称为密级)。唯有许可证级别大于等于密级时,允许读操作;级别相等时允许写操作。
强制存取控制的特点是密级与数据绑定,不受普通用户操控,因此更安全。
审计
把用户的所有操作记录在审计日志。是一种事后追责措施。
数据加密
防止数据在存储和传输中失密的邮箱手段。
数据分为两类:微数据,即现实描述,不允许访问;统计或综合数据,即对微数据进行综合处理得到的结果,可以提供给用户。
统计数据库的安全性是防止用户通过综合结果推导出微数据(比如相关信息只有1条,就直接知道了)。可以采用以下方法:对统计结果大小加以控制,禁止在相同元组集合上重复执行一系列统计查询,在统计查询结果中加入噪声。
数据库的完整性是指数据的正确性(合法类型、取值)和相容性(表示同一个事实的数据应该相同)
施加在数据库数据之上的语义约束条件称为数据库完整性约束条件。
约束可以是对列、元组或关系
(1)静态约束
即对数据库的确定状态的约束。包括固有约束(数据模型本身的约束,如关系的属性不可以是复合属性)、隐含约束(数据模式的约束,如实体完整性约束,即主码唯一且不为空)、显式约束(除了前两者之外的、需要显式定义的)。
(2)动态约束
数据库状态转变时新旧值之间的约束。比如动态列级约束(年龄的修改只能增不能减)、动态关系约束(转账后两用户的钱总额不变)。
完整性控制机制包括定义功能、检查功能和违约响应。
检查时机分为立即执行约束和延迟执行约束(后者是用户事物执行完毕后执行)。
一条完整性规则可以用一个五元组 ( D , O , A , C , P ) (D,O,A,C,P) (D,O,A,C,P)来描述,其中:
D D D(Data)约束所作用的数据对象。
O O O(Operation)触发完整性检查的数据库操作,即当用户发出什么操作请求时需要检查该完整性规则,是立即检查还是延迟检查。
A A A(Assertion)数据对象必须满足的断言或语义约束。
C C C(Condition)A作用的数据对象值的谓词。
具体例子:当对职业为学生的年龄修改时要求小于26,那么D就是年龄(属性),O为修改,A为年龄小于26,C为职业=学生。
P P P(Procedure)违反完整性规则时触发的过程。一般是拒绝操作。
固有约束在DBMS实现时已规定。
隐含约束可以通过DDL语句在定义数据对象时实现(比如定义表时加unique等)。在定义时,还可以使用Constraint <完整性约束名> <完整性约束条件>
的方式定义,命名方便对于一条约束的删改。此外,也可以创造域(Create Domain
)并加上约束,这样取值为该域的属性的值都会满足约束。
而显式完整性约束有以下几种实现方式:
过程
由程序员编写过程(procedure)。但是这意味着需要为每个约束写一个验证过程(一定要涉及所有约束),而且需要调用,工作量大。
断言
需要DBMS提供断言说明语言,如Create Assertion <断言名> <Check语句>
。当数据库涉及断言中相关关系的操作时,就会执行检查。但如果断言非常复杂,那么开销会很大。
触发器
触发器是用户定义在关系表上的一类由事件驱动的特殊过程。任何操作均有服务器自动激活响应的触发器,便于实施更复杂的检查。
-- 触发事件:insert等语句(多个可用Or连接),还可以是 ... of <出发列, ...> -- Row|Statement:行级触法(每个元组执行时均触发)| 语句级触发(执行该语句触发一次) -- Referencing New | Old:把改变后、改变前的值当成一个变量,有时候需要在触发条件中使用 -- 触发条件是违反规则的条件 -- 触发动作体 触发后执行的语句 Create Trigger <触发器名字> Before|After <触发事件> On <表名> Referencing New | Old Row As <变量> For Each Row|Statement When <触发条件> <触发动作体>
不同数据库支持的触发器功能、语法不一致,使用时最好参照所用数据库的手册。
至此,数据库的基础知识已基本学习完毕,下一章将进入数据库的设计与开发。