实验二 安全性语言实验
实验 2.1 自主存取控制实验
1.实验目的
掌握自主存取控制权限的定义和维护方法。
2.实验内容和要求
定义用户、角色,分配权限给用户、角色,回收权限,以相应的用户名登录数据库验证权限分配是否正确。选择一个应用场景,使用自主存取控制机制设计权限分配。可以采用两种方案。 方案一:采用SYSTEM超级用户登录数据库,完成所有权限分配工作,然后用相应用户名登录数据库以验证权限分配正确性; 方案二:采用SYSTEM用户登录数据库创建三个部门经理用户,并分配相应的权限,然后分别用三个经理用户名登录数据库,创建相应部门的USER、ROLE,并分配相应权限。
3.实验重点和难点
实验重点:定义角色,分配权限和回收权限。 实验难点:实验方案二实现权限的再分配和回收。
4.实验过程
使用实验一中建立的教务系统AAS数据库模式。AAS数据库模式由学生表(student),课程表(course),选课表(sc)三个基本表组成。假设该系统具有学生信息查询,成绩录入,课程管理等功能,为以上三个功能使用自主存取控制机制设计一个具体的权限分配方案。
为了便于验证,为课程表添加了一个属性Tname,表示任课教师的名称,并将计网课程的教师名设置为Y。
ALTER TABLE course
ADD COLUMN(
Tname CHAR(20)
);
SET SQL_SAFE_UPDATES = 0;
update course
set tname='Y'
WHERE Cname="计算机网络";
(1)创建用户
MYSQL的用户创建语句格式如下:
CREATE USER user_account IDENTIFIED BY password;
其中user_account的格式是username@hostname。
为学生管理,教务管理的人员A,B创建用户标识和用户口令。
CREATE USER A IDENTIFIED BY "123456";
CREATE USER B IDENTIFIED BY "123456";
CREATE USER C IDENTIFIED BY "123456";
为学生X,教师Y创建用户标识和用户口令。
CREATE USER X IDENTIFIED BY "123456";
CREATE USER Y IDENTIFIED BY "123456"; /*计网课程的教师*/
(2)创建角色并分配权限
创建学生角色,可以对个人信息,选课情况及课程情况进行查询。
CREATE ROLE StudentRole;
/*只能查询自己的信息,需要借助视图实现*/
CREATE VIEW v_student
AS
SELECT *
FROM aas.student
WHERE concat(sname,'@localhost') = USER();
GRANT SELECT
ON aas.v_student
TO StudentRole;
/*只能查询自己的选课信息,同样使用视图实现*/
CREATE VIEW v_sc
AS
SELECT *
FROM aas.student NATURAL JOIN aas.sc
WHERE concat(sname,'@localhost') = USER();
GRANT SELECT
ON aas.v_sc
TO StudentRole;
/*查询课程情况*/
GRANT SELECT
ON aas.course
TO StudentRole;
创建教师角色,可以查询学生信息,查询自己任课课程的选课信息和全部课程信息,可以更新选课信息中的成绩字段。
CREATE ROLE TutorRole;
/*可以查询全部学生信息*/
GRANT SELECT
ON aas.student
TO TutorRole;
/*可以查询自己任课的课程选课情况,并修改成绩,借助视图实现*/
CREATE VIEW v_tsc
AS
SELECT *
FROM aas.sc NATURAL JOIN aas.course
WHERE concat(Tname,'@localhost') = USER();
GRANT SELECT,UPDATE(grade)
ON aas.v_tsc
TO TutorRole;
/*可以查询所有课程信息*/
GRANT SELECT
ON aas.course
TO TutorRole;
为学生管理,教务管理的人员创建角色,相应的对学生信息,选课信息和课程信息有全部的权限,对其他表有查询权限。其中,教务管理人员可以为其他人分配权限。
/*学生管理角色*/
CREATE ROLE StudentSuperviserRole;
GRANT ALL PRIVILEGES
ON aas.student
TO StudentSuperviserRole;
GRANT SELECT
ON aas.sc
TO StudentSuperviserRole;
GRANT SELECT
ON aas.course
TO StudentSuperviserRole;
/*教务管理角色*/
CREATE ROLE AffairMangerRole;
GRANT ALL PRIVILEGES
ON aas.sc
TO AffairMangerRole
WITH GRANT OPTION;
GRANT ALL PRIVILEGES
ON aas.course
TO AffairMangerRole
WITH GRANT OPTION;
GRANT SELECT
ON aas.student
TO AffairMangerRole;
(3)给用户分配权限
为用户X,Y分配学生,教师角色的权限;为用户A,B,C分配学生管理角色,教务管理角色的权限。
GRANT StudentRole TO X;
GRANT TutorRole TO Y;
GRANT StudentSuperviserRole TO A;
GRANT AffairMangerRole TO B;
GRANT AffairMangerRole TO C;
(4)回收角色或用户的权限
回收教师查询学生信息的权限。回收教务管理人员C的权限。
REVOKE SELECT ON student
FROM TutorRole;
REVOKE AffairMangerRole FROM C;
(5)验证权限分配的正确性
首先以用户名X登录数据库,X具有学生角色的权限,即可以查询自己的信息和选课信息以及所有课程信息。
/*登录后首先要激活角色,选择模式aas*/
SET ROLE ALL;
use aas;
/*查询个人信息*/
select *
from v_student;
/*查询选课信息*/
SELECT *
FROM v_sc NATURAL JOIN course;
尝试修改自己的信息,没有该权限。
UPDATE v_student
SET Sname="Y";
接下来以用户名Y登录数据库,Y具有教师角色的权限,可以查询自己任课课程的选课信息和全部课程信息,可以更新选课信息中的成绩字段,查询学生信息的权限被收回,不存在该权限。
/*登录后首先要激活角色,选择模式aas*/
SET ROLE ALL;
use aas;
/*更新成绩字段*/
SET SQL_SAFE_UPDATES=0;
UPDATE v_tsc
SET grade=85
WHERE sno="202012208";
/*查询任课课程的选课信息*/
SELECT *
FROM v_tsc;
/*查询学生信息*/
SELECT *
FROM student;
更新后的查询结果:
查询学生信息的权限已被收回,不能查询。
以用户名A登录数据库,有学生管理员的权限,进行学生信息的查询和更新验证。
/*登录后首先要激活角色,选择模式aas*/
SET ROLE ALL;
use aas;
/*更新学生信息并进行查询*/
SET SQL_SAFE_UPDATES=0;
UPDATE student
SET Sage=22
WHERE sno="202012211";
SELECT Sage
FROM student
WHERE sno="202012211";
/*验证sc表和course表的查询权限*/
select *
from sc;
可以进行更新和查询:
以用户名B登录,该用户具有教务管理角色的权限,有课程和选课表的所有权限。
/*登录后首先要激活角色,选择模式aas*/
SET ROLE ALL;
use aas;
/*插入一门课程,然后进行查询*/
INSERT INTO course(Cno,Cname)
VALUE("20","TESTCOURSE");
SELECT *
FROM course;
最后以用户名C登录,该用户的角色权限被收回,因此无法进行任何操作。
5.实验总结
通过本次实验,进一步熟悉了自主存取控制权限的方法,使用SQL语句进行了角色的创建,权限的分配,以及将角色权限分配给用户。在实验中,学习到MYSQL的角色的使用需要在用户登录后先进行激活,才能正常使用。实验的最后使用不同用户进行登录,对所分配权限的正确性进行了验证。
6.思考题
(1)分析WITH CHECK OPTION,WITH ADMIN OPTION 和 WITH GRANT OPTION 的区别和联系。
WITH CHECK OPTION用于视图的创建,作用是在使用视图时保证了通过视图进行的修改,也能通过该视图看到修改后的结果。WITH ADMIN OPTION语句和WITH GRANT OPTION语句都用于授权。如果在授予用户或角色权限时添加了WITH ADMIN OPTION语句,可以将该权限再授予其他角色;如果在授予用户或角色权限时添加了WITH GRANT OPTION语句,也可以将该权限授予再授予其他用户。
对与授权的WITH GRANT OPTION和WITH ADMIN OPTION的区别,一种解释是WITH ADMIN OPTION用于系统权限授权,WITH GRANT OPTION用于对象授权,而用户的系统权限被收回时,这个用户已经授予其他用户或角色的此系统权限不会因传播无效。
在MYSQL中,只有WITH GRANT OPTION语句,没有WITH ADMIN OPTION语句。
(2)请结合上述实验示例分析使用角色进行权限分配有何优缺点。
如果有许多用户都具有一类相同的权限,使用角色可以方便的批量分配权限。但是如果各用户的权限都存在不同,使用角色就不够灵活,可能需要创建许多不同的角色,更加繁琐。
实验2.2 审计实验
1.实验目的
掌握数据库审计的设置和管理方法,以便监控数据库操作,维护数据库安全。
2.实验内容和要求
打开数据库审计开关。以具有审计权限的用户登录数据库,设置审计权限,然后以普通用户登录数据库,执行相应的数据操纵SQL语句,验证相应审计设置是否生效,最后再以具有审计权限的用户登录数据库,查看是否存在相应的审计信息。
3.实验重点和难点
实验重点:数据库对象级审计,数据库语句级审计。
实验难点:合理地设置各种审计信息。一方面,为了保护系统重要的敏感数据,需要系统地设置各种审计信息,不能留有漏洞,以便随时监督系统使用情况,一旦出现问题,也便于追查;另一方面,审计信息设置过多,会严重影响数据库的使用性能,因此需要合理设置。
4.实验过程
MySQL不支持语句级审计,只能对所有的SQL使用进行日志记录。
(1)日志开关
显示当前日志开关状态。默认是关闭状态。
show variables like '%general_log%';
开启日志。
SET GLOBAL GENERAL_LOG=ON;
(2)验证日志
以用户A登录数据库,进行一些查询。
select *
from sc;
SELECT *
FROM course;
打开日志文件,可以看到刚才进行的查询操作。
5.实验总结
不同数据库对审计的支持都存在不同。审计语句不是SQL标准。在MYSQL社区版中,没有提供具体的审计设置,只能通过日志记录所有的数据库操作,一旦开启,任何操作都会都会记录在日志中,这会导致日志文件过大且影响效率。还有一些其他插件可以支持审计功能。