核查与访谈
MySQL 5.6 ~ MySQL 8.4 可核查的命令:
-- 核查插件形式的validate_password,从MySQL 5.7开始支持
select * from information_schema.plugins where plugin_name = 'validate_password';
-- 核查MySQL当前口令策略,默认策略符合要求。
show variables LIKE 'validate_password%';
-- 查看MySQL全局口令过期策略。
show variables like 'default_password_lifetime';
-- 查看MySQL 5.7最近口令更换情况。
select user, host, password_last_changed, password_lifetime from mysql.user;
-- 核查 interactive_timeout参数
show variables like '%timeout';
-- 查看指定用户名(如root)是否强制使用TLS传输
select user, host, ssl_type from mysql.user where user = 'root';
-- 查看是否全局开启强制TLS传输
show variables like 'require_secure_transport';
-- 查看MySQL是否已开启TLS传输
show variables like 'have_ssl';
-- 查看MySQL当前TLS相关配置信息
show global variables like 'ssl_cipher';
-- 查看当前会话是否采用TLS传输
show session status like 'ssl_cipher';
show session status LIKE 'Ssl_cipher_list';
show session status like 'ssl_version';
-- 查看MySQL当前支持的TLS版本
show variables like 'tls_version';
-- 查看用户授权情况
select Host,Account_locked,User,Insert_priv,Delete_priv,Alter_priv,Drop_priv,Grant_priv,Super_priv from mysql.user;
-- 查看用户与数据库间授权关联
SELECT * FROM `role_edges`;
SELECT * FROM `USER_PRIVILEGES`;
-- 查看日志开启情况
show variables like 'log%';
-- 查看当前已安装的插件
-- 查看当前用户@地址口令段加密后的信息和所采用的算法
select user, host, plugin, authentication_string from mysql.user;
-- 查看公钥路径(sha256_password)
SHOW VARIABLES LIKE 'sha256_password_public_key_path';
-- 查看私钥路径(sha256_password)
SHOW VARIABLES LIKE 'sha256_password_private_key_path';
-- 查看当前通信使用的公钥
show status like 'rsa_public_key';
MySQL 8.0 及后续版本支持的命令:~MySQL 8.4的命令:
-- MySQL 5.7及更低版本本命令行不适用。
select * from mysql.user where length(authentication_string) = 0 or authentication_string is null;
-- 核查模块形式的validate_password,从MySQL 8.0.2开始支持
select * from mysql.component;
-- 查看MySQL 8.0最近口令更换情况。(支持限制使用重复密码)
select user, host, password_last_changed, password_lifetime,password_expired,password_reuse_history,password_reuse_time from mysql.user;
-- 核查 MySQL 8.0登录失败锁定情况
select host,user,User_attributes from mysql.user;
-- 查看私钥路径(caching_sha2_password)
show variables like 'caching_sha2_password_private_key_path';
-- 查看公钥路径(caching_sha2_password)
show variables like 'caching_sha2_password_public_key_path';
-- 查看当前通信使用的公钥
show status like 'caching_sha2_password_rsa_public_key';
MySQL 9.0 ~MySQL 9.5的命令:
-- ============================================================
-- MySQL 9.0 安全审计与配置检查脚本
-- 兼容版本: MySQL 8.0+ / MySQL 9.0+
-- 创建日期: 2025-12-25
-- ============================================================
-- ========== 1. 密码验证策略检查 ==========
-- 1.1 核查密码验证组件(MySQL 8.0+ 从插件改为组件)
-- 注意:MySQL 8.0+ 使用 component_validate_password 组件替代旧的插件
SELECT * FROM mysql.component
WHERE component_urn = 'file://component_validate_password';
-- 如果组件未安装,可使用以下命令安装:
-- INSTALL COMPONENT 'file://component_validate_password';
-- 1.2 核查MySQL当前口令策略(MySQL 8.0+ 变量名改为带点号格式)
SHOW VARIABLES LIKE 'validate_password.%';
-- 常见密码策略变量说明:
-- validate_password.length - 密码最小长度(默认8)
-- validate_password.policy - 策略等级(LOW/MEDIUM/STRONG)
-- validate_password.mixed_case_count - 大小写字母最小数量
-- validate_password.number_count - 数字最小数量
-- validate_password.special_char_count - 特殊字符最小数量
-- validate_password.dictionary_file - 字典文件路径
-- 1.3 查看MySQL全局口令过期策略
SHOW VARIABLES LIKE 'default_password_lifetime';
-- 说明:单位为天,0表示永不过期,建议设置为90-180天
-- 1.4 查看所有用户的密码更换情况和过期策略
SELECT user, host,
password_last_changed AS '最后修改时间',
password_lifetime AS '密码有效期(天)',
CASE
WHEN password_lifetime IS NULL THEN '使用全局策略'
WHEN password_lifetime = 0 THEN '永不过期'
ELSE CONCAT(password_lifetime, '天')
END AS '过期策略说明'
FROM mysql.user
ORDER BY user, host;
-- ========== 2. 连接超时与会话检查 ==========
-- 2.1 核查所有超时相关参数
SHOW VARIABLES LIKE '%timeout';
-- 重点关注:
-- interactive_timeout - 交互式连接超时(默认28800秒/8小时)
-- wait_timeout - 非交互式连接超时
-- connect_timeout - 连接握手超时
-- ========== 3. TLS/SSL 加密传输检查 ==========
-- 3.1 查看指定用户(如root)是否强制使用TLS传输
SELECT user, host, ssl_type,
CASE ssl_type
WHEN '' THEN '不要求TLS'
WHEN 'ANY' THEN '要求TLS(任意加密)'
WHEN 'X509' THEN '要求X509证书'
WHEN 'SPECIFIED' THEN '要求指定证书'
END AS 'TLS要求说明'
FROM mysql.user
WHERE user = 'root';
-- 3.2 查看所有用户的TLS配置
SELECT user, host, ssl_type
FROM mysql.user
WHERE ssl_type != ''
ORDER BY user, host;
-- 3.3 查看是否全局开启强制TLS传输
SHOW VARIABLES LIKE 'require_secure_transport';
-- 说明:ON表示所有连接必须使用TLS,OFF表示可选
-- 3.4 查看MySQL是否已开启TLS传输能力
SHOW VARIABLES LIKE 'have_ssl';
-- 说明:YES表示已启用,DISABLED表示未启用
-- 3.5 查看MySQL当前TLS相关配置信息
SHOW GLOBAL VARIABLES LIKE 'ssl_%';
-- 重点关注:
-- ssl_ca - CA证书路径
-- ssl_cert - 服务器证书路径
-- ssl_key - 服务器私钥路径
-- ssl_cipher - 允许的加密套件
-- 3.6 查看当前会话是否采用TLS传输
SHOW SESSION STATUS LIKE 'ssl_cipher';
SHOW SESSION STATUS LIKE 'Ssl_cipher_list';
SHOW SESSION STATUS LIKE 'ssl_version';
-- 说明:如果ssl_cipher为空,表示当前会话未使用TLS
-- 3.7 查看MySQL当前支持的TLS版本
SHOW VARIABLES LIKE 'tls_version';
-- 建议:至少支持 TLSv1.2, TLSv1.3,禁用TLSv1和TLSv1.1
-- ========== 4. 用户权限与授权检查 ==========
-- 4.1 查看所有用户的基本权限(MySQL 9.0 兼容写法)
SELECT Host, User, Account_locked AS '账户锁定',
Insert_priv AS '插入',
Delete_priv AS '删除',
Alter_priv AS '修改',
Drop_priv AS '删除表',
Grant_priv AS '授权',
Super_priv AS '超级权限',
Create_role_priv AS '创建角色',
Drop_role_priv AS '删除角色'
FROM mysql.user
ORDER BY User, Host;
-- 注意:Super_priv 在 MySQL 8.0+ 逐步被动态权限替代
-- 4.2 查看用户与角色的关联关系
SELECT FROM_HOST AS '来源主机',
FROM_USER AS '来源用户',
TO_HOST AS '目标主机',
TO_USER AS '目标用户',
WITH_ADMIN_OPTION AS '可再授权'
FROM mysql.role_edges
ORDER BY FROM_USER, TO_USER;
-- 4.3 查看所有用户的全局权限
SELECT GRANTEE AS '授权对象',
PRIVILEGE_TYPE AS '权限类型',
IS_GRANTABLE AS '可授权'
FROM information_schema.USER_PRIVILEGES
ORDER BY GRANTEE, PRIVILEGE_TYPE;
-- 4.4 查看数据库级别的权限
SELECT Host, User, Db AS '数据库',
Select_priv, Insert_priv, Update_priv, Delete_priv,
Create_priv, Drop_priv, Grant_priv
FROM mysql.db
ORDER BY Db, User;
-- ========== 5. 日志审计检查 ==========
-- 5.1 查看所有日志相关配置
SHOW VARIABLES LIKE 'log%';
-- 重点关注:
-- log_error - 错误日志路径
-- general_log - 通用查询日志(性能影响大,生产环境慎用)
-- slow_query_log - 慢查询日志
-- log_bin - 二进制日志(主从复制必需)
-- log_bin_trust_function_creators - 二进制日志函数创建权限
-- 5.2 查看审计日志插件状态(如果安装了审计插件)
SELECT PLUGIN_NAME, PLUGIN_STATUS, PLUGIN_TYPE, PLUGIN_LIBRARY
FROM information_schema.PLUGINS
WHERE PLUGIN_NAME LIKE '%audit%';
-- ========== 6. 用户认证与加密检查 ==========
-- 6.1 查看所有用户的认证插件和加密信息
SELECT user, host,
plugin AS '认证插件',
CASE plugin
WHEN 'mysql_native_password' THEN 'MySQL 5.7 原生认证'
WHEN 'caching_sha2_password' THEN 'MySQL 8.0+ 缓存SHA2认证(推荐)'
WHEN 'sha256_password' THEN 'SHA256认证'
WHEN 'auth_socket' THEN 'Socket认证(仅本地)'
ELSE plugin
END AS '认证方式说明',
CHAR_LENGTH(authentication_string) AS '密文长度'
FROM mysql.user
ORDER BY user, host;
-- 建议:MySQL 9.0 推荐使用 caching_sha2_password
-- 6.2 查看 sha256_password 公钥路径
SHOW VARIABLES LIKE 'sha256_password_public_key_path';
-- 6.3 查看 sha256_password 私钥路径
SHOW VARIABLES LIKE 'sha256_password_private_key_path';
-- 6.4 查看当前通信使用的RSA公钥
SHOW STATUS LIKE 'rsa_public_key';
-- ========== 7. 组件与插件检查(MySQL 8.0+/9.0 推荐) ==========
-- 7.1 查看所有已安装的组件(MySQL 8.0+ 新特性)
SELECT component_id, component_group_id, component_urn
FROM mysql.component
ORDER BY component_id;
-- 7.2 使用 SHOW COMPONENTS 命令(MySQL 8.0.17+)
SELECT component_id AS '组件ID',
component_group_id AS '组件组ID',
component_urn AS '组件URN'
FROM mysql.component
ORDER BY component_id;
-- 7.3 查看所有已安装的插件
SELECT PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_STATUS, PLUGIN_TYPE, PLUGIN_LIBRARY
FROM information_schema.PLUGINS
WHERE PLUGIN_STATUS = 'ACTIVE'
ORDER BY PLUGIN_TYPE, PLUGIN_NAME;
-- ========== 8. 动态权限检查(MySQL 8.0+/9.0 新特性) ==========
-- 8.1 查看所有动态权限(替代部分Super_priv功能)
SELECT USER AS '用户', HOST AS '主机', PRIV AS '动态权限'
FROM mysql.global_grants
ORDER BY USER, HOST, PRIV;
-- 常见动态权限:
-- ROLE_ADMIN - 角色管理
-- BINLOG_ADMIN - 二进制日志管理
-- CONNECTION_ADMIN - 连接管理
-- REPLICATION_SLAVE_ADMIN - 复制从库管理
-- SYSTEM_VARIABLES_ADMIN - 系统变量管理
-- BACKUP_ADMIN - 备份管理
-- ========== 9. 安全相关系统变量检查 ==========
SHOW VARIABLES WHERE Variable_name IN (
'local_infile', -- 禁止加载本地文件(安全风险)
'secure_file_priv', -- 限制文件导入导出路径
'skip_name_resolve', -- 跳过DNS解析(提升性能和安全)
'sql_mode', -- SQL模式
'max_connect_errors', -- 最大连接错误次数
'max_connections', -- 最大连接数
'max_user_connections' -- 单用户最大连接数
);
-- ========== 10. 空密码和弱密码用户检查 ==========
-- 10.1 检查空密码用户(严重安全隐患)
SELECT user, host, '!!!空密码账户!!!' AS '安全风险'
FROM mysql.user
WHERE authentication_string = '' OR authentication_string IS NULL;
-- 10.2 检查通配符主机用户(安全风险)
SELECT user, host, '允许任意主机连接' AS '安全风险'
FROM mysql.user
WHERE host = '%'
ORDER BY user;
-- ============================================================
-- 脚本执行完毕
-- ============================================================
SELECT '
============================================================
MySQL 9.0 安全审计检查完成!
建议操作:
1. 确保 caching_sha2_password 组件已安装
2. 所有用户密码长度应 >= 8 位,包含大小写字母、数字和特殊字符
3. 启用密码过期策略(建议90-180天)
4. 生产环境强制启用 TLS/SSL 传输
5. 移除空密码账户和不必要的通配符主机授权
6. 定期审计用户权限,遵循最小权限原则
7. 启用慢查询日志和错误日志
8. 禁用 local_infile,设置 secure_file_priv
9. 使用角色管理权限,避免直接授予过高权限
10. MySQL 9.0 推荐使用动态权限替代 Super_priv
============================================================
' AS '审计建议';