数据库整理(四)数据库安全性与完整性
安全性
数据库的安全性保护数据库以防止不合法使用所造成的数据泄漏、更改或破坏
数据库的不安全因素:
- 非授权用户对数据库的恶意存取和破坏 ---用户身份鉴定 存取控制 视图
- 数据库中重要或敏感的数据被泄露 ---强制存取控制、数据加密存储、加密传输。审计
- 安全环境的脆弱 与操作系统的安全性、网络协议安全保障有关
数据库系统安全模型
安全措施是一级一级层层设置的。用户要求进入计算机系统时,系统首先根据输入的用户标识进行用户身份鉴定;只有合法的用户才准许进入计算机系统;对已进入系统的用户,数据库管理系统还要进行存取控制,只允许用户执行合法操作:操作系统也会有自己的保护措施:数据最后还可以以密码形式存储到数据库中。
与数据库有关的安全技术
用户身份鉴别、多层存取控制、审计、视图、数据加密
用户身份鉴定
每个用户赋予唯一的一个身份标识
静态口令鉴别(密码)、动态口令鉴别(一次一密 短信密码 动态令牌)等
存取控制
确保只授权给有资格的用户访问数据库的权限 --DBMS存取控制机制
定义用户权限
将用户权限登记到数据字典中(权限是用户对某一数据对象的操作权力)
合法权限检查
用户发出存取数据库操作请求后,DBMS根据在数据字典查找,根据安全规则进行权限检查,无权限进行拒绝
两类存取控制方法
自主存取控制方法
- 用户对于不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限,而且用户还可将其拥有的存取权限转授给其他用户。因此自主存取控制非常灵活。
- SQL中的 GRANT 与 REVOKE 语句实现。
- 用户权限:数据库对象+操作类型
- 定义一个用户的存取权限就是要定义这个用户可以在哪些数据库对象上进行哪些类型的操作。在数据库系统中,定义存取权限称为授权
- 关系数据库系统中,存取控制的对象不仅有数据本身(基本表中的数据、属性列上的数据),还有数据库模式(包括数据库、基本表、视图和索引的创建等)
强制存取控制方法
- 每一个数据库对象被标以一定的密级,每一个用户也被授予某一个级别的许可证。对于任意一个对象,只有具有合法许可证的用户才可以存取。强制存取控制因此相对比较严格。(比如A仅授予B某个数据的查看权限,B进行了拷贝进行传播,采用强制存取控制方式对数据本身加上标记,不管如何复制,只有符合密级标记的用户才能操作数据)
授权
用户:合法的数据库用户
对象:数据库中可访问的各类数据对象,如:表、视图等
权限:能够对数据对象进行的操作。权限分为系统权限(如Create、Alter等)和对象权限(如SELECT, INSERT等)。
授权语句: GRANT <权限>[,<权限>] ... [ON <对象类型> <对象名>] TO <用户> [,<用户>] … [ WITH GRANT OPTION ]; 撤销权限: REVOKE <权限> [,…] [ON <对象类型> <对象名>] FROM <用户> [,…] ; GRANT UPDATE(Sno),SELECT ON TABLE Students TO U1,U2;/*把查询Student表和修改学号的权限给U1,U2*/ GRANT ALL PRIVILEGES ON TABLE SC,Student TO PUBLIC; /*将SC表和Student表全部权限给所有用户*/ REVOKE SELECT ON TABLE SC FROM PUBLIC;
GRANT
其语义为:将对指定操作对象的指定操作权限授予指定的用户。
发出该 GRANT语句的可以是数据库管理员,也可以是该数据库对象创建者(即属主 owner),还可以是已经拥有该权限的用户。
接受权限的用户可以是一个或多个具体用户,也可以是 PUBLIC,即全体用户
GRANT语句如果指定了 WITH GRANT OPTION子句,则获得某种权限的用户还可以把这种权限再授予其他的用户。但不允许循环授权。如果没有指定 WITH GRANT OPTION子句,则获得某种权限的用户只能使用该权限,不能传播该权限。
REVOKE
授予用户的权限可以由数据库管理员或其他授权者用 REVOKE语句收回
CASCADE(级联) INSERT权限收回的同时,级联( CASCADE)收回了U6和U7的INSERT权限
创建数据库模式的权限
GRANT和 REVOKE语句向用户授予或收回对数据的操作权限。对创建数据库模类的数据库对象的授权则由数据库管理员在创建用户时实现。
CREATE USER语句一般格式如下:
CREATE USER <username> [WITH] [DBA | RESOURCE | CONNECT];
只有系统的超级用户才有权创建一个新的数据库用户
新创建的数据库用户有三种权限:CONNECT、 RESOURCE和DBA
数据库角色
数据库角色:被命名的一组与数据库操作相关的权限。角色是权限的集合。可以为一组具有相同权限的用户创建一个角色,简化授权的过程。
创建角色: CREATE ROLE <角色名> /*刚创建的角色没有内容*/ 给角色授权: GRANT <权限>[,<权限>]… [ ON <对象类型> 对象名 ] TO <角色>[,<角色>]…; 分配角色: GRANT <角色1>[,<角色2>]… TO <角色3>[,<用户1>]… [WITH ADMIN OPTION]; 角色权限的收回 : REVOKE <权限>[,<权限>]… [ ON <对象类型> <对象名> ] FROM <角色>[,<角色>]…;
视图
作用:把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护。
视图的主要功能是提供数据独立性,无法完全满足要求;
视图间接实现了支持存取谓词的用户权限定义。(某大学中假定王平老师只能检索计算机系学生的信息,系主任张明具有检索和增删改计算机系学生信息的所有权限)
审计
将用户对数据库的所有操作自动记录到审计日志中,DBA利用日志,找出非法的操作等 事后检查的安全机制
用户级审计
- 针对自己创建的数据库表或视图进行审计 ;
- 记录所有用户成功和(或)不成功的访问及各种类型的SQL操作 。
系统级审计
- DBA设置;
- 监测成功或失败的登录要求 ;
- 监测GRANT和REVOKE操作以及其他数据库级权限下的操作。
数据加密
储存加密与传输加密
数据库完整性
数据库中数据的完整性:指数据的正确、有效、相容。
数据库管理系统采取的方法:
- 提供完整性约束条件(规则)的定义机制 实体 参照 用户完整性约束
- 提供完整性检查的方法 数据修改时由DBMS自动完成
- 进行违约处理
实体完整性
检查主码是否唯一,检查主码各个属性是否为空
在主码自动建立索引,避免全表扫描
用户定义的完整性
- 列值非空( NOT NULL)
- 列值唯一( UNIQUE)
- 检查列值是否满足一个条件表达式( CHECK短语)
完整性规则违约处理
用户定义规则的违约处理:拒绝操作
实体完整性的违约处理:拒绝操作
参照完整性的违约处理:
参照关系违约处理:拒绝操作
被参照关系的违约处理:拒绝、级联、置空值(SET NULL)
- 拒绝 一般设置为默认策略
- 级联 删除或修改被参照表一个元组导致与参照表的不一致时,删除或修改参照表中所有导致不一致的元组。
- 空值 当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值
CREATE TABLE SC (Sno CHAR(9), Cno CHAR(4), Grade SMALLINT, PRIMARY KEY(Sno,Cno),/*在表级定义实体完整性,Sno、Cno都不能取空值*/ FOREIGN KEY (Sno) REFERENCES Student(Sno)/*在表级定义参照完整性*/ ON DELETE CASCADE /*当删除 Student表中的元组时,级联删除SC表中相应的元组*/ ON UPDATE CASCADE /*当更新 Student表中的sno时,级联更新SC表中相应的元组*/ FOREIGN KEY(Cno) REFERENCES Course( Cno)/*在表级定义参照完整性*/ ON DELETE NO ACTION/*当删除 Course表中的元组造成与SC表不一致时,拒绝删除*/ ON UPDATE CASCADE /*当更新Coue表中的cmo时,级联更新SC表中相应的元组*/
完整性约束命名子句
可以给每个完整性约束命名,方便增加删除,不命名的话系统会自动命名,删除较为麻烦
CONSTRAINT <约束规则名> [PRIMARY KEY短语 | FOREIGN KEY短语 | CHECK短语] CREATE TABLE SC (Sno CHAR(10),Cno CHAR(4), Grade SMALLINT CONSTRAINT C1 CHECK(Grade BETWEEN 0 AND 100), PRIMARY KEY(Sno, Cno)); /*Alter修改表中的完整性约束*/ ALTER TABLE SC DROP CONSTRAINT C1; ALTER TABLE SC ADD CONSTRAINT C1 CHECK (Grade BETWEEN 0 AND 120);
断言
断言创建以后,任何对断言中所涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。
复杂的断言开销很大
CREATE ASSERTION <断言名> CHECK <约束规则> Create Assertion chk_empid Check (Emp_Sal.emp_id in (Select emp_id From EmployeeInfo Where emp_name is not null);