基线核查与加固 - MySQL

基于 MySQL8.0.12 进行操作,环境:phpstudy_pro & Windows11

  1. 网络安全等级保护基本要求 - 第三级安全要求 - 安全计算环境
  2. 核查
  3. 加固

8.1.4 安全计算环境

8.1.4.1 身份鉴别

本项要求包括:

a) 应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换;

  • 核查密码复杂度
  • 核查密码生命周期

b) 应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施;

  • 核查是否限制非法登录次数
  • 核查登录连接超时配置

c) 当进行远程管理时,应采取必要措施防止鉴别信息在网络传输过程中被窃听;

  • 核查是否开启远程加密通信

d) 应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。

  • 不适用

核查密码复杂度

MySQL 系统自带有 validate_password 插件,此插件可以验证密码强度,未达到规定强度的密码则不允许被设置。MySQL 5.7 及 8.0 版本默认情况下貌似都不启用该插件,这也使得我们可以随意设置密码,比如设置为 123、123456等。如果我们想从根源上规范密码强度,可以启用该插件,下面一起来看下如何通过此插件来设置密码复杂度策略。

核查方式

安装前检查 为空则说明未安装此插件:show variables like 'validate%';

1
2
mysql> show variables like 'validate%'; 
Empty set (0.00 sec)

image-20221212213316407

加固方式
1)安装 validate_password 插件

INSTALL PLUGIN validate_password SONAME 'validate_password.so';

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 通过 INSTALL PLUGIN 命令可安装此插件
# 每个平台的文件名后缀都不同 对于 Unix 和类 Unix 系统,为.so,对于 Windows 为.dll
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
Query OK, 0 rows affected, 1 warning (0.28 sec)

# 查看 validate_password 相关参数
mysql> show variables like 'validate%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| 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_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

image-20221212213649720

2)密码强度相关参数解释

安装 validate_password 插件后,多了一些密码强度相关参数,这些参数从字面意思上也很容易看懂,下面简单解释下几个重点参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1. validate_password_policy
- 代表的密码策略,默认是MEDIUM 可配置的值有以下:
0 or LOW 仅需需符合密码长度(由参数validate_password_length指定)
1 or MEDIUM 满足LOW策略,同时还需满足至少有1个数字,小写字母,大写字母和特殊字符
2 or STRONG 满足MEDIUM策略,同时密码不能存在字典文件(dictionary file)中

2. validate_password_dictionary_file
- 用于配置密码的字典文件,当validate_password_policy设置为STRONG时可以配置密码字典文件,字典文件中存在的密码不得使用。

3. validate_password_length
- 用来设置密码的最小长度,默认值是8

4. validate_password_mixed_case_count
- 当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少同时拥有的小写和大写字母的数量
- 默认是1最小是0;默认是至少拥有一个小写和一个大写字母。

5. validate_password_number_count
- 当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的数字的个数,默认1最小是0

6. validate_password_special_char_count
- 当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的特殊字符的个数,默认1最小是0
3)密码复杂度策略具体设置

set global validate_password_length = 16;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 设置密码长度至少10位
mysql> set global validate_password_length = 16;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'validate%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_check_user_name | ON |
| validate_password_dictionary_file | |
| validate_password_length | 16 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

!!! note “若想永久生效,建议将以下参数写入配置文件”

1
2
3
4
5
[mysqld]
plugin-load = validate_password.dll
validate_password_length = 16
validate_password_policy = 1
validate-password = FORCE_PLUS_PERMANENT

image-20221212220000175

核查密码生命周期

核查方式

查看密码有效期:SHOW VARIABLES LIKE 'default_password_lifetime';

default_password_lifetime 设置为 0 ,即表示密码永不过期。

image-20221212211606097

加固方式
  • 一次性设置全局过期策略:SET GLOBAL default_password_lifetime = 90;

  • 或者直接写入配置文件并重启以永久生效

    1
    2
    3
    # 写入配置文件使得重启生效
    [mysqld]
    default_password_lifetime = 90

