Skip to main content

核查与访谈

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 '审计建议';