MySQL彻底禁止用户执行KILL的解决方法

 更新时间:2025年05月22日 08:30:53   作者:学亮编程手记  
在 MySQL 中,即使用户只有 SELECT 权限,仍然可以执行 SHOW PROCESSLIST 和 KILL 命令,那么如何彻底禁止用户执行 KILL?本文给大家详细介绍了MySQL彻底禁止用户执行KILL的解决方法,需要的朋友可以参考下

在 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?

  • 可能的原因
    1. 用户隐式拥有 PROCESS 权限(检查 mysql.user 表确认)。
    2. MySQL 的版本差异(某些版本默认允许 KILL 自己的会话)。
    3. 用户属于某个角色(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的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL性能优化之Open_Table配置参数的合理配置建议

    MySQL性能优化之Open_Table配置参数的合理配置建议

    这篇文章主要介绍了MySQL性能优化之Open_Table配置参数的合理配置建议,在MySQL数据库中,Opened_tables表示打开过的表数量,需要的朋友可以参考下
    2014-07-07
  • MySql 空间索引的实现

    MySql 空间索引的实现

    MySQL空间索引是一种用于优化地理空间数据查询的数据结构,通过为几何数据类型创建空间索引,可以高效地对空间数据进行查询和操作,感兴趣的可以了解一下
    2024-11-11
  • mysql数据库分表分库的策略

    mysql数据库分表分库的策略

    这篇文章主要介绍了mysql数据库分表分库的策略希望我们的整理能给你提供到帮助。
    2017-11-11
  • ERROR 1862 (HY000): Your password has expired. To log in you must change it using a .....

    ERROR 1862 (HY000): Your password has expired. To log in you

    当你在安装 MySQL过程中,通过mysqld --initialize 初始化 mysql 操作后,生成临时密码后,没有直接进行 MySQL连接,中途重启服务或者重启机器等,导致密码失效问题,怎么处理呢,感兴趣的朋友一起看看吧
    2019-11-11
  • MySQL两种删除用户语句的区别(delete user和drop user)

    MySQL两种删除用户语句的区别(delete user和drop user)

    这篇文章主要介绍了MySQL两种删除用户语句的区别(delete user和drop user),帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-11-11
  • 想取消错误的mysql命令怎么办?

    想取消错误的mysql命令怎么办?

    今天小编就为大家分享一篇关于想取消错误的mysql命令怎么办?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • MySQL约束超详解

    MySQL约束超详解

    这篇文章主要介绍了MySQL约束包括非空约束、唯一约束、主键约束、外键约束,需要的朋友可以具体参考下面文章内容
    2021-09-09
  • 记一次mysql字符串末尾空白丢失的排查

    记一次mysql字符串末尾空白丢失的排查

    这篇文章主要介绍了记一次mysql字符串末尾空白丢失的排查的相关资料,需要的朋友可以参考下
    2023-06-06
  • MSQL中DATETIME或TIMESTAMP的区别小结

    MSQL中DATETIME或TIMESTAMP的区别小结

    MySQL中的 DATETIME 和 TIMESTAMP 类型都用于存储日期和时间信息,本文主要介绍了MSQL中DATETIME或TIMESTAMP的区别小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Mysql的timeout以及python重连方式

    Mysql的timeout以及python重连方式

    这篇文章主要介绍了Mysql的timeout以及python重连方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论