MySQL授权语句明文传输风险在于密码和权限信息暴露于历史记录、进程列表、审计日志及网络抓包中;应禁用GRANT...IDENTIFIED BY,改用CREATE USER+ALTER USER,并避免明文密码写入命令行或配置文件。

MySQL授权语句明文传输风险在哪
直接在命令行或脚本里执行 GRANT 语句,比如 GRANT SELECT ON db.* TO 'user'@'%' IDENTIFIED BY 'pwd123';,密码和权限逻辑就全暴露在历史记录、进程列表、审计日志甚至网络抓包里。哪怕开了 SSL,mysql 客户端默认也不加密连接参数——ps aux | grep mysql 就能看见完整命令行。
- 用户密码、权限范围、主机白名单全部以明文形式出现在 shell 历史、
/proc/PID/cmdline、慢查询日志(如果开启log_slow_admin_statements)中 -
mysql -u root -p'pwd123' -e "GRANT ..."这种写法最危险:密码直接进命令行参数,系统级可见 - MySQL 8.0+ 的
mysql_native_password插件仍会把密码哈希前的原始值短暂留在内存,不等于“用了插件就安全”
用 CREATE USER + SET PASSWORD 替代 GRANT 中的 IDENTIFIED BY
MySQL 5.7 起已废弃 GRANT ... IDENTIFIED BY,8.0 彻底移除。硬写会报错:ERROR 1410 (42000): You are not allowed to create a user with GRANT。正确路径是分两步:先建用户,再设密,且密码必须走 SET PASSWORD 或 ALTER USER。
- 错误写法:
GRANT SELECT ON db.* TO 'u'@'%' IDENTIFIED BY 'p';(8.0 不支持) - 正确写法:
CREATE USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'p';,然后GRANT SELECT ON db.* TO 'u'@'%'; - 更安全写法:
CREATE USER 'u'@'%';+ALTER USER 'u'@'%' IDENTIFIED WITH caching_sha2_password BY 'p';(避免密码出现在建用户语句里) - 注意:
SET PASSWORD FOR 'u'@'%' = 'p';在 8.0+ 已被禁用,必须用ALTER USER ... IDENTIFIED BY
权限表本身不能加密,但可限制访问路径
MySQL 的权限信息存在 mysql.user、mysql.db 等系统表里,这些表是普通 InnoDB 表,不支持 TDE(透明数据加密),也无法对单个列加密。所谓“加密权限表”是伪命题——重点不是加密存储,而是切断非授权读取路径。
- 禁止普通账号查
mysql库:REVOKE SELECT ON mysql.* FROM 'app_user'@'%';(默认新用户没这权限,但老账号可能有) - 关闭
skip_show_database(默认开启),防止非特权用户看到mysql库名;但更关键的是确保SHOW DATABASES权限不滥发 - 不要给应用账号
PROCESS权限——否则能看SHOW PROCESSLIST,暴露出其他用户的连接密码(即使已哈希) - 定期检查:
SELECT user,host,authentication_string FROM mysql.user WHERE authentication_string != '';,确认无空密码或弱哈希
生产环境必须关掉 --defaults-file 的自动加载
很多运维习惯把账号密码写进 ~/.my.cnf,然后用 --defaults-file 指定加载。这看似方便,实则把密码固化到磁盘文件,且一旦文件权限失控(如误设为 644),任意同服务器用户都能读取。
- 错误配置:
[client] user=root password=123放在全局/etc/my.cnf或用户家目录下 - 正确做法:删掉所有含
password的配置段,改用mysql_config_editor加密存储:mysql_config_editor set --login-path=local --user=root --password,然后用mysql --login-path=local连接 -
mysql_config_editor生成的~/.mylogin.cnf默认权限是 600,且内容 AES 加密,比明文配置安全得多 - 注意:
--defaults-file优先级高于--login-path,若脚本里写了前者,加密凭据就完全失效
实际部署时,最常被忽略的是进程命令行泄露和 .my.cnf 文件权限。这两处没堵住,其他措施效果大打折扣。


