设置全局过期策略后,需要把配置写入配置文件 mysql.cn中并重启才能永久生效,否则 MySQL 重启后恢复默认值。

image-20221212211840616

核查是否限制非法登录次数

MySQL>= 5.7.17 以后提供了 Connection-Control 插件,用来控制客户端在登录操作连续失败一定次数后的响应的延迟。

核查方式
  • show variables like '%connection_control%';
    • 为空,则未启用插件,需要安装再进行加固。

image-20221212220652885

加固方式
1)安装 Connection-Control 插件
  • CONNECTION_CONTROL:用来控制登录失败的次数及延迟响应时间。
  • CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS:该表将登录失败的操作记录至IS库中。
1
2
3
4
5
6
7
8
# 每个平台的文件名后缀都不同 对于 Unix 和类 Unix 系统,为.so,对于 Windows 为.dll
install plugin CONNECTION_CONTROL soname 'connection_control.so';
install plugin CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS soname 'connection_control.so';
# 开启的选项
# connection_control_failed_connections_threshold 3
# connection_control_max_connection_delay 2147483647
# connection_control_min_connection_delay 1000

2)参数解释
  • connection_control_failed_connections_threshold

    • 失败尝试的次数,默认为3,表示当连接失败3次后启用连接控制,0表示不开启。
  • connection_control_max_connection_delay

    • 响应延迟的最大时间,默认约25天
  • connection_control_min_connection_delay

    • 响应延迟的最小时间,默认1000微秒,1秒
3)具体配置

方式一:修改配置文件 my.cnf or my.ini(永久生效)

1
2
3
4
5
6
7
8
# vim /etc/my.cnf
# 添加下面两项

# 1.登陆失败次数限制
connection-control-failed-connections-threshold=5

# 2.限制重试时间,此处为毫秒,注意按需求换算
connection-control-min-connection-delay=900000

方式二:设置全局变量(重启失效)

1
2
3
4
5
6
7
8
# 登陆失败次数限制
SET GLOBAL connection_control_failed_connections_threshold = 5;

# 限制重试时间,此处为毫秒,注意按需求换算
SET GLOBAL connection_control_min_connection_delay = 900000;

# 配置完成,再次查看参数:
show variables like '%connection_control%';

image-20221212222219404

核查超时功能

从官方文档上来看 wait_timeout 和 interactive_timeout 都是指不活跃的连接超时时间,连接线程启动的时候wait_timeout会根据是交互模式还是非交互模式被设置为这两个值中的一个。

如果我们运行mysql -uroot -p命令登陆到mysql,wait_timeout就会被设置为interactive_timeout的值。
如果我们在wait_timeout时间内没有进行任何操作,那么再次操作的时候就会提示超时,这时 mysql client会重新连接。

MySQL连接超时退出主要看三个参数:

  • interactive_timeout

    • 服务器关闭交互式连接前等待活动的秒数。
  • wait_timeout

    • 服务器关闭非交互连接之前等待活动的秒数。
  • 两者生效取决于

    • 客户端是交互或者非交互的连接。
    • 在交互模式下,interactive_timeout才生效;非交互模式下,wait_timeout生效。
  • connect_timeout =10

    • 指的是连接过程中握手的超时时间(s)
核查方式
  • show global variables like '%timeout%';

image-20221212223356808

加固方式
1
2
3
4
5
6
7
# 设置全局变量 `connect_timeout` 为 `10s`
msyql> set global connect_timeout=10;

# 设置 MySQL Server 超时时间(以秒为单位)
# 默认是28800,即8小时。
msyql> set global wait_timeout=28800;
msyql> set global interactive_timeout=28800;

image-20221212225225553

核查是否开启远程加密通信

核查方式
  • show variables like 'have_openssl';
  • SHOW VARIABLES LIKE '%ssl%';

