安全性保护 (security)
- 防止非法使用数据库
- 要求用户通过规定的访问途径
- 要求按照规定的访问规则
Term | |
---|---|
安全数据库(可信数据库) | 适应网络环境下安全要求级别的数据库 |
可信计算基(TCB) | 为实现数据库安全所采用的所有实施策略与机制的集合 |
主体 | 数据的访问者 |
客体 | 数据库中的数据 |
身份标识与鉴别 | 每个主体标识自己的标识符和访问口令 |
自主访问控制(DAC) | 基于存取矩阵(HRU)的安全控制模型 |
存取权限 | |
强制访问控制(MAC) | 通过无法回避的存取限制来防止各种攻击 |
数据完整性 | 防止非法插入,删除,修改等影响数据完整性的操作 |
隐蔽通道 | 非正规的,不受 TCB 控制的访问通道 |
审计 | 跟踪用户对数据的访问操作 |
访问监控器 | 独立的机构,TCB 在网络中的实现 |
- 安全标准
- 1985 TCSEC
- 国际标准(ISO 15408) CC V2.1
- 国标:GB 17859-1999 计算机系统安全保护等级划分
- 第一级:用户自主保护级 (C1)
- 自主访问控制 + 身份鉴别 + 数据完整性
- 第二级:系统审计保护级 (C2)
- + 客体重用 + 审计
- 第三级:安全标记保护级 (B1)
- + 强制访问控制 + 标记
- 第四级:结构化保护级 (B2)
- + 隐蔽信道分析 + 可信路径
- 第五级:访问验证保护级 (B3)
- + 可信恢复
- 第一级:用户自主保护级 (C1)
- SQL'92 C1
- 自主访问控制:(用户,操作对象,操作权限)
- 操作权限:SELECT, INSERT, DELETE, UPDATE, REFERENCE, EXECUTE, USAGE
- 操作对象:表,属性,域,函数
- 授权语句
GRANT <操作权限列表> ON <操作对象> TO <用户名列表> [OPTION]
- 回收语句
REVOKE <操作权限列表> ON <操作对象> FROM <用户名列表> [RESTRICT|CASCADE]
- 自主访问控制:(用户,操作对象,操作权限)
完整性保护 (integrity)
- 数据的正确性和一致性
- 正确性:数据的有效性,有意义
- 一致性:在多用户并发访问数据库的情况下,保证对数据的更新不会出现与实际不一致的情况
- 完整性规则
- 实体完整性规则:在一个基表的主关键字中,属性取值不能为空
- 参照完整性
- 引用:$R$ 中有属性集与另一个关系的主关键字对应,则 $R$ 引用 $S$ 中的元组
- $R$ 中每个元组在外关键字上不能引用不存在的实体
- 用户自定义的完整性
- 完整性约束规则
- 设置
CONSTRAINT <约束名> <完整性约束子句>
- 检查
- 处理
- 设置
- 外键约束
- Cascade: 同步做连带删除/更新
- Restrict: 拒绝对被引用表的删除/更新操作
- Set Null: 自动设为空
- 属性级约束(域约束)
{ NOT NULL
| DEFAULT {default_constant|NULL}
| [ CONSTRAINT constraint_name ]
UNIQUE
| PRIMARY KEY
| CHECK ( search_condition )
| REFERENCES table_name [(column_name)]
[ ON DELETE CASCADE | RESTRICT | SET NULL ]
[ ON UPDATE CASCADE | RESTRICT | SET NULL ] }
- 元组级约束(表约束)
[ CONSTRAINT constraint_name ]
{ UNIQUE ( colname { , colname ... } )
| PRIMARY KEY ( colname { , colname ... } )
| CHECK ( search_condition )
| FOREIGN KEY ( colname { , colname ... } )
REFERENCES table_name [ ( colname { ,colname... } ) ]
[ ON DELETE CASCADE | RESTRICT | SET NULL ]
[ ON UPDATE CASCADE | RESTRICT | SET NULL ] }
- 全局约束(assertion)
CREATE ASSERTION <name> CHECK( <condition> )
DROP ASSERTION <assertion-name-list>
- 触发器
- 触发事件(自定义)
- 结果事件(自定义)
- 触发过程
CREATE TRIGGER trigger_name { BEFORE | AFTER }
{ INSERT | DELETE | UPDATE [ OF colname {, colname ... }]} ON table_name
[ REFERENCING {
OLD [ ROW ] [ AS ] old_row_corr_name
| NEW [ ROW ] [ AS ] new_row_corr_name
| OLD TABLE [ AS ] old_table_corr_name
| NEW TABLE [ AS ] new_table_corr_name
} ]
[ FOR EACH ROW | FOR EACH STATEMENT ]
[ WHEN ( search_condition ) ]
{ statement | BEGIN ATOMIC statement; { statement; ... } END }
DROP TRIGGER trigger_name