第四讲--mysql8.0权限安全审计专题(上)
此专题题目较多,因而分为上下两部份来讲,此为下篇
第一题
讲解:
在mysql登陆认证体系中,有两种登陆权限认证机制,如下:
1、mysql自身的登陆认证模块。--社区版与企业版都有
mysql通过mysqlserver与mysqlclient自身就可完成身分验证,具体有如下三种:
2、插件式认证插口模块。--企业版独有
mysql借用外部用户权限管理系统完成登入验证,而不须要mysql自身验证模块
具体有如下四种典型代表:
而以上四种插件式认证模块中:
PAM、LDAP、WPA都须要mysqlclient以明文(plaintext/cleartext)方法发送密码,
LDAPSASL是为了更安全的传输数据而降低了加密和安全层模块,因而是以密文形式发送密码。
补充:
插件式认证插口,是怎么让mysql才能完美兼容这种外部认证系统的呢?
虽然是由于在mysqlclient的libmysqlclient.so中,实现了对PAM、WPA、LDAP、LDAPSASL等系统的插口兼容,通过它来实现的适配,它被静态编译到了mysqlcient中作为顾客端插件使用红联linux论坛,具体匹配关系如下:
认证方法
顾客端插件
服务器端插件
PAM
mysql_clear_password
authentication_pam
SimpleLDAP
mysql_clear_password
authentication_ldap_simple
WPA
authentication_windows_client
authentication_windows
LADPSASL
authentication_ldap_sasl_client
authentication_ldap_sasl
看题目:
题目中提问的是服务器端认证插件须要接收顾客端明文的认证形式是哪两种。
看选项:
选项A和D,LDAP和PAMlinux 修改权限 777,正如前面所讲,都须要mysqlclientplugin发送明文到服务器端。
选项B和F,mysql_native_password和sha256_password,作为mysql自身的认证插件,都是须要顾客端发送hash和加密后的数据到服务器端的。
选项C,windowsnativeauthentication与windowspluggableauthentication是不一样的,后者是加密的,而前者是明文的。
选项F,LDAPSASL与SimpleLDAP不同,后者是加密的,而前者是明文的。
因而,选项AD正确。
第二题
讲解:
没哪些可说的,直接看选项
选项B,将mysqlserver放在防火墙后方
选项E,只容许应用服务器构建mysql联接
因而,选项BE正确。
第三题
讲解:
1、连接控制插件有哪些用呢?
拿来给后端联接数据库的行为指定规则。诸如:
2、连接控制插件有如下两个:
此插件坐落$BASEDIR/lib/plugins目录下connection_control.so。
3、连接控制插件作用是:
4、连接控制插件安装命令为:
INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
5、连接控制插件关键全局变量:
6、参数设置规则:
connection_control_max_connection_delay必须小于等于connection_control_min_connection_delay
7、使用举例:
如果系统设置变量如下:
这么当一个用户连续登陆3次都失败的情况下,第四次登陆恳求将被挂起延后1000微秒,若继续失败,第五次登陆的延后时间将继续降低,以这种推,假如仍然失败,则会最大延后200000纳秒。
8、连接控制插件有哪些意义呢?
看题目:
题目给出了如下参数设置:
connection_control_min_connection_delay=1000,
connection_control_max_connection_delay=2000,
此时将connection_control_min_connection_delay设置为3000,则违背了connection_control_min_connection_delay不能小于connection_control_max_connection_delay的规则,因而会直接报错。
正确的设置方式是先将connection_control_max_connection_delay设置为5000,再将connection_control_min_connection_delay设置为3000.
为此,选项D正确。
第四题
讲解:
role的概念是mysql8.0开始加入的,在之前是用proxy-user来实现的。
role是一组权限的集合,有如下操作可以使用:
重点要讲的是mandatory_roles:
1、mandatory_roles是哪些
它是强制赋于给全部users的roles集合,当系统中设置了mandatory_roles,这么所有的早已存在的users都讲手动获得这种roles,每次新创建的user也会立即获得这种roles,而且不会被revoke形式撤消。
2、mandatory_roles设置方法
SET PERSIST mandatory_roles = '`role1`@`%`,`role2`,role3,role4@localhost';
3、mandatory_roles有哪些规则
看选项:
选项A,当droprole的时侯,假如这个role不存在,则会报错。正确。
选项F,当droprole的时侯,假如这个role在mandatory_roles列表中,则会报错。正确。
选项BCD,都说了同一个事情,就是droprole之前要revoke全部权限集合或则删掉对应的user,又或则从所有的user上revoke这种role。这都是错误的。没必要如此做,它们会被直接drop,其对应的user将立即丧失这种role,虽然早已联接上来的session对应的user也会立即丧失这种role。
选项E,须要ADMINOPTION能够droprole,这是错误的。并不须要。
因而,选项AF正确。
第五题
讲解:
data-at-rest:即静态数据。
TDE:transparentdataencryption,是mysql提供的对InnoDB静态数据加密的功能,它支持加密如下数据:
操作举例:
ALTER TABLE t1 ENCRYPTION = 'Y';
CREATE TABLE t1 (c1 INT) ENCRYPTION = 'Y';
ALTER TABLESPACE ts1 ENCRYPTION = 'Y';
CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENCRYPTION = 'Y' Engine=InnoDB;
ALTER TABLESPACE mysql ENCRYPTION = 'Y';
看题目:
对一个早已存在的InnoDB表进行TDE加密
看选项:
只有A选项能实现题目要求
因而,选项A正确。
第六题
讲解:
mysqlproxyuser是mysql5.7的模拟role的实现,一个proxyuser可以理解为一个rolelinux 修改权限 777,它具有一些权限的集合;
在mysql8.0版本中早已实现了role功能。
此题出的特别阴险,原本正常的proxyuser结构逻辑都是十分清晰简明的。但是此题却用了匿名用户来作proxyuser,这就要仔细剖析推理了。
首先,看下正常的proxyuser是怎么做的,举个最简单的事例:
1、创建一个proxieduser,也就是role:
CREATE USER 'employee'@'localhost' IDENTIFIED WITH mysql_no_login; --不允许直接登录
GRANT ALL ON employees.* TO 'employee'@'localhost';
2、创建一个proxyuser,也就是user,它将从proxieduser处获得权限:
CREATE USER 'employee_laoge'@'localhost' IDENTIFIED WITH sha256_password BY 'LaoGeDB123!';
3、把employee代理给employee_laoge:
GRANT PROXY ON 'employee'@'localhost' TO 'employee_laoge'@'localhost';
4、用employee_laoge登陆数据库
msyql -uemployee_laoge -p
5、查看下如今的用户
mysql> select user(),current_user(),@@proxy_user;
+------------------------------+-------------------------+---------------------------------+
| user() | current_user() | @@proxy_user |
+------------------------------+-------------------------+---------------------------------+
| employee_laoge@localhost | employee@localhost | 'employee_laoge'@'localhost' |
+------------------------------+-------------------------+---------------------------------+
6、结论很清晰:
其次,看下题目中是如何作的:
题目中给出的如下:
我在实验环境中做过多个测试,都没有复现出题目中的内容。
所以,此题我也搞不明白,暂时无解。按照自己喜欢,选个E吧。
第七题
讲解:
UPDATE权限不包含SELECT权限,因而对一个表的列具有UPDATE权限,不代表有SELECT权限。
在一个表上做对某个列的WHERE过滤、ORDERBY、GROUPBY、CONCAT、MAX、MIN等都须要SELECT权限。
看题目:
jsmith对表world.country的name列有update权限,因而她可以对此列做update,但仅限于update,不能对此列做过滤。
看选项:
选项A,对name列作更新,且只更新limit1,第一行。并未涉及到对此列的SELECT。
选项B,WHEREname='old',须要SELECT权限。
选项C,ORDERBYname,须要SELECT权限。
选项D,CONCAT('New',Name),须要SELECT权限。
选项E,UPDATE全部记录的Name数组,并未涉及到对此列的SELECT。
为此,选项AE正确。
第八题
讲解:
mysql的auditlogevents,审计日志风波是储存在file中的,并不存在table中,所以mysql库中是看不到它的。
而当你在mysql库中见到audit_log的表时,这个表中储存的并不是auditlogevents,而是审计规则。
这个是此题比较阴险的地方,表面看是考mysql元数据表空间的内容,实际是考auditlogevents的储存形式。
要看mysql系统库中都有哪些表,执行showtables即可看见。
看选项:
选项A,performancemonitoringinformation,性能监控信息,储存在performance_schema中。
选项BFG,plugins、help_topics、time_zone都储存在mysql库中。
选项C,auditlogevents,储存在file中。
选项D,rollbacksegments,储存在undo表空间中。
选项E,informationabouttablestructures,表结构信息,5.7版本中储存在mysql中;8.0版本开始,表结构信息,也就是表定义直接储存在表的ibd文件头中,不再保留单独的结构文件.frm。
为此,选项BFG正确。
第九题
讲解:
首先,要明白两个基础:
看题目:
datadir目录权限被递归更改为777(worldread/write/execute)后,受影响的文件都有哪些。
看选项:
选项A,datafiles在datadir下,777使其可以被任何用户删掉。
选项B,用户可以更改甚至覆盖mysql的配置文件。假如有f,是可以这样的。
选项C,SQL注入可以被拿来插入破坏数据到数据库中。这个跟datadir权限无关。
选项D,mysql启动须要耗费更多的额外时间,由于要修补权限问题。没有这个功能的。
选项E,mysql二补码文件会被破坏。mysql的二补码不在datadir中,不受影响。
为此,选项AB正确。
第十题
讲解:
FORCE_PLUS_PERMANENT作用:
告诉mysql在启动的时侯加载插件linux空间,并避免在运行时此插件被卸载,当卸载时会报错。
看题目:
题目中写的是FORCE_LOG_PERMANENT,这是出题者弄错了,正确写法是FORCE_PLUS_PERMANENT。
看选项,只有C抒发正确。
为此,选项C正确。
第十一题
讲解:
MySQLFirewall是mysqlenterprise版本独有的插件,全称MySQLEnterpriseFirewall。
它是应用级别application-level的防火墙,起作用如下:
使DBA可以按照预先设置的SQL模式或则模板来准许或则拒绝SQL句子的执行。
不符合SQL模式的SQL句子将被拒绝执行,借此来避免SQL注入功击。
这些符合SQL模板的SQL称作allowlist。
它对每位mysql用户都单独筹建一套SQL模式,或则一套profile。
profile有四种操作状态:
当MySQLEnterpriseFirewall插件安装后,会有四个状态参数(StatusVariables)来表现Firewall的容许状态:
注意:Firewall针对的是SQLStatement,而不是connection。
看选项:
选项A,描述的是connection。错误。
选项B,描述的是在querycache中发觉的allowlist,而且是DETECTINGmode。错误。
选项C,描述的是connection。错误。
选项D,正确。
为此,选项D正确。
第十二题
讲解:
避免SQL注入有如下方式:
看题目:
题目问的是那个选项对避免sql注入功击无效。
看选项:
选项ABD,都可以避免SQL注入。
选项C,使用connectioncontrol。这个并不能避免SQL功击,上面我们讲过,它的作用是避免DDo功击或暴力联接引起的压力过载功击。
为此,选项C正确。
第十三题
讲解:
禁用一个mysql用户登陆权限有3种方式:
看题目:
mysqlinstance中一个用户baduser@localhost早已被舍弃了,怎么严禁此用户将来再度登陆。
看选项:
选项A,ACCOUNTLOCK。可以实现。
选项B,PASSWORDDISABLED。没有这些写法。
选项C,MAX_USER_CONNECTIONS=0。设置为0是无限制,但是这个参数也不是用在单个用户的,它是全局变量,设置方式为SETGLOBALMAX_USER_CONNECTIONS=0。
选项D,DEFAULTROLENONE。给某个用户设置一个defaultrolenone只是收回去role角色带来的权限,其自身的权限仍然存在,并可以继续登陆。
选项E,IDENTIFIEDWITHmysql_no_login。这个是mysql_no_login插件实现的功能。
假如安装了mysql_no_login插件,这样操作可以禁用此用户的登陆。
安装方法如下:
INSTALLPLUGINmysql_no_loginSONAME'mysql_no_login.so';
为此,选项AE正确。