普通用户无法KILL其他用户进程,因MySQL权限模型天然隔离:仅连接发起者自身或拥有CONNECTION_ADMIN(8.0+)/SUPER(旧版)权限者可终止他人连接;无特殊权限者执行KILL 123会报ERROR 1095。

MySQL 进程本身无法被普通用户 KILL,除非该用户拥有 SUPER 或 CONNECTION_ADMIN 权限 —— 但这是默认关闭的,所以绝大多数情况下你根本不需要额外“防止”。
为什么普通用户执行 KILL 会失败
MySQL 的权限模型天然隔离了进程控制权:
-
KILL操作受权限控制:只有发起该连接的用户自己,或拥有SUPER(5.7 及以前) /CONNECTION_ADMIN(8.0+)权限的用户才能终止其他连接 - 普通用户即使知道目标
Id,执行KILL 123也会报错:ERROR 1095 (HY000): You are not owner of thread 123 - 数据库层不依赖操作系统 UID 鉴权,
ps aux看到的进程属主(如mysql用户)和 SQL 层的KILL权限完全无关
KILL 权限实际由哪些权限位控制
MySQL 8.0+ 中,KILL 行为拆得更细,不再一股脑交给 SUPER:
-
CONNECTION_ADMIN:可终止任意连接(含其他用户) -
SYSTEM_USER:可查看所有连接(SHOW PROCESSLIST),但不能KILL - 无任何特殊权限的用户:只能
KILL自己的连接(即Id等于CONNECTION_ID()) - 检查当前用户权限:运行
SHOW GRANTS FOR CURRENT_USER;,确认输出中不含CONNECTION_ADMIN
真正要防的不是 KILL,而是误删、越权访问或提权路径
攻击者若已拿到数据库账号,更可能走这些路径而非尝试 KILL:
- 利用弱密码或匿名用户登录后执行恶意
SELECT ... INTO OUTFILE或LOAD DATA INFILE写入 Webshell - 通过
GRANT提权(如果用户有GRANT OPTION且未限制 host) - 若 MySQL 以
root身份运行(已被 8.0+ 明确禁止),再配合 UDF 或日志写入漏洞可提权到系统层 —— 这才是关键防线 - 验证是否真以非 root 运行:
ps -eo pid,user,comm | grep mysqld,确认主进程 UID 是mysql而非root
最小加固动作清单(三步封死常见入口)
别花时间锁 KILL,优先做这几件事:
- 确保
my.cnf中显式配置user = mysql,且/var/lib/mysql所有者是mysql:mysql;否则 8.0+ 直接拒绝启动 - 删除所有匿名用户:
DROP USER ''@'localhost'; DROP USER ''@'hostname'; - 禁用旧认证协议:
secure_auth = ON加入[mysqld]段,并确认default_authentication_plugin = caching_sha2_password
真正危险的从来不是某条 KILL 命令能不能执行,而是 MySQL 进程有没有以最低权限运行、账号有没有按需分配、网络暴露面有没有收窄 —— 这些点漏一个,KILL 权限压根不重要。











