在 MySQL 中,即使用户只有 SELECT 权限,仍然可以执行 SHOW PROCESSLIST 和 KILL 命令,那么如何彻底禁止用户执行 KILL?本文给大家详细介绍了MySQL彻底禁止用户执行KILL的解决方法,需要的朋友可以参考下
目录
1. SHOW PROCESSLIST 不需要特殊权限
2. KILL 命令的权限依赖
3. 为什么 SELECT 权限的用户可以 KILL?
如何彻底禁止用户执行 KILL?
方法 1:明确撤销 PROCESS 和 SUPER 权限
方法 2:限制 SHOW PROCESSLIST(可选)
方法 3:使用 MySQL 8.0+ 的细粒度权限
验证用户的权限
总结
在 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。
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 或角色权限)。