MySQL等级测评方法及知识点

查看版本

mysql
1
2
select version();
status;

身份鉴别

账户信息

查看账户是否为空口令
1
2
3
4
5
6
7
#mysql5.7及以上
select user,host,authentication_string from mysql.user;
select user,host from mysql.user where length(authentication_string)=0 or authentication_string is null;

#mysql5.7以下
select user,host,password from mysql.user;
select * from mysql.user where length(password)=0 or password is null;

密码策略

  • validate_password插件
    适用于mysql5.7.17以后
插件安装
1
2
INSTALL PLUGIN validate_password SONAME 'validate_password.dll'; #windows
UNINSTALL PLUGIN validate_password; #卸载
查看
1
show global variables like '%validate_password%';
参数 说明
validate_password_check_user_name ON 匹配新口令中是否含有用户名,默认启用
validate_password_dictionary_file 密码字典,新口令与字典相同则不可用
validate_password_length 8 口令最小长度
validate_password_mixed_case_count 1 最少大写和小写字符数(同时有大写和小写)
validate_password_number_count 1 最少数字字符数
validate_password_special_char_count 1 最少特殊字符数
validate_password_policy MEDIUM 密码安全策略:0/LOW:只限长度;1/MEDIUM:限制长度、数字、字母、特殊字符;2/STRONG:限制长度、数字、字母、特殊字符、字典

  • 口令有效期
mysql5.7.4以上版本
1
2
show global variables like 'default_password_lifetime';
select user,host,password_last_changed from mysql.user;

在mysql配置文件(my.cnf(linux)my.ini(windows))中设置

1
2
[mysqld]
default_password_lifetime=180
在线设置,重启后失效
1
SET GLOBAL default_password_lifetime = 180;

登录失败

1
2
3
4
5
6
7
8
9
10
11
12
13
# MySQL 5.6.x及更高版本
show global variables like '%connection-control%';

# 相关参数
# 在服务器增加后续连接尝试的延迟之前,允许客户端进行的连续失败连接尝试的次数。
connection_control_failed_connections_threshold=5
# 对于超出阈值的每个连续连接失败,要最小的延迟量,单位毫秒
connection_control_min_connection_delay=60000
# 对于超出阈值的每个连续连接失败,要增加的最大延迟量,单位毫秒
connection_control_max_connection_delay=2147483647

# 网络连接错误次数,超出则断开会话
show global variables like 'max_connect_errors';

登录超时

1
2
show global variables like 'wait_timeout';
show global variables like 'interactive_timeout';
参数 说明
interactive_timeout 服务器关闭交互式连接前等待活动的秒数,默认值为28800。注意,如果设置该参数,通过交互式登录后,当前会话wait_timeout值也会变成该参数的值,使用show session variables like 'wait_timeout';查看当前会话设置。
wait_timeout 服务器关闭非交互连接之前等待活动的秒数,默认值为28800。

远程管理

见鉴别信息传输保密性

访问控制

查看用户
1
2
3
4
5
select currnet_user(); #查看当前用户
select user,host from mysql.user;
show grants for 'root'@'localhost'; #查看指定用户的权限
show grants; #查看当前用户的权限
select user,host,account_locked from mysql.user; #查看用户是否禁用
查看用户权限
1
2
3
4
select * from mysql.user\G; #查看用户权限 
select * from mysql.db\G; #查看数据库权限
select * from mysql.tables_priv\G; #查看表权限
select * from mysql.columns_priv\G; #查看列权限

安全审计

日志类型

MySQL日志类型 说明
普通查询日志(general query log) 当客户端连接数据库、执行语句时产生该日志
二进制日志(binray log) 当数据库内容发生改变时产生该日志,也被用来实现主从复制功能
错误日志(error log) 当数据库启动、运行、停止时产生该日志
中继日志(relay log) 从库上收到主库的数据更新是产生该日志
慢查询日志(slow query log) SQL语句在数据库查询超过指定时间时产生该日志
DDL日志(metadata log) 执行DDL语句操作元数据时产生该日志

日志设置

