又开始新的一章,主要讲的是数据安全性。
数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。
数据共享->安全性
非法使用数据库的情况
1、编写合法程序绕过DBMS及其授权机制
2、直接(或编写应用程序)执行非授权操作
3、通过多次合法查询数据库从中推导出一些保密数据
简单入侵检测 审计
SQL层:推理控制、强制访问控制、自主访问控制
用户身份鉴别
静态口令鉴别—由用户自己设定,静态不变的 字典攻击
动态口令鉴别—(验证码)动态变化,一次一密
生物特征鉴别—生物特征进行认证(人脸、指纹等)
智能卡鉴别—智能卡是一种不可复制的硬件,内置集成电路的芯片,具有硬件加密功能
存取控制
定义用户权限—DBMS提供适当的语言来定义用户权限,放在数据字典中,称做安全规则或授权规则
合法权限检查—用户发出数据库操作请求,DBMS查找数据字典,进行合法权限检查
自主存取控制(DAC)
1、不同数据对象(数据库、表、表中一行)有不同的存取权限
2、不同的用户对同一对象也有不同的权限
3、用户还可以将其拥有的存取权限转授给其他用户
强制存储控制(MAC)
1、每个数据对象被标以一定的密级
2、每个用户也被授予某一个级别的许可证
3、对于任意一个对象,具有合法许可证的用户才可以存取
自主存取控制方法
通过SQL的GRANT(授予)语句和REVOKE(收回)语句实现
GRANT
GRANT <权限>[,<权限>]...
ON <对象类型><对象名>[,<对象类型><对象名>]...
TO<用户>[,<用户>]...
[WITH GRANT OPTION]; 指定:可以再授予;没有指定:不能传播
注意:
1、主码在此之外使用了就不能改,没有使用就可以改。
2、不允许循环授权
在完成所有操作之前要先创建用户。
如果再按照之前顺序新建一个用户的话,会报错:
Microsoft SQL Server Management Studio
用户 “U2” 的 创建 失败。
该登录已用另一个用户名开立帐户。
解决办法:因为该登录名已经被另一个用户开账户了,所以要修改登陆名,则换一个匹配对象。
例4.1
把查询Student表的权限授给用户U1。
GRANT SELECT
ON TABLE Student
TO U1;
错误:关键字 ‘TO’ 附近有语法错误。应该去掉TABLE关键词。
正解:
GRANT SELECT
ON Student
TO U1;
在此之后我们可以检查,点开用户U1,可以看见
例4.2
把对Student表和Course表的全部操作权限授予用户U2和U3。
GRANT ALL PRIVILEGES
ON Student,Course
TO U2,U3;
报错:“,”附近有语法错误。
因此:
GRANT ALL PRIVILEGES
ON Student
TO U2,U3;
GRANT ALL PRIVILEGES
ON Course
TO U2,U3;
ALL 权限已不再推荐使用,并且只保留用于兼容性目的。它并不表示对实体定义了 ALL 权限。
点开U2和U3用户他依旧保留了Student表和Course表的权限。
例4.3
把对表SC的查询权限授予所有用户。
GRANT SELECT
ON SC
TO PUBLIC;
例4.4
把查询Student表和修改学生学号的权限授给用户U4.
GRANT SELECT,UPDATE(Sno)
ON Student
TO U4;
例4.5
把对表SC的INSERT权限授予U5用户,并允许将此权限再授予其他用户。
GRANT INSERT
ON SC
TO U5
WITH GRANT OPTION;
执行此SQL语句后,U5不仅拥有了对表SC的INSERT权限,还可以传播此权限,即有U5用户发上述GRANT命令给其他用户。
例4.6
GRANT INSERT
ON SC
TO U6
WITH GRANT OPTION;
例4.7
GRANT INSERT
ON SC
TO U7;
因为U6未给U7传播的权限,因此U7不能再传播此权限。
2、REVOKE
授予用户的权限可以由数据库管理员或其他授权者用REVOKE语句收回,REVOKE语句一般格式为
REVOKE <权限>[,<权限>]...
ON <对象类型><对象名>[,<对象类型><对象名>]...
FROM <用户>[,<用户>]... [CASCADE|RESTRICT]
例4.8
把用户U4修改学生学号的权限收回。
REVOKE UPDATE(Sno)
ON Student
FROM U4;
REVOKE SELECT
ON SC
FROM PUBLIC;
例4.10
把用户U5对SC表的INSERT权限收回。
REVOKE INSERT
ON SC
FROM U5 CASCADE;
创建数据库模式的权限
CREATE USER <username> [WITH][DBA|RESOURCE|CONNECT];
注意:
1、只有系统的超级用户才有权限创建一个新的数据库用户。
2、新创建的数据库用户有三种权限:
CONNECT权限:不能创建新用户,不能创建模式,不能建立基本表,只能登录数据库。
RESOURCE权限:能创建基本表和视图,称为所创建对象的属主,但不能创建模式,不能创建新的用户。
DBA权限:是系统中的超级用户,可以创建新的用户、创建模式、创建基本表和视图等,拥有所有数据库对象的存取权限,就还可以把这些权限授予一般用户。
具体不同的关系数据库管理系统的语句和内容也有所不同。
数据库角色
角色(ROLE):被命名的一组与数据库操作相关的权限。
角色是权限的集合。可以为一组具有相同权限的用户创建一个角色。
简化授权的过程
1、角色创建
CREATE ROLE <角色名>
2、角色授权
GRANT <权限>[,<权限>]...
ON <对象类型>对象名
TO <角色>[,<角色>]...
3、角色授予其他角色或用户
GREANT <角色1>[,<角色2>]...
TO <角色3>[,<用户1>...]
[WITH ADMIN OPTION]
WITH ADMIN OPTION-----获得某种权限的角色或用户还可以把这种权限再授予其他的角色。
4、角色收回
REVOKE <权限>[,<权限>]...
ON <对象类型><对象名>
FROM <角色>[,<角色>]...
例4.11
通过角色来实现将一组权限授予一个角色。
STEP1:首先创建一个角色R1。
CREATE ROLE R1;
STEP2:然后用GRANT语句,使角色R1拥有Student表的SELECT、UPDATE、INSERT权限。
GRANT SELECT,UPDATE,INSERT
ON Student
TO R1;
STEP3:将这个角色授予王平、张明、赵玲,使他们具有角色R1所包含的全部权限。
GRANT R1
TO 王平,张明,赵玲;
报错:“R1”附近有语法错误。
解决方法:再SQL Server中不支持该语句,所以要手动的为R1角色添加或删除角色成员,或者使用SQL语句。
手动添加:
SQL语句:
EXEC sp_addrolemember 'R1','WANG';/*这个函数后面还只能有一个人,不然就会出现错误说指定了过多参数*/
/*或者*/
ALTER ROLE R1
ADD MEMBER WANG;
因为现有的用户有WANG,所以没有新建用户,直接用现有用户。
STEP4:一次性地通过R1来收回王平地三个权限。
REVOKE R1
FROM WANG;
错误:“R1”附近有语法错误。同样错误,所以改写为:
EXEC sp_droprolemember 'R1','WANG';
/*或者*/
ALTER ROLE R1
DROP MEMBER WANG;
也可以手动删除:
例4.12
角色的权限修改。----增加了DELETE权限。
GRANT DELETE
ON Student
TO R1;
REVOKE SELECT
ON Student
FROM R1;
强制存取控制方法
自主存取控制缺点:无意泄露—数据本身并无安全性标记
解决:对系统控制下的所有主客体实施强制存取控制策略
强制存取控制
保证更高程度的安全性
用户不能直接感知或进行控制
适用于对数据有严格而固定密级分类的部门—军事部门 政府部门
分主体(系统中的活动实体,用户)和客体(系统中的被动实体,基本表,视图)
强制存取控制规则:向下读,向上写
可以为不同的用户定义不同的视图,把数据对象限制再在一定的范围内。也就是说,通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动对数据提供一定程度的安全保护。
例4.14
建立计算机系学生的视图,把对该视图的SELECT权限授予WANG,把该视图上的所有操作权限授予ZHANG。
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERE Sdept='CS';
GRANT SELECT
ON CS_Student
TO WANG;
GRANT ALL PRIVILEGES
ON CS_Student
TO ZHANG;
审计AUDIT 取消审计 NOAUDIT
审计日志:将用户对数据库的所有操作记录在上面
审计员利用审计日志,监控数据库中的各种行为,找出非法存取数据的人、时间和内容。
审计费时间按和空间
DBA可以打开或关闭审计功能
审计功能能主要用于安全性要求较高的部门
ALTER 结构 UPDATE 数据
例4.15
对修改SC表结构或修改SC表数据的操作进行审计。
AUDIT ALTER,UPDATE
ON SC;
错误:“,”附近有语法错误。尝试一些办法去修改,但是会出现其他的答案,在百度中搜索SQL SERVER审计AUDIT,出来的东西我大概看了一眼也没弄明白,猜想这种写法在SQL SERVER中不适用。
例4.16
取消对SC表的一起审计。
NOAUDIT ALTER,UPDATE
ON SC;
错误:同样问题,不再重复。
本次作业中报错的地方还是挺多的,所以用样的语句,在不同的关系数据库管理系统中识别的程度不同,发现之后用百度基本上可以得到解释,但是在后面审计部分,还是留有疑问,AUDIT关键词在SQL SERVER中不识别。
另外,关于自身原因,正所谓:一鼓作气,再而衰,三而竭。适用我身上不为过,前两天处于竭的阶段,今天不得不一鼓作气了,对于我自己我也是很无语的。。。。