三权分立
1、首先在root用户下,创建三个管理员账号,分别授予以下三种权限
(1)系统管理员(起、停、restart、stop,只拥有DDL权限)
(2)安全管理员(拥有授权的权力,可以给B授权,然后B可以使用grant with option将权力赋给C)
(3)审计管理员(pluing 安装审计插件 ,可以去配置审计)
2、在这三个管理员账号可以登录之后,分别登录三个管理员账号,分别对这三个管理员用户进行测试,查看是否具有该具有的权力,和别的权力的检测,查看别的权力是否可以执行。
3、完成第二步之后,再创建三个普通的用户,用三个管理员账户去分别对三个普通用户进行彼此权力的授权,查看三个普通用户是否可以执行所被授予的权力。
4、完成第三步之后,在配置文件中加入mandatory_role = (所创建的三种类型的角色),查看用root用户是否可以将这个三个角色删除(无法删除则成功)。
5、以上步骤均成功完成,则测试成功。
下面是测试环节:
数据库环境:基于MySQL 8.0.25
操作系统环境:Linux version 3.10.0-957.el7.x86_64 (mockbuild@x86-040.build.eng.bos.redhat.com) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Thu Oct 4 20:48:51 UTC 2018
1、首先登录root用户,在root用户下创建三个系统管理员用户:
create role sys_role;(系统管理员)
create role safe_role;(安全管理员)
create role audit_role;(审计管理员)
2、分别对三个系统管理员做授权工作
(1)系统管理员sys_role
grant create,drop,alter on *.* to sys_role;
show grants for sys_role;
+———————————————–+
| Grants for sys@% |
+———————————————–+
| GRANT CREATE, DROP, ALTER ON *.* TO `sys`@`%` |
+———————————————–+
(2)安全管理员safe_role
grant create user on *.* to safe_role;
show grants for safe_role;
+———————————————+
| Grants for safe_role@% |
+———————————————+
| GRANT CREATE USER ON *.* TO `safe_role`@`%` |
+———————————————+
(3)审计管理员audit_role
grant AUDIT_ADMIN on *.* to audit_role;
show grants for audit_role;
+—————————————–+
| Grants for audit@% |
+—————————————–+
| GRANT USAGE ON *.* TO `audit`@`%` |
| GRANT AUDIT_ADMIN ON *.* TO `audit`@`%` |
+—————————————–+
3、创建三个用户分别对应三个role管理角色,并将其权限赋给三个用户,并操作三个用户,查看是否拥有对应的权限,和操作没有的权限是否报错。
(1)系统管理员用户sys
创建用户sys,并授予sys_role的权限
create user sys@’%’ identified by ‘123123’;
grant sys_role to sys@’%’;
使权限生效
SET DEFAULT ROLE ALL TO sys;
登录sys账号,进行权限的测试
use poc_test
show tables;
drop table tt1;
create table tt1(id int , name varchar(20));
insert into tt1 values(1,’zhangsan’);(报错)
ERROR 1142 (42000): INSERT command denied to user ‘sys’@’localhost’ for table ‘tt1’
select * from tt1;
ERROR 1142 (42000): SELECT command denied to user ‘sys’@’localhost’ for table ‘tt1’
测试此用户是否可以创建用户,并给其他用户授权
ERROR 1227 (42000): Access denied; you need (at least one of) the CREATE USER privilege(s) for this operation
提示并没有给其他用户授权的权限
因为测试,所以没有将所有的DDL权限赋给sys_role,只是将其中一部分权限给了sys_role。
最后测试成功,可以创建一个只拥有DDL权限的角色,并且可以将此角色的权限赋给用户,用户可以拥有sys_role的权限,但是不能将权限再给其他用户,保证了系统管理员角色的存在合理性。
(2)安全管理员
创建用户safe予safe_role的权限
在测试后发现,因给与安全管理员create user权限之后,safe用户拥有safe_role的权限,可以去数据库进行删除和创建的操作,所以这个权限对安全管理员的已经超出了其权限,所以将其收回权限,并重新赋予新的权限。
因为不能给与create user 权限,所以我想着,单独给safe_role去对mysql中的user表进行 create user 的权限
grant create user on mysql.user to safe_role;
ERROR 1144 (42000): Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used
报错,并提示非法授予
只能给与其select mysql.user的权限,和将此权限,赋权给其他的用户
show grants for safe_role;
+———————————————————————+
| Grants for safe_role@% |
+———————————————————————+
| GRANT USAGE ON *.* TO `safe_role`@`%` |
| GRANT SELECT ON `mysql`.`user` TO `safe_role`@`%` WITH GRANT OPTION |
+———————————————————————+
用户safe的权限
show grants for safe;
+————————————-+
| Grants for safe@% |
+————————————-+
| GRANT USAGE ON *.* TO `safe`@`%` |
| GRANT `safe_role`@`%` TO `safe`@`%` |
+————————————-+
登录到safe用户下之后,对其进行操作
show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
+——————–+
select user,host from user;
+——————+———–+
| user | host |
+——————+———–+
| audit_role | % |
| bridge | % |
| safe | % |
| safe_role | % |
| sys | % |
| sys_role | % |
| test | % |
| test1 | % |
| test12 | % |
| test123 | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+——————+———–+
只能做select的操作,无法对其进行别的操作。
所以安全管理员,暂时没有找到合适的操作对其进行授予权限,可以将一些查看类的权限赋予安全管理员,让其监督。
(3)审计管理员
4、分别对这三个管理员角色添加强制角色,查看root用户下是否无法删除这个三个角色,和撤销这个三个角色的相应权限后,是否是会话级别的撤销。
单独拿sys_role进行测试
首先在配置文件中添加变量
[mysqld]
mandatory_roles=’sys_role’
不单独设置数据库中的参数mandatory_roles
show variables like ‘%mandatory_roles’;
+—————–+———-+
| Variable_name | Value |
+—————–+———-+
| mandatory_roles |
+—————–+———-+
重启,查看是否可以删除角色sys_role
drop role sys_role;
发现可以删除,由此可得出在配置文件中设置强制角色没有生效。
那我们单独设置数据库中的参数
SET PERSIST mandatory_roles = ‘sys_role’;
show variables like ‘%mandatory_roles’;
+—————–+———-+
| Variable_name | Value |
+—————–+———-+
| mandatory_roles | sys_role |
+—————–+———-+
现在再次测试强制角色sys_role是否可以删除
drop role sys_role;
ERROR 3628 (HY000): The role `sys_role`@`%` is a mandatory role and can’t be revoked or dropped. The restriction can be lifted by excluding the role identifier from the global variable mandatory_roles.
开始报错,无法删除sys_role,提示sys_role为强制角色,无法删除,需要在全局变量中来解除限制
接下来测试,收回sys_role的权限,测试是否能收回权限,并退出,重启,查看是否为会话级别的删除。
revoke create on *.* from sys_role;
提示撤销成功
那么我们去查看sys_role的权限,是否被撤销了
show grants for sys_role;
+——————————————–+
| Grants for sys_role@% |
+——————————————–+
| GRANT DROP, ALTER ON *.* TO `sys_role`@`%` |
+——————————————–+
权限被撤销
继续测试是否为会话级别的撤销
exit 退出当前的会话,并重新登录会话
再次检查权限sys_role的权限是否恢复
show grants for sys_role;
+——————————————–+
| Grants for sys_role@% |
+——————————————–+
| GRANT DROP, ALTER ON *.* TO `sys_role`@`%` |
+——————————————–+
发现并没有恢复
于是打算重启测试
kill掉进程之后,再次重新启动,并进入数据库,验证权限是否恢复。
show grants for sys_role;
+——————————————–+
| Grants for sys_role@% |
+——————————————–+
| GRANT DROP, ALTER ON *.* TO `sys_role`@`%` |
+——————————————–+
发现依旧没有恢复所撤销的权限。
5、综上所述,设置了强制角色,只是不能将强制角色删除,但是依旧可以对强制角色进行撤销权限,而且不需要在配置文件中声明强制角色,并不会生效,要在数据库中的全局变量来设置强制角色。