image-20221212203451814

MySQL8.0.12默认开启加密通信

禁用加密通信:在配置文件 my.cnf 中的 [mysqld] 下加入skip_ssl,重启MySQL。

加固方式

加固通信传输要求项:启用 ssl 加密通信,注释 配置文件 my.cnf 中的 [mysqld] 下的skip_ssl,并在下面追加 ssl,重启MySQL。

image-20221212204608383

8.1.4.2 访问控制

本项要求包括:

a) 应对登录的用户分配账户和权限;

  • 核查是否对登录的用户分配账户和权限

b) 应重命名或删除默认账户,修改默认账户的默认口令;

  • 核查是否重命名账号
  • 核查是否修改默认口令

c) 应及时删除或停用多余的、过期的账户,避免共享账户的存在;

  • 核查是否存在多余的、过期的账号

d) 应授予管理用户所需的最小权限,实现管理用户的权限分离;

e) 应由授权主体配置访问控制策略,访问控制策略规定主体对客体的访问规则;

f) 访问控制的粒度应达到主体为用户级或进程级,客体为文件、数据库表级;

g) 应对重要主体和客体设置安全标记,并控制主体对有安全标记信息资源的访问。

核查是否对登录的用户分配账户和权限

核查方式
1
2
3
4
5
6
7
8
9
# MySQL 中所有使用者的权限是记录在 `mysql` 这个数据库的 `user` 资料表中:
SELECT * FROM mysql.user;
# 你可以看到所有的使用者权限

# 有关db的数据是记录在Db(大小写要注意)这个数据表中
SELECT * FROM mysql.Db;

# 或者你可以用条件查询找出你要的答案
SELECT * FROM mysql.Db WHERE Db='${dbname}'

image-20221213000354563

加固方式
  • 禁止root账号远程登录

  • 禁止程序使用root账号

    1
    2
    3
    4
    -- 设置允许任何IP登录
    use mysql;
    update user set host='localhost' where user='root' and host='%';
    flush privileges;

image-20221213000524679

核查是否重命名账号

核查方式
  • SELECT user, host FROM mysql.user

image-20221212234533536

加固方式
  • 修改root账号名

    1
    2
    3
    use mysql;
    update user set user='haiyi_root' where user='root' and host='localhost';
    flush privileges;

image-20221213000732709

核查是否修改默认口令

核查方式
  • 访谈
  • 查询空口令账号
    • select * from mysql.user where length(authentication_string)=0 or authentication_string is null;

image-20221213162949400

加固方式
  • 修改默认口令、空口令(谨慎操作)
1
2
3
4
5
6
7
8
mysql> USE mysql;
Database changed
mysql> UPDATE user SET authentication_string="H!q@31UI!" WHERE user="root";
Query OK, 1 row affected (0.39 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> FLUSH privileges; # 刷新保存
Query OK, 0 rows affected (0.13 sec)

核查是否存在多余的、过期的账号

核查方式
  • SELECT user, host FROM mysql.user

image-20221212235526618

加固方式
  • 删除多余的、过期的账号,如:test, dev等测试账号。

  • 删除 testdrop user 'test'@'localhost';

  • 删除 devdrop user 'dev'@'localhost';

image-20221212235744110

8.1.4.3 安全审计

本项要求包括:

a) 应启用安全审计功能,审计覆盖到每个用户,对重要的用户行为和重要安全事件进行审计;

  • 核查是否启用日志记录

b) 审计记录应包括事件的日期和时间、用户、事件类型、事件是否成功及其他与审计相关的信息;

c) 应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等;

  • 核查日志保存时间
  • 核查日志文件权限信息

d) 应对审计进程进行保护,防止未经授权的中断。

核查是否启用日志记录

核查方式
  • 查询所有日志相关信息:show variables like '%log%';

image-20221213094849716

