数据库实验2 数据库安全性定义与检查
创始人
2024-04-28 19:45:08
0

前言:记得验收时问了一个问题吧,就是用户和角色的区别是什么

实验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;

可以看到,成功创建了用户

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j79lWtAO-1671714762767)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\1669693207592.png)]

  • 为采购、销售和客户管理等三个部门的职员创建用户标识和用户口令。
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';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xqgq2LfQ-1671714762768)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\1669709524340.png)]

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;

查看审计文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fvZX15It-1671714762768)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\1669709589736.png)]

可以观察到审计文件中的记录了刚才的查询操作及其时间。

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造成一定的印象,降低数据库效率。

相关内容

热门资讯

安卓系统相机不能启动,安卓相机... 手机里的安卓系统相机突然不能启动了,这可真是让人头疼啊!你有没有遇到过这种情况呢?别急,今天就来跟你...
安卓原生系统时间校准,基于安卓... 手机时间不准了?别急,我来教你如何轻松搞定安卓原生系统时间校准! 话题引入:手机时间不准,是不是让你...
主机系统内存和安卓联机,主机系... 你有没有想过,为什么你的手机在玩大型游戏时总是卡得要命?又或者,为什么你的电脑在处理复杂任务时,反应...
安卓如何手机上刷系统,轻松升级... 你有没有想过,你的安卓手机是不是已经有点儿“老态龙钟”了呢?别急,别急,今天就来教你怎么给它来个“青...
苹果系统观战安卓好友,观战新体... 亲爱的读者,你是否也有过这样的经历:一边享受着苹果系统的优雅与流畅,一边又忍不住好奇地观战安卓好友们...
安卓系统最好是哪个,最佳生成方... 你有没有想过,手机里的安卓系统哪个才是最适合你的呢?在这个信息爆炸的时代,手机已经成为了我们生活中不...
改时间安卓系统vivo,探索v... 你有没有发现,最近你的vivo手机有点儿“慢吞吞”的?别急,别急,让我来给你支个招儿,让你的安卓系统...
安卓系统的旋钮在哪,旋钮生成位... 你有没有发现,有时候手机上的小细节也能让人头疼不已?比如说,安卓系统的旋钮在哪?这问题看似简单,但不...
安卓手机app系统软件,探索安... 你有没有发现,现在手机里的app简直就像是个小宇宙,各种功能应有尽有,让人眼花缭乱。尤其是安卓手机,...
win111安卓子系统,开启跨... 哇,你有没有听说最近的大新闻?那就是Windows 11的安卓子系统!是的,你没听错,Windows...
游戏摇杆连安卓系统电视,畅享游... 你有没有想过,家里的安卓系统电视也能玩起游戏来?没错,就是那种让你手舞足蹈、热血沸腾的游戏摇杆!今天...
nokia平板系统兼容安卓,尽... 你有没有想过,那些曾经陪伴我们度过无数时光的诺基亚手机,现在竟然也能摇身一变,成为平板电脑的得力助手...
安卓原生系统是什么品牌,探索安... 你有没有想过,为什么你的手机那么流畅,界面那么美观?这背后,可是有一个强大的“大脑”在默默支撑着呢!...
安卓3大操作系统,从三大分支看... 你知道吗?在安卓的世界里,操作系统可是有着三大巨头呢!它们就像安卓世界的三驾马车,各自有着独特的魅力...
开源文件管理系统安卓,打造个性... 你有没有想过,手机里那些乱糟糟的文件,要是能有个好帮手,生活该有多轻松啊?今天,就让我带你走进一个神...
手机删除了系统安卓市场,手机系... 手机里的安卓市场突然不见了,这可怎么办呢?别急,让我来给你详细说说这个棘手的问题,让你轻松应对!一、...
安卓系统写脚本软件下载,基于安... 你有没有想过,你的安卓手机或者平板电脑,除了用来刷剧、玩游戏,还能变成一个强大的工作助手呢?没错,就...
安卓系统有哪些机型好,探索顶级... 你有没有想过,安卓系统里的手机型号那么多,哪一款才是最适合你的呢?别急,今天我就来给你好好盘点看看安...
安卓系统之间如何互传,安卓设备... 你是不是也和我一样,手机里存了那么多好东西,却苦于不能和好友分享呢?别急,今天就来教你怎么用安卓系统...
安卓系统启动修改工具,安卓系统... 你有没有想过,你的安卓手机启动速度竟然可以像火箭一样快?没错,这就是今天我要跟你分享的神秘工具——安...