前言:记得验收时问了一个问题吧,就是用户和角色的区别是什么
实验2.1自主存取控制实验
1.实验目的
掌握自主存取控制权限的定义和维护方法。
2.实验内容和要求
定义用户、角色,分配权限给用户、角色,回收权限,以相应的用户名登录数据库验证权限分配是否正确。选择一个应用场景,使用自主存取控制机制设计权限分配。可以采用两种方案。
方案一:采用SYSTEM超级用户登录数据库,完成所有权限分配工作,然后用相应用户名登录数据库以验证权限分配正确性;
方案二:采用SYSTEM用户登录数据库创建三个部门经理用户,并分配相应的权限,然后分别用三个经理用户名登录数据库,创建相应部门的USER,ROLE,并分配相应权限。
下面的实验报告示例采用了实验方案一.验证权限分配之前,请备份好数据库;针对不同用户所具有的权限,分别设计相应的SQL语句加以验证。
3.实验过程
通过 SQL 的 GRANT 语句和 REVOKE 语句实现
用户权限组成
- 数据对象
- 操作类型
定义用户存取权限:定义用户可以在哪些数据库对象上进行哪些类型的操作
定义存取权限称为授权
GRANT
语句的一般格式:
GRANT <权限>[,<权限>]...
[ON <对象类型> <对象名>]
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
语义:将对指定操作对象的指定操作权限授予指定的用户
WITH GRANT OPTION子句:
- 指定:可以再授予
- 没有指定:不能传播
REVOKE
- 授予的权限可以由DBA或其他授权者用REVOKE语句收回
语句的一般格式为:
REVOKE <权限>[,<权限>]...
[ON <对象类型> <对象名>]
FROM <用户>[,<用户>]...;
设有一个企业,包括采购、销售和客户管理等三个部门,采购部门经理David,采购员Jeffery ;销售部门经理Tom ,销售员Jane;客户管理部门经理Kathy ,职员Mike。该企业一个信息系统覆盖采购﹑销售和客户管理等三个部门的业务,其数据库模式为TPC-H数据模式。针对此应用场景,使用自主存取控制机制设计一个具体的权限分配方案。
(0)开始准备
创建角色之后记得激活,可以把mysql设置为自动激活,(应该是一个用户对应一个全局变量act…,因为我做的时候是在创建角色的时候改过变量为ON,写这篇的时候直接在root下登录MySQL,发现这个变量是OFF)
show variables like 'activate_all_roles_on_login';
set global activate_all_roles_on_login = on;
(1)创建用户
- 为采购、销售和客户管理等三个部门的经理创建用户标识,要求具有创建用户或角色的权利。
CREATE USER 'David' @'localhost' IDENTIFIED BY '123456';
GRANT CREATE USER,
CREATE ROLE ON *.* TO 'David' @'localhost' WITH GRANT OPTION;
CREATE USER 'Kathy' @'localhost' IDENTIFIED BY '123456';
GRANT CREATE USER,
CREATE ROLE ON *.* TO 'Kathy' @'localhost' WITH GRANT OPTION;
CREATE USER 'Tom' @'localhost' IDENTIFIED BY '123456';
GRANT CREATE USER,
CREATE ROLE ON *.* TO 'Tom' @'localhost' WITH GRANT OPTION;
可以看到,成功创建了用户
- 为采购、销售和客户管理等三个部门的职员创建用户标识和用户口令。
CREATE USER 'Jeffery'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'Jane'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'Mike'@'localhost' IDENTIFIED BY '123456';
可以看到,成功创建了用户
(2)创建角色并分配权限
1)为各个部门分别创建一个查询角色,并分配相应的查询权限。
- 给采购部门创建一个角色 SELECT_purchase ,其具有查询零件表、供应商表、零件供应联系表的权限,对应其采购的需求
CREATE ROLE 'SELECT_purchase'@'localhost';
GRANT SELECT ON test.part TO 'SELECT_purchase'@'localhost'; #test改成对应的数据库即可
GRANT SELECT ON test.supplier TO 'SELECT_purchase'@'localhost';
GRANT SELECT ON test.partsupp TO 'SELECT_purchase'@'localhost';
SHOW GRANTS FOR 'SELECT_purchase'@'localhost';
运行结果如下:
- 给销售部门创建一个角色 SELECT_sale ,其具有查询订单表和订单明细表的权限,对应其销售的需求
CREATE ROLE 'SELECT_sale'@'localhost';
GRANT SELECT ON test.orders TO 'SELECT_sale'@'localhost';
GRANT SELECT ON test.lineitem TO 'SELECT_sale'@'localhost';
SHOW GRANTS FOR 'SELECT_sale'@'localhost';
运行结果如下:
- 给客户管理部门创建一个角色 SELECT_customer ,其具有查询顾客表、国家表、地区表的权限,对应其顾客管理的需求
CREATE ROLE 'SELECT_customer'@'localhost';
GRANT SELECT ON test.customer TO 'SELECT_customer'@'localhost';
GRANT SELECT ON test.nation TO 'SELECT_customer'@'localhost';
GRANT SELECT ON test.region TO 'SELECT_customer'@'localhost';
SHOW GRANTS FOR 'SELECT_customer'@'localhost';
运行结果如下:
2)为各个部门分别创建一个职员角色,对本部门具有查看、插入权限。
- 给采购员Jeffery创建一个角色 WORKER_Jeffery,其具有插入和查询零件表、供应商表、零件供应联系表的权限
CREATE ROLE 'WORKER_Jeffery'@'localhost';
GRANT INSERT,SELECT ON test.part TO 'WORKER_Jeffery'@'localhost';
GRANT INSERT,SELECT ON test.partsupp TO 'WORKER_Jeffery'@'localhost';
GRANT INSERT,SELECT ON test.supplier TO 'WORKER_Jeffery'@'localhost';
SHOW GRANTS FOR 'WORKER_Jeffery'@'localhost';
运行结果如下:
- 给销售员Jane创建一个角色 WORKER_Jane,其具有插入和查询订单表和订单明细表的权限
CREATE ROLE 'WORKER_Jane'@'localhost';
GRANT INSERT,SELECT ON test.orders TO 'WORKER_Jane'@'localhost';
GRANT INSERT,SELECT ON test.lineitem TO 'WORKER_Jane'@'localhost';
SHOW GRANTS FOR 'WORKER_Jane'@'localhost';
运行结果如下:
- 给职员Mike创建一个角色WORKER_Mike,其具有插入和查询客表、国家表、地区表的权限
CREATE ROLE 'WORKER_Mike'@'localhost';
GRANT INSERT,SELECT ON test.nation TO 'WORKER_Mike'@'localhost';
GRANT INSERT,SELECT ON test.region TO 'WORKER_Mike'@'localhost';
GRANT INSERT,SELECT ON test.customer TO 'WORKER_Mike'@'localhost';
SHOW GRANTS FOR 'WORKER_Mike'@'localhost';
运行结果如下:
3)为各部门创建一个经理角色,相应角色对本部门的信息具有完全控制权限,对其他部门的信息具有查询权。经理有权给本部门职员分配权限。
CREATE ROLE 'Manager_David'@'localhost';
GRANT ALL ON test.part TO 'Manager_David'@'localhost';
GRANT ALL ON test.partsupp TO 'Manager_David'@'localhost';
GRANT ALL ON test.supplier TO 'Manager_David'@'localhost';
SHOW GRANTS FOR 'Manager_David'@'localhost';
CREATE ROLE 'Manager_Tom'@'localhost';
GRANT ALL ON test.orders TO 'Manager_Tom'@'localhost';
GRANT ALL ON test.lineitem TO 'Manager_Tom'@'localhost';
SHOW GRANTS FOR 'Manager_Tom'@'localhost';
CREATE ROLE 'Manager_Kathy'@'localhost';
GRANT ALL ON test.nation TO 'Manager_Kathy'@'localhost';
GRANT ALL ON test.region TO 'Manager_Kathy'@'localhost';
GRANT ALL ON test.customer TO 'Manager_Kathy'@'localhost';
SHOW GRANTS FOR 'Manager_Kathy'@'localhost';
总共创建如下:
经理:David Tom Kathy
员工:Jeffery Jane Mike
查询角色:SELECT_purchase SELECT_sale SELECT_customer
职员角色:WORKER_Jeffery WORKER_Jane WORKER_Mike
经理角色:Manager_David Manager_Tom Manager_Kathy
(3)给用户分配权限
1)给各部门经理分配权限。
GRANT 'Manager_David'@'localhost' TO 'David'@'localhost';
GRANT 'Manager_Tom'@'localhost' TO 'Tom'@'localhost';
GRANT 'Manager_Kathy'@'localhost' TO 'Kathy'@'localhost';
SHOW GRANTS FOR 'David'@'localhost';
SHOW GRANTS FOR 'Tom'@'localhost';
SHOW GRANTS FOR 'Kathy'@'localhost';
运行结果如下:
2)给各部门职员分配权限。
GRANT 'WORKER_Jeffery'@'localhost' TO 'Jeffery'@'localhost';
GRANT 'WORKER_Jane'@'localhost' TO 'Jane'@'localhost';
GRANT 'WORKER_Mike'@'localhost' TO 'Mike'@'localhost';
SHOW GRANTS FOR 'Jeffery'@'localhost';
SHOW GRANTS FOR 'Jane'@'localhost';
SHOW GRANTS FOR 'Mike'@'localhost';
(4)回收角色或用户权限
1)收回客户经理角色的销售信息查看权限。
REVOKE SELECT ON test.customer FROM 'Manager_Kathy'@'localhost';
REVOKE SELECT ON test.nation FROM 'Manager_Kathy'@'localhost';
REVOKE SELECT ON test.region FROM 'Manager_Kathy'@'localhost';
SELECT Table_name,Table_priv FROM mysql.tables_priv WHERE user='Manager_Kathy';
结果如下:
可以看到,其收回了查询select的权限
2)回收Mike的客户部门职员权限
回收被赋予Mike的角色WORKER_Mike的权限,先查询它的权限有哪些
select * from mysql.tables_priv where user='WORKER_Mike';
收回其权限
REVOKE SELECT,INSERT ON test.customer FROM 'WORKER_Mike'@'localhost';
REVOKE SELECT,INSERT ON test.nation FROM 'WORKER_Mike'@'localhost';
REVOKE SELECT,INSERT ON test.region FROM 'WORKER_Mike'@'localhost';
select * from mysql.tables_priv where user='WORKER_Mike';
(5)验证权限分配的正确性
1)以David用户名登录数据库,验证采购部门经理的权限
命令提示符输入
mysql -u David -p
输入密码后进入test数据库
use test;
验证采购部门经理的权限
SELECT * FROM part WHERE partkey=100;
SELECT * FROM partsupp WHERE partkey=100;
SELECT * FROM supplier WHERE suppkey=100;
可以看到,其能正常查询负责的几个表
2)验证Mike的客户部门职员权限。
输入quit退出David用户,再按照上面的方法进入Mike用户页面
输入show databases;
查看结果
可以发现,其收回权限之后根本找不到test数据库
再来一个佐证:
查看和Mike同等级的Jane:
没有被回收角色权限的用户Jane就可以访问到test,验证成功
4.实验总结
在进行权限分配之后,针对不同用户所具有的权限,设计并执行若干SQL语句,验证权限分配是否有效。
5.思考题
(1)请分析WITH CHECK OPTION、 WIIH CRANT OPTION和WITH ADMIN OPTION有何区别与联系。
1)
with admin option和with grant option的区别:
级联授权:
WITH ADMIN OPTION和系统权限相关。
WITH GRANT OPTION和对象权限相关。
两种option都能让指定的用户级联授权。
举例:
1、sys用户赋权给lisi:
grant create session to lisi;—>能够连接实例
grant create session to lisi WITH ADMIN OPTION;—>lisi具有create session,并且可以将该权限赋权给其他用户。
2、lisi用户赋权给lisi1:
grant create session to lisi1;—>能够连接实例
回收权限:
1、WITH ADMIN OPTION(系统权限):
拥有WITH ADMIN OPTION的用户如果赋权给其他用户权限,则撤销权限时,仅撤销用户自己权限。
例如:
sys—>赋权给lisi—>lisi赋权给lisi1
sys revoke撤销lisi的系统权限,lisi的系统权限不受影响。2、WITH GRANT OPTION(对象权限):
拥有WITH GRANT OPTION的用户如果赋权给其他用户权限,则撤销权限时,会发生级联权限撤销。
例如:
sys—>赋权给lisi—>lisi赋权给lisi1
sys revoke撤销lisi的对象权限,lisi1的对象权限失效。
with check option
with check option可以这么解释:通过视图进行的修改,必须也能通过该视图看到修改后的结果。视图加上with check option 子句后对该视图进行插入、修改、删除操作时,DBMS会自动加上条件(透过视图进行增删改操作时,不得破坏视图定义中的谓词条件(即子查询中的条件表达式))。
(2)请结合上述实验示例分析使用角色进行权限分配有何优缺点。
优点:管理权限方便,可以根据实际情况具体地为一些角色分配相应地权利,具有良好地安全性
缺点:操作繁琐。
实验2.2 审计实验
参考 审计实验
打开数据库审计开关。以具有审计权限的用户登陆数据库,设置审计权限,然后以普通用户登录数据库,执行相应的数据操纵SQL语句,验证相应审计设置是否生效,最后再以具有审计权限的用户登录数据库,查看是否存在相应的审计信息。
mysql本身并没有操作审计的功能,需要采用general log方法记录sql操作。网上的插件都是基于MySQL5.7版本的,由于我使用的是最新版8.21所以不是使用插件,而是使用mysql8.x提供的general log来实现审计功能。但是开启它有以下几个缺点
- 无论sql有无语法错误,只要执行了就会记录,导致记录大量无用信息,后期的筛选有难度。
- Sql并发量很大时,log的记录会对io造成一定的印象,是数据库效率降低。
- 日志文件很容易快速膨胀,不妥善处理会对磁盘空间造成一定影响。
1.实验目的
掌握数据库审计的设置和管理方法,以便监控数据库操作,维护数据库安全。
2.实验内容和要求
打开数据库审计开关。以具有审计权限的用户登录数据库,设置审计权限,然后以普通用户登录数据库,执行相应的数据操纵SQL语句,验证相应审计设置是否生效,最后再以具有审计权限的用户登录数据库,查看是否存在相应的审计信息。
3.实验过程
(1)审计开关
1)显示当前审计开关状态。
SHOW GLOBAL VARIABLES LIKE 'log_timestamps';
SHOW GLOBAL VARIABLES LIKE '%general%';
说明未开启审计
2) 暂时打开全局审计
SET GLOBAL general_log=on;
SHOW GLOBAL VARIABLES LIKE '%general%';
3) 查看审计文件保存的位置
show variables like 'general_log_file';
4)测试审计文件记录功能
SELECT * FROM part WHERE partkey=100;
SELECT * FROM part WHERE partkey=101;
SELECT * FROM part WHERE partkey=102;
SELECT * FROM part WHERE partkey=103;
查看审计文件:
可以观察到审计文件中的记录了刚才的查询操作及其时间。
5)关闭审计文件
SET GLOBAL general_log=off;
4.实验总结
审计语句不是标准SQL语句,所以不同的系统语句格式和语法不尽相同。
5.思考题
试着设计一个例子,分析数据库审计对数据库性能的影响情况。
variables like ‘general_log_file’;
[外链图片转存中...(img-xqgq2LfQ-1671714762768)]
4)测试审计文件记录功能
```sql
SELECT * FROM part WHERE partkey=100;
SELECT * FROM part WHERE partkey=101;
SELECT * FROM part WHERE partkey=102;
SELECT * FROM part WHERE partkey=103;
查看审计文件:
[外链图片转存中…(img-fvZX15It-1671714762768)]
可以观察到审计文件中的记录了刚才的查询操作及其时间。
5)关闭审计文件
SET GLOBAL general_log=off;
4.实验总结
审计语句不是标准SQL语句,所以不同的系统语句格式和语法不尽相同。
5.思考题
试着设计一个例子,分析数据库审计对数据库性能的影响情况。
答:数据库审计功能用于监视并记录对数据库服务器的各类操作行为,并记入审计日志或数据库中以便日后进行跟踪、查询、分析,以实现对用户操作的监控和审计。MySQL本身提供详细的sql执行记录–general log,但是开启记录日志的话,只要执行了sql就会记录,无论是否有错误,这就会导致记录大量的无用信息,如果sql并发量很大时,log的记录会对io造成一定的印象,降低数据库效率。