加固方式
1) 开启常规日志审计功能
  • set global general_log=on;

image-20221213095710756

2) 开启错误日志审计功能
1
2
3
4
5
6
7
# 错误日志包括数据库运行和停止过程中的一系列活动信息,有助于分析数据库运行过程中的一些异常活动
# 一般情况下需要开启错误日志记录功能,使用如下命令查询:

SHOW variables LIKE 'log_error';

# 确保返回结果为非空,如果为空,需要在mysql数据库配置文件中增加相关配置
# >>> log_error D:\phpstudy_pro\Extensions\MySQL8.0.12\data.err
3) 确保日志存放在非系统区域
1
2
3
4
5
# 日志文件随着数据库的运行会不断增加,如果存放在系统区域,则会影响系统的正常运行,使用如下命令进行查询:

SELECT @@global.log_bin_basename;

# 确保返回结果不是如下路径:/、/var、/usr
4) 关闭原始日志功能

log-raw 记录启用时,有权访问日志文件的人可能会看到纯文本密码。

编辑 MySQL 配置文件 /etc/my.cnf ,删除 log-raw 参数,并重启 mysql 服务

上述与下面的操作好像有点冲突,以实际情况为准。待探索……

1
2
3
4
5
6
# 原始日志选项会决定一些敏感信息是否会被明文写进日志中,例如查询日志、慢查询日志、二进制日志
# 确保数据库配置文件中存在如下配置项:

log-raw = OFF

# 如无,配置并重启

核查日志保存时间

set global expire_logs_days=365

> 3683 - The option expire_logs_days and binlog_expire_logs_seconds cannot be used together. Please use binlog_expire_logs_seconds to set the expire time (expire_logs_days is deprecated)

核查方式
  • 查看日志时间(已废弃):show variables like '%logs_days%';
  • 查看日志时间:show variables like 'binlog_expire_logs_seconds';

image-20221213100143478

加固方式
  • set global binlog_expire_logs_seconds=2596096;

image-20221213100323167

核查日志文件权限信息

1) 控制二进制日志文件的权限
1
2
3
4
5
6
7
8
9
10
11
12
# mysql的运行会产生很多日志,例如二进制日志、错误日志、慢查询日志等等,Mysql命令行下执行如下命令:
show variables like 'log_bin_basename';

# 在终端命令行执行如下命令:
ls <log_bin_basename>.*
# 对于发现的每一个文件,执行如下命令:
ls -l <log_bin_basename.nnnnn> | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"
# 根据输出确认日志文件的权限设置是否存在问题。

# 对于每个日志文件,修改其权限和属组如下:
chmod 660 <log file>
chown mysql:mysql <log file>
2) 控制数据目录、基准目录的访问权限
1
2
3
4
5
6
7
8
9
10
11
# 数据目录是mysql数据库存放的位置,在mysql命令行界面下执行如下命令:
show variables where variable_name = 'datadir';

# 在终端命令行下执行如下命令:
ls -l <datadir>/.. | egrep "^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql"
# 其中<datadir>是第一条命令的执行结果

# 如果存在问题,linux环境下在终端执行如下命令进行加固:
chmod 700 <datadir> #仅MySQL数据库用户有读写权限
chown mysql:mysql <datadir>
# 同理控制基准目录权限 <basedir>,仅DBA和数据库用户可访问
3) 控制错误日志文件的权限
1
2
3
4
5
6
7
8
9
10
11
12
13
# 控制错误日志文件的权限
# Mysql命令行下执行如下命令:
show variables like 'log_error';

# 在终端命令行执行如下命令:
ls <log_error>.*
# 对于发现的每一个文件,执行如下命令:
ls -l <log_error> | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"
# 根据输出确认日志文件的权限设置是否存在问题。

# 对于每个日志文件,修改其权限和属组如下:
chmod 660 <log file>
chown mysql:mysql <log file>
4) 控制慢查询日志文件的权限

MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录MySQL中查询时间超过(大于)设置阈值(long_query_time)的语句,记录到慢查询日志中。

默认情况下,MySQL没有开启慢查询日志。需要手动打开,如果不是调优需要的话,不建议开启,因为开启会带来一定的性能影响,慢查询日志支持将日志记录写入文件。

1
2
# 开启慢查询日志,只对当前数据库生效,并且重启数据库后失效
set global slow_query_log = 1;

慢查询日志文件权限控制查看与设置:

1
2
3
4
5
6
7
8
9
10
11
12
# Mysql命令行下执行如下命令:
show variables like 'slow_query_log%';

# 在终端命令行执行如下命令:
ls <slow_query_log_file>.*
# 对于发现的每一个文件,执行如下命令:
ls -l <slow_query_log_file> | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"
# 根据输出确认日志文件的权限设置是否存在问题。

# 对于每个日志文件,修改其权限和属组如下:
chmod 660 <log file>
chown mysql:mysql <log file>
5) 控制通用日志文件的权限
1
2
3
4
5
6
7
8
9
10
11
12
# Mysql命令行下执行如下命令:
show variables like 'general_log_file';

# 在终端命令行执行如下命令:
ls <general_log_file>.*
# 对于发现的每一个文件,执行如下命令:
ls -l <general_log_file> | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"
# 根据输出确认日志文件的权限设置是否存在问题。

# 对于每个日志文件,修改其权限和属组如下:
chmod 660 <log file>
chown mysql:mysql <log file>
6) 控制审计日志文件的权限
Naming Conventions for Audit Log Files

To configure the audit log file name, set the audit_log_file system variable at server startup. The default name is audit.log in the server data directory. For best security, write the audit log to a directory accessible only to the MySQL server and to users with a legitimate reason to view the log.

[MySQL :: MySQL 8.0 Reference Manual :: 6.4.5.5 Configuring Audit Logging Characteristics](https://dev.mysql.com/doc/refman/8.0/en/audit-log-logging-configuration.html#:~:text=To configure the audit log file name%2C set,with a legitimate reason to view the log.)

1
2
3
4
5
6
7
8
9
10
# Mysql命令行下执行如下命令:
show global variables where variable_name = 'audit_log_file';

# 在终端执行如下命令:
ls -l <audit_log_file> | egrep "^-rw[-x]rw[-x][-r][-w][-x][ \t]*[0-9][ \t]*mysql[\t]*mysql.*$"
# 根据输出确认日志文件的权限设置是否存在问题。

# 对于每个日志文件,修改其权限和属组如下:
chmod 660 <audit_log_file>
chown mysql:mysql <audit_log_file>

8.1.4.4 入侵防范

本项要求包括:

a) 应遵循最小安装的原则,仅安装需要的组件和应用程序;

  • 核查测试数据库以及空账号

b) 应关闭不需要的系统服务、默认共享和高危端口;

c) 应通过设定终端接入方式或网络地址范围对通过网络进行管理的管理终端进行限制;

  • 核查是否限制源IP访问

d) 应提供数据有效性检验功能,保证通过人机接口输入或通过通信接口输入的内容符合系统设定要求;

e) 应能发现可能存在的已知漏洞,并在经过充分测试评估后,及时修补漏洞;

  • 核查是否及时打补丁

f) 应能够检测到对重要节点进行入侵的行为,并在发生严重入侵事件时提供报警。

核查测试数据库以及空账号

核查方式
  • 查询数据库:show DATABASES;
  • 使用该命令查询是否存在空账号:SELECT user,host FROM mysql.user WHERE user = '';

查询空用户名用户

查询数据库

加固方式

删除测试数据库以及空账号

1
2
3
4
5
# 删除冗余数据库, 如 test
drop database if exists ${dbname};

# 清除无用用户(没有用户名的用户)
drop user ''

image-20221213101612486