查看日志设置
1
2
3
4
5
show global variables like '%log%';         #查看所有日志相关配置
show global variables like 'log_output'; #查看日志保存类型,文件or数据库表
show global variables like '%general_log%'; #查看常规查询日志配置
show global variables like '%log_bin%'; #查看二进制日志配置
show global variables like '%log_error%'; #查看错误日志
参数 说明
log_output TABLE/FILE 日志保存位置,数据库表或文件,MySQL5.1.6版及以上
general_log ON/OFF 是否开启mysql常规查询日志,包括登录退出、SQL语句执行
general_log_file \ mysql常规查询日志文件存储路径
log_bin ON/OFF 是否开启二进制日志
log_bin_basename \ 保留二进制日志文件的基本名称和路径
log_bin_index \ 保留二进制日志索引文件的基本名称和路径
log_error \ 错误日志文件路径
slow_query_log ON/OFF 是否开启慢查询日志
slow_query_log_file \ 慢查询日志文件路径
配置
1
2
3
set global log_output="TABLE";
set global general_log=1; #开启general_log日志
set global log_bin=1; #开启log_bin日志

日志内容

log_output
1
2
3
4
desc mysql.general_log; #查看常规日志字段类型
SELECT * FROM mysql.general_log where event_time like '2020-08-31%';
SELECT *, CONVERT(argument USING utf8) FROM mysql.general_log; #当argument字段显示为16进制时使用,转为文字。
SELECT *, CONVERT(argument USING utf8) FROM mysql.general_log where event_time like '2020-08-31%';
查看二进制日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#数据库内查看
show binary logs; #查看日志文件名称等信息
show binlog events; #查看日志文件名称等信息
show binlog events in 'XXX-bin.000002'; #查看日志文件具体内容

#使用mysqlbinlog查看(命令行)
# mysqlbinlog 的执行格式
mysqlbinlog [options] log_file

# 查看bin-log二进制文件(shell方式)
mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003

# 查看bin-log二进制文件(带查询条件)
mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003 \
--start-datetime="2020-03-01 00:00:00" \
--stop-datetime="2020-03-10 00:00:00" \
--start-position="5000" \
--stop-position="20000"
查看慢查询日志
1
2
desc mysql.slow_log;          #查看慢查询日志字段类型
SELECT * FROM mysql.slow_log; #查看慢查询日志内容

日志备份

log_output值为FILE时备份文件,为TBALE时备份数据库。

其他审计

MySQL企业审核基于审核日志插件和相关组件,官方文档

查看是否安装
1
2
3
4
show global variables like '%audit%';
SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'audit%';

入侵防范

组件

查看插件信息
1
show plugins;

地址限制

1
select user,host from mysql.user;

数据完整性

  • SSL保证数据完整性
1
2
show global variables like '%ssl%'; #是否启用SSL
show global variables like "%require_secure_transport%"; #是否只允许SSL连接

数据保密性

鉴别信息传输保密性

1
2
3
4
# 查看默认验证插件
show variables like 'default_authentication_plugin';
# 查看密码验证插件
select user,plugin from mysql.user;
插件名称 说明
mysql_native_password 使用带盐的SHA1算法加密
caching_sha2_password 使用带盐的SHA256算法加密,mysql8.0以上默认采用caching_sha2_password插件,官方说明
sha256_password 使用带盐的SHA256算法加密
mysql_old_password 不符合要求,被截获可直接登录

加密安全度
caching_sha2_password > sha256_password > mysql_native_password

鉴别信息存储保密性

查看加密插件及加密结果
1
2
3
select user,plugin,password from mysql.user;
# mysql5.7以后密码字段为authentication_string
select user,plugin,authentication_string from mysql.user;
  • 内容类似如下
user plugin authentication_string/password
root caching_sha2_password $A$005$1%h5f1OdZ0'46}M[uz5Di5wW2WWg8eeLWynsg2h3xnzHwQLmm39bEqLBxB0
root mysql_native_password *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
  • mysql_native_password存储加密说明
    使用SHA1算法,输出41位密文
    官方说明

  • caching_sha2_password存储加密说明

内容 字节数 说明
哈希算法 2字节 目前仅为 $A,表示 SHA256 算法
哈希轮转次数 4字节 目前仅为 $005,表示 5*1000=5000 次
盐(salt) 21字节 用于解决相同密码相同哈希值问题
哈希值 43字节

参考文档:
MySQL 8.0:新的身份验证插件(caching_sha2_password)


其他

1
2
3
4
5
6
7
8
9
select user();            #查看当前用户
select database(); #查看当前数据库
show database; #查看所有数据库
show tables; #显示当前数据库的所有表
select * from mysql.user; #查看所有用户
show plugins; #查看插件信息
INSTALL PLUGIN myplugin SONAME 'somepluglib.so'; #安装插件,windows下为dll文件
SET GLOBAL 插件名 = 值; #设置插件
uninstall plugin name; #卸载插件