在 mysql 中,即使用户只有 select 权限,仍然可以执行 show processlist 和 kill 命令。原因如下:
1. show processlist 不需要特殊权限
- 默认情况下,任何用户都可以执行
show processlist,即使只有usage权限(最低权限)。 - 但如果 mysql 启用了
--skip-show-database启动选项,普通用户可能看不到不属于自己的进程。
2. kill 命令的权限依赖
kill命令的执行权限取决于process或super权限:- 如果用户有
process权限,可以kill自己的会话(即自己建立的连接)。 - 如果用户有
super权限,可以kill任意会话(包括其他用户的会话)。
- 如果用户有
- 即使只授予
select权限,某些情况下用户仍然可以kill自己的会话:- 在 mysql 5.7+,如果用户有
connection_admin(或super权限的替代),可能仍然可以kill会话。 - 在 mysql 8.0+,引入了更细粒度的权限控制,但默认情况下,某些操作仍然可能允许
kill。
- 在 mysql 5.7+,如果用户有
3. 为什么 select 权限的用户可以 kill?
- 可能的原因:
- 用户隐式拥有
process权限(检查mysql.user表确认)。 - mysql 的版本差异(某些版本默认允许
kill自己的会话)。 - 用户属于某个角色(mysql 8.0+),该角色可能授予了
process或kill权限。
- 用户隐式拥有
如何彻底禁止用户执行 kill?
方法 1:明确撤销 process 和 super 权限
revoke process, super on *.* from 'query'@'%'; flush privileges;
- 这样用户只能
show processlist,但无法kill任何会话(包括自己的)。
方法 2:限制 show processlist(可选)
如果希望用户完全看不到进程列表:
revoke process on *.* from 'query'@'%'; flush privileges;
- 这样
show processlist仅显示用户自己的会话(而不是所有会话)。
方法 3:使用 mysql 8.0+ 的细粒度权限
在 mysql 8.0+,可以更精确控制:
-- 禁止 kill 其他会话 revoke system_user, system_variables_admin, session_variables_admin on *.* from 'query'@'%'; -- 确保没有 process 权限 revoke process on *.* from 'query'@'%'; flush privileges;
验证用户的权限
-- 查看用户权限 show grants for 'query'@'%'; -- 检查 process 权限 select * from mysql.user where user='query'\g
- 如果
process_priv = 'y',说明用户有process权限,可以kill自己的会话。
总结
select权限本身不会允许kill,但process权限会。- 要禁止
kill,必须明确撤销process和super权限。 - mysql 8.0+ 提供了更细粒度的权限控制,可以更严格限制
kill操作。
如果你的 query 用户仍然可以 kill,请检查其完整权限(可能有隐藏的 process 或角色权限)。
以上就是mysql彻底禁止用户执行kill的解决方法的详细内容,更多关于mysql禁止用户执行kill的资料请关注代码网其它相关文章!
发表评论