核查是否限制源IP访问

默认需要所有账号进行限制,不能存在 “% “ 任意源 IP 设置。

核查方式
  • SELECT user, host FROM mysql.user

image-20221213000354563

加固方式
  • 设置 ${账号} 指定源IP登录

    1
    2
    3
    4
    5
    # update user set host='${IP}' where user='root' and host='%';
    # 设置 root 用户只允许本地登录
    use mysql;
    update user set host='localhost' where user='root' and host='%';
    flush privileges;

image-20221213000524679

参考资料

安全标准

产品文档

博客文章

持久化全局变量

全局变量的持久化命令

1) SET PERSIST

  • 修改内存值,将全局变量的修改持久化到配置文件中
  • 只需要 SYSTEM_VARIABLES_ADMIN

2)SET PERSIST_ONLY

  • 只持久化全局变量,而不修改其内存值
  • 需要 SYSTEM_VARIABLES_ADMINPERSIST_RO_VARIABLES_ADMIN 权限

3)set persist max_connections=default;

  • 将全局变量持久化为默认值。注意,是默认值,而不是修改前的值。

  • 这个命令同 set global max_connections=default 类似,都会将变量的值设置为默认值,只不过前者还会将默认值持久化到配置文件中。

清除持久化变量命令

1)RESET PERSIST

  • 注意,其只是清空 mysqld-auto.cnfperformance_schema.persisted_variables 中的内容,对于已经修改了的变量的值,不会产生任何影响。

执行脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# 核查是否开启加密通信
show variables like 'have_openssl';
SHOW VARIABLES LIKE '%ssl%';

# 设置为0,即表示密码永不过期
SHOW VARIABLES LIKE '%default_password_lifetime%';
SET GLOBAL default_password_lifetime = 90;

show variables like 'validate%';
INSTALL PLUGIN validate_password SONAME 'validate_password.dll';
set global validate_password_length = 16;

show variables like '%connection_control%';
install plugin CONNECTION_CONTROL soname 'connection_control.dll';
install plugin CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS soname 'connection_control.dll';
SET GLOBAL connection_control_failed_connections_threshold = 5;
SET GLOBAL connection_control_min_connection_delay = 900000;

# 查看已安装插件
show plugins;

show global variables like '%timeout%';
set global connect_timeout = 43200;
set global wait_timeout=28800;
set global interactive_timeout=28800;

SELECT user, host FROM mysql.user;
create user 'dev'@'localhost' identified by 'Haiyisec@123';
create user 'test'@'localhost' identified by 'Haiyisec@123';
drop user 'test'@'localhost';
drop user 'dev'@'localhost';

# 设置只允许root用户本地登录
use mysql;
update user set host='localhost' where user='root' and host='%';
flush privileges;

# 重命名账号
update user set user='haiyi_root' where user='root' and host='localhost';
flush privileges;

SELECT user, host FROM mysql.user;

# 实验时出现问题,更新后无法登录,谨慎操作
UPDATE user SET authentication_string="123456" WHERE user="root";
FLUSH privileges;

show variables like '%log%';
show variables like 'slow_query_log%';
SHOW variables LIKE 'log_error';
SELECT @@global.log_bin_basename;
set global general_log=on;

set global binlog_expire_logs_seconds=2596096;
show variables like 'binlog_expire_logs_seconds';
show variables where variable_name = 'datadir';

SELECT user,host FROM mysql.user WHERE user = '';
CREATE DATABASE test;
DROP DATABASE if EXISTS test;
show DATABASES;

# 查看指定用户权限
SHOW GRANTS FOR 'root'@'localhost';
# 查看所有用户详细信息
SELECT * FROM mysql.user;
# 查看所有数据库详细
SELECT * FROM mysql.Db;

# 如下语句查询是否有用户不需要密码即可登录:
select * from mysql.user where length(authentication_string)=0 or authentication_string is null;