如何限制MySQL普通用户查看其他用户的进程列表信息?

直接收回PROCESS权限即可彻底阻断普通用户查看他人进程的能力,这是唯一可靠、即时生效、不影响业务读写的手段;因PROCESS是全局权限,仅支持ON .语法,写成库或表级会报错,且必须匹配原授权host并执行FLUSH PRIVILEGES后验证。

如何限制mysql普通用户查看其他用户的进程列表信息?

直接收回 PROCESS 权限即可彻底阻断普通用户查看他人进程的能力,这是唯一可靠、即时生效、不影响业务读写的手段。

为什么 REVOKE PROCESS ON *.* 是必须且唯一的操作

MySQL 的 PROCESS 权限是全局权限,不支持数据库或表级限定。只要用户拥有它,执行 SHOW PROCESSLIST 或查 information_schema.PROCESSLIST 就能看到所有连接的 UserHostInfo(含明文 SQL),哪怕只是 SELECT * FROM users WHERE token = 'abc123' 这类语句也会完整暴露。

  • 写成 REVOKE PROCESS ON mydb.* 会报错 ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
  • 只靠建用户时不给权限没用——MySQL 默认隐式授予 USAGE,而 PROCESS 可能残留
  • 必须显式执行 REVOKE PROCESS ON *.* FROM 'user'@'host',且范围要和当初 GRANT 完全一致(比如当初是 @'%',就不能只 revoke @'192.168.1.%'

收回后必须立刻 FLUSH PRIVILEGES 并验证

权限变更不会自动刷新,缓存未清则行为不变。验证不能只看 SHOW GRANTS,得实际切换用户测试:

  • 用目标用户登录后执行 SHOW PROCESSLIST:应只返回自己的一两行,Info 字段可见但仅限当前语句(前 100 字符),其他用户行完全不可见
  • information_schema.PROCESSLIST 会直接报错 ERROR 1227 (42501): Access denied
  • 检查底层字段是否真为 NSELECT User, Host, Process_priv FROM mysql.user WHERE User = 'user',确认 Process_priv 列值为 'N'

容易被绕过的间接路径必须同步封堵

即使 PROCESS 被收回,用户仍可能通过 performance_schema.threadssys.session 窥探——这些路径在 MySQL 8.0+ 中受同一权限控制,但默认不显式限制:

  • 必须额外执行:REVOKE SELECT ON performance_schema.* FROM 'user'@'host'
  • 同样执行:REVOKE SELECT ON sys.* FROM 'user'@'host'
  • 否则用户执行 SELECT PROCESSLIST_INFO FROM performance_schema.threads WHERE PROCESSLIST_USER = 'other' 仍可能拿到部分上下文(字段值为 NULL 是理想状态,但未 revoke 就可能非空)

监控账号常被忽略,这才是真实风险点

真正出问题的往往不是应用账号,而是内网部署的监控脚本所用的账号。它通常被误授 PROCESS 权限以便采集指标,一旦该账号凭证泄露或服务失陷,等于把整个实例的实时运行快照交了出去——SQL、IP、连接时长、状态全量暴露。这个权限不该出现在任何应用连接字符串里,也不该用 @'%' 泛授权。最小化不是建议,是强制底线。

文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/shoujipingce/127204.html

Nginx 非阻塞 IO 如何保障高并发环境下连接的及时响应
上一篇 2026-07-20 07:00
Go语言中利用bytes.Buffer预分配提升多段字符串写入效率
下一篇 2026-07-20 07:00

相关推荐