笔记参考:广州大学软件工程课程
数据库是存放数据的仓库。数据库原理是每个计算机专业的学生必须掌握的课程之一,所以学好数据库原理对日后实际工作和项目十分重要。这篇博客通过总结广州大学数据库原理课程和教材对数据库原理进行了总结和分析,帮助日后复习。
目录
- 四、数据库安全性
- 五、数据库完整性
- 六、关系数据理论
- 七、数据库设计
- 八、数据库编程
- 九、关系查询处理和查询优化
四、数据库安全性
数据库的数据保护主要包括数据的安全性和完整性。
4.1 数据库安全性概述
数据库的安全性是指保护数据库以防不合法使用所造成的数据泄露,更改或破坏。
数据库安全性VS完整性:
安全性:去银行取钱需要输入密码
完整性:取的钱需要小于等于卡里面的钱
4.1.1 数据库的不安全因素
- 非授权用户对数据库的恶意存取和破坏
- 数据库中重要或敏感的数据被泄露
- 安全环境的脆弱性
4.1.2 安全标准简介
TCSEC(桔皮书)和CC(目前已经取代了TCSEC,成为评估信息产品安全性的主要标准)
4.2 数据库安全性控制
重要概念:
- 存取控制(AC–Acess Control)
- 自主存取控制方法(DAC)
- 强制存取控制方法(MAC)
- 基于角色访问控制(RBAC—Role-Based Acess Control)
数据库的安全性,主要包括身份鉴定、多层存取控制、审计、视图和数据加密等安全技术。
存取控制流程:
- 首先,数据库管理系统对提出SQL访问请求的数据库用户进行身份验证,防止不可信用户使用
- 然后,在SQL处理层进行自主存取控制和强制存取控制,进一步可以进行推理控制
- 还可以对用户访问行为和系统关键操作进行审计,对异常用户行为进行简单入侵检测
4.2.1 用户身份鉴别
用户身份鉴别是数据库管理系统提供的最外层安全保护措施。每个用户在系统中都有一个用户标识。每个用户标识都由 用户名(user name) 和用户标识号(UID) 两部分组成。其实就是用户名and密码
常用的用户身份鉴别的方法:
- 静态口令鉴别
- 其实就是输入密码。所以,这种方式虽然简单,但容易被攻击,安全性较低。
- 动态口令鉴别
- 通过生物特征进行认证。例如指纹,虹膜和掌纹等。安全性较高
- 智能卡鉴别
- 智能卡是一种不可复制的硬件,内置集成电路的芯片,具有硬件加密功能。(就比如你去银行取钱,需要出示的不仅是银行卡号,还有身份证一样)。
4.2.2 存取控制
如何令所有未授权的人员无法接近数据,主要通过数据库系统的存取控制机制实现。存取控制机制主要包括定义用户权限和合法权限检查两部分,这两部分一起组成了数据库管理系统的存取控制子系统
(1)定义用户权限(用户对某一数据对象的操作权力称为权限。),并将用户权限登记到数据字典中
(2)合法权限检查
自主存取控制:用户对不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限,而且用户还可以将其拥有的存取权限转授给其他用户。存取比较灵活
强制存取控制:每一个数据库对象被以一定的密级,每一个用户也被授予某一个级别的许可证。对于任意一个对象,只有具有合法许可证的用户才可以存取。存取比较严格
4.2.3 自主存取控制方法
用户权限是由两个要素组成:数据库对象和操作类型。(用户可以在数据库的哪些对象上进行哪些操作)在数据库系统中,定义存取权限称为授权。
用户可以“自主”决定将数据的存取权限授予何人、决定是否也将“授权”的权限授予别人。因此这样的存取控制为自主存取控制。
在关系数据库系统中,存取控制对象不仅有数据本身(基本表中的数据,属性列上的数据),还有数据库模式(包括数据库、基本表、视图和索引的创建等)。
4.2.4 授权:授予与收回
SQL中使用GRANT(授予)和REVOKE(收回)语句向用户授予或收回数据的操作权限。
GRANT语法格式:
将指定操作对象的指定操作权限授予给某个指定的用户
GRANT<权限>[,<权限>]...
ON <对象类型><对象名>[,<对象类型><对象名>]...
TO <用户>[,<用户>]...
[WITH GRANT OPTION]
如果添加了WITH GRANT OPTION子句,则获得某种权限的用户还可以把这种权限再授予给其他用户,但是不允许循环授权,即被授予者不能再把权限授予给授权者或祖先。
#把查询Student表的权限授予给用户U1
GRANT SELECT
ON TABLE Student
TO U1;
#把对Student和Course表的全部权限授予给用户U2和U3
GRANT ALL PRIVILEGES
ON TABLE Student,Course
TO U2,U3;
#把对SC表的查询权限给所有用户
GRANT SELECT
ON TABLE SC
TO PUBLIC;
#把查询Student表和修改学生学号的权限给U1
#注意:对属性列授权时必须明确指出相应的属性列名
GRANT SELECT,UPDATE(Sno)
ON TABLE Studnet
TO U1;
REVOKE语法格式:
REVOKE <权限>[,<权限>]...
ON <对象类型><对象名>[,<对象类型><对象名>]...
FROM <用户>[,<用户>]...[CASCADE|RESTRICT];
#把用户U4修改学生学号的权限收回
REVOKE UPDATE(Sno)
ON TABEL Student
FROM U4;
#假设U5还将INSERT权限授予给了U6用户,现在把用户U5对SC表的INSERT权限收回
REVOKE INSERT
ON TABLE SC
FROM U5 CASCADE;
#注意:这里使用的是CASCADE,有的数据库管理系统默认为RESTRICT,将自动执行级联删除。
创建数据库模式的权限
对创建数据库模式一类的数据库对象授权是由数据库管理员在创建用户时实现。
CREAT USER语法格式:
CREAT USER <username>[WITH][DBA|RESOURCE|CONNECT];
说明:
- 只有系统的超级用户才能授权创建一个新的数据库用户
- 新创建的数据库用户有三种权限:CONNECT,RESOURCE,DBA
- 如果创建时没有指定权限,默认为CONNECT权限。拥有CONNECT 权限的用户只能登录数据库。
- 拥有RESOURCE权限的用户能创建基本表和视图,成为所创建对象的属主,但不能创建模式,不能创建新用户。可以使用GRANT将权限授予给其他用户。
- 拥有DBA权限的用户是超级用户—无所不能。
4.2.5 数据库角色
数据库角色是被命名的一组与数据库操作有关的权限,角色是权限的集合。 使用角色来管理数据库权限可以简化授权的过程。
在SQL中首先用CREAT ROLE 语句创建角色,然后用GRANT语句角色授权,用REVOKE语句回收授予角色的权限。
- 角色的创建
CREAT ROLE <角色名>
- 给角色授权
GRANT <权限>[,<权限>]...
ON <对象类型> 对象名
TO <角色>[,<角色>]...
- 将一个角色授予给其他的角色或用户
GRANT <角色1>[,<角色2>]...
TO <角色3>[,<用户1>]...
[WITH ADMIN OPTION]
- 角色的回收
REVOKE <权限>[,<权限>]...
ON <对象类型><对象名>
FROM <角色>[,<角色>]...
CREAT ROLE R1;
GRANT SELECT,UPDATE,INSERT
ON RABLE Student
TO R1;
GRANT R1
TO 王平,张明,赵玲;
REVOKE R1
FROM 王平;
4.2.6 强制存取控制方法
自主存取机制仅仅通过对数据的存取权限来进行安全控制,而数据本身并无安全性标记。
强制存取控制是指系统为保证更高程度的安全性,按照TDI/TCSEC标准中安全策略的要求采取的强制存取检查手段。 他不是用户能直接感知或进行控制的。
在强制存取控制中,数据库管理系统所管理的全部实体被分为主体和客体两大类。主体是系统中的活动实体,包括实际用户以及用户的各进程。客体是系统中的被动实体,是受主体操纵的,包括文件,基本表,索引,视图等。对于实体和客体,系统为他们每个实例指派一个敏感度被标记。敏感度标记分为若干级,绝密、机密、可信、公开等。密级的次序是TS>=S>=C>=P。主体的敏感度标记称为许可证级别,客体的敏感度标记称为密级。强制存取控制就是通过对比主体的敏感度标记和客体的敏感度标记,最终确定主体是否能够存取客体。
要求:
- 仅当主体的许可证大于或等于客体的密级时,该主体才能读取相应的客体(你级别不够肯定不能读)
- 仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体
- 那为什么高级别的主体(用户)不能写低级别的客体(文件)?
- 如果你是高级别的用户,如果可以写低级别的文件,那么很可能会把高级别的内容写入低几倍的文件中,从而造成了高级别的内容泄露(防止不怀好意的高级别用户有意泄露给低级别的用户)
强制存取控制是对数据本身进行密级保护,无论数据如何复制,标记与数据是一个不可分的整体,只有符合密级标记要求的用户才可以操纵数据,从而提供了更高级别的安全性。
4.3 视图机制
#建立计算机系学生的视图,把对该视图的SELECT权限授予王平,把该视图上的所有操作权限授予张明
CREAT VIEW CS_Student
AS
SELECT * FROM Student