大纲:
- 数据库安全性的概念及分类
- SQL语言实现自主安全性
一、前言
1. 数据库安全性是数据库的一种特性(免受非法或非授权用户的使用、泄露、破坏),其由DBMS保证实现
2. 数据库系统的安全级别涉及多个方面,如网络控制、操作系统控制、DBMS控制等,我们只在DBMS上进行控制
二、数据库安全性概述
1. DBMS的安全机制可包括自主安全性机制、强制安全性机制、数据加密存储机制等
①自主安全性机制:通过授权机制(让权限在用户之间传递,使用户自主管理数据库安全性)来实现
②强制安全性机制:对数据和用户进行分类,不同类用户能看到不同类别的数据
2. 数据库自主安全性机制
- DBMS专门提供一个DBA账户,DBA利用该账户的特权可以进行用户账户的创建以及权限授予和撤消、安全级别控制调整等
- 用户在使用数据库前必须从DBA处获得一个账户,并由DBA授予该账户一定的权限,该账户的用户依据其所拥有的权限对数据库进行操作,同时,该账户的用户也可将其所拥有的权利转授给其他的用户,由此实现权限在用户之间的传播和控制
3. DBMS如何实现数据库自主安全性
- DBA定义安全性控制规则(安全性访问规则)
- 当用户请求访问数据时,DBMS将依据安全性控制规则来检查是否符合规则,进而决定是否允许访问
三、安全性访问规则的表达
1. 安全性访问规则的一般形式:(S,O,t,P),即用户S在满足条件P时,以权利t来访问对象O
- S:请求主体,即用户或用户组
- O:访问的对象,即要访问的数据库、表、元组、属性等
- t:访问权利,包括创建、增、删、改、查等
- P:谓词,即拥有权利需要满足的条件
四、自主安全性的两种实现方式
1. 存储矩阵
①只包含S、O、t,不能表达P
2. 视图
①包含S、O、t、P,因为视图可将数据访问对象与谓词结合起来
②可以限制用户访问和操作关系中的哪些数据,如定义不同的视图给不同的用户来使用
五、利用SQL语言实现自主安全性
1. SQL中的用户分级
①超级用户:DBA
②账户级别:程序员
③关系级别:普通用户
2. SQL中的权利分级
①1级(读):select
②2级(更新):insert、update、delete
③3级(创建):create、alter、drop
注:级别高的权利自动包含级别低的权利,一般将级别3的权利称为账户级别的权利,而将级别1和2的权利称为关系级别的权利。
3. 授权命令
grant { all privileges | privilege [, privilege ... ]} on [table] 表名 | 视图名
to { public | user-id [, user-id ... ]} [with grant option];
①privilege可以是select、insert、update、delete
②user-id是某一个由DBA创建的用户账号,而public则是所有有效用户
③with grant option选项表示允许被授权者传播这些权利
④授予的权利必须是授权者已拥有的权利
【示例】现有一关系Employee(P#, Pname, Page, Psex, Psalary, D#, HEAD),并创建了4个视图EmpV1、EmpV2、EmpV3、EmpV4,现假定高级领导为Emp0001,部门领导为Emp0021,员工管理员为Emp2001,收发员为Emp5001(均为UserId, 也即员工的P#):
- createEmpV1asselect*fromEmployee;
- createEmpV2asselectPname,D#fromEmployee;
- createEmpV3asselect*fromEmployeewhereP#=UserId;
- createEmpV4asselect*fromEmployeewhereHead=UserId;
- grant all priviledges on Employee to Emp2001; // 授予Emp2001“所有权利”去访问Employee表
- grant select on EmpV2 to Emp5001 ; // 授予Emp5001“select”权利去访问视图EmpV2
- grant select on EmpV3 to public; // 授予public“select”权利去访问视图EmpV3
- grant select on EmpV4 to Emp0021; // 授予Emp0021“select”权利去访问视图EmpV4
- 上面4条grant语句就是授权(grant)机制与视图结合而实现自主安全性的典例
4. 收回授权命令
revoke { all privileges | privilege [, privilege ... ]} on [table] 表名 | 视图名 from { public | user-id [, user-id ... ]};
- 示例:revoke select on Employee from UserB;