在 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的资料请关注代码网其它相关文章!
发表评论