收回process权限后用户只能看到自己的连接且info为空,因该权限是全局性的,授予后可查看所有进程的完整sql,移除后mysql强制隔离,访问information_schema.processlist时info列返回null。

为什么收回 PROCESS 权限就能限制用户只看自己的进程
MySQL 默认让所有用户执行 SHOW PROCESSLIST 时只能看到自己发起的连接,前提是该用户**没有 PROCESS 权限**。一旦被授予 PROCESS ON *.*,就立刻能看见所有连接的完整 SQL(含明文参数),包括 SELECT * FROM users WHERE token = 'xxx' 这类敏感语句。这不是配置问题,而是权限模型的硬性设计:PROCESS 是全局权限,不支持按库、按表或按用户动态过滤。
如何安全收回 PROCESS 权限
用高权限账号(如 root)执行以下操作:
- 对每个 host 段单独收回:例如用户有
'app_user'@'localhost'和'app_user'@'10.20.30.%'两个账号,必须分别执行REVOKE PROCESS ON *.* FROM 'app_user'@'localhost'和REVOKE PROCESS ON *.* FROM 'app_user'@'10.20.30.%' - 收回后立即生效,无需
FLUSH PRIVILEGES;误加这句反而可能触发缓存异常 - 验证是否成功:用目标用户登录后执行
SHOW GRANTS FOR CURRENT_USER(),输出中不应再出现PROCESS ON *.*
收回后用户还能看到什么
权限移除后,用户执行 SHOW PROCESSLIST 仍能看到自己的连接行,但 Info 字段为空;访问 information_schema.PROCESSLIST 表时,对应行的 INFO 列固定返回 NULL。这不是 bug,是 MySQL 的强制隔离机制——你无法通过视图、子查询或存储过程绕过它。
监控脚本报错 ERROR 1227 怎么办
某些旧版监控工具或 ORM 初始化逻辑会默认调用 SHOW PROCESSLIST 获取连接数,收回权限后抛出 ERROR 1227 (42501): Access denied; you need (at least one of) the PROCESS privilege(s)。这不是安全漏洞,而是脚本过度依赖非必要权限。解决方式很直接:
- 改用
SHOW STATUS LIKE 'Threads_connected',它不需要 PROCESS 权限,且返回值与活跃连接数一致 - 如果必须查具体线程状态,可启用
performance_schema并查询performance_schema.threads表(字段带PROCESSLIST_前缀),它不要求互斥锁,性能更好,且同样受权限约束
真正容易被忽略的是:哪怕只给一个内网监控账号 PROCESS 权限,只要它能连上实例,就等于把实时 SQL 快照交了出去——这个权限不该出现在任何应用账号里,也不该用 % 泛授权。











