MySQL徹底禁止用戶執(zhí)行KILL的解決方法
在 MySQL 中,即使用戶只有 SELECT
權(quán)限,仍然可以執(zhí)行 SHOW PROCESSLIST
和 KILL
命令。原因如下:
1. SHOW PROCESSLIST 不需要特殊權(quán)限
- 默認(rèn)情況下,任何用戶都可以執(zhí)行
SHOW PROCESSLIST
,即使只有USAGE
權(quán)限(最低權(quán)限)。 - 但如果 MySQL 啟用了
--skip-show-database
啟動(dòng)選項(xiàng),普通用戶可能看不到不屬于自己的進(jìn)程。
2. KILL 命令的權(quán)限依賴
KILL
命令的執(zhí)行權(quán)限取決于PROCESS
或SUPER
權(quán)限:- 如果用戶有
PROCESS
權(quán)限,可以KILL
自己的會(huì)話(即自己建立的連接)。 - 如果用戶有
SUPER
權(quán)限,可以KILL
任意會(huì)話(包括其他用戶的會(huì)話)。
- 如果用戶有
- 即使只授予
SELECT
權(quán)限,某些情況下用戶仍然可以KILL
自己的會(huì)話:- 在 MySQL 5.7+,如果用戶有
CONNECTION_ADMIN
(或SUPER
權(quán)限的替代),可能仍然可以KILL
會(huì)話。 - 在 MySQL 8.0+,引入了更細(xì)粒度的權(quán)限控制,但默認(rèn)情況下,某些操作仍然可能允許
KILL
。
- 在 MySQL 5.7+,如果用戶有
3. 為什么 SELECT 權(quán)限的用戶可以 KILL?
- 可能的原因:
- 用戶隱式擁有
PROCESS
權(quán)限(檢查mysql.user
表確認(rèn))。 - MySQL 的版本差異(某些版本默認(rèn)允許
KILL
自己的會(huì)話)。 - 用戶屬于某個(gè)角色(MySQL 8.0+),該角色可能授予了
PROCESS
或KILL
權(quán)限。
- 用戶隱式擁有
如何徹底禁止用戶執(zhí)行 KILL?
方法 1:明確撤銷 PROCESS 和 SUPER 權(quán)限
REVOKE PROCESS, SUPER ON *.* FROM 'query'@'%'; FLUSH PRIVILEGES;
- 這樣用戶只能
SHOW PROCESSLIST
,但無法KILL
任何會(huì)話(包括自己的)。
方法 2:限制 SHOW PROCESSLIST(可選)
如果希望用戶完全看不到進(jìn)程列表:
REVOKE PROCESS ON *.* FROM 'query'@'%'; FLUSH PRIVILEGES;
- 這樣
SHOW PROCESSLIST
僅顯示用戶自己的會(huì)話(而不是所有會(huì)話)。
方法 3:使用 MySQL 8.0+ 的細(xì)粒度權(quán)限
在 MySQL 8.0+,可以更精確控制:
-- 禁止 KILL 其他會(huì)話 REVOKE SYSTEM_USER, SYSTEM_VARIABLES_ADMIN, SESSION_VARIABLES_ADMIN ON *.* FROM 'query'@'%'; -- 確保沒有 PROCESS 權(quán)限 REVOKE PROCESS ON *.* FROM 'query'@'%'; FLUSH PRIVILEGES;
驗(yàn)證用戶的權(quán)限
-- 查看用戶權(quán)限 SHOW GRANTS FOR 'query'@'%'; -- 檢查 PROCESS 權(quán)限 SELECT * FROM mysql.user WHERE user='query'\G
- 如果
Process_priv = 'Y'
,說明用戶有PROCESS
權(quán)限,可以KILL
自己的會(huì)話。
總結(jié)
SELECT
權(quán)限本身不會(huì)允許KILL
,但PROCESS
權(quán)限會(huì)。- 要禁止
KILL
,必須明確撤銷PROCESS
和SUPER
權(quán)限。 - MySQL 8.0+ 提供了更細(xì)粒度的權(quán)限控制,可以更嚴(yán)格限制
KILL
操作。
如果你的 query
用戶仍然可以 KILL
,請(qǐng)檢查其完整權(quán)限(可能有隱藏的 PROCESS
或角色權(quán)限)。
以上就是MySQL徹底禁止用戶執(zhí)行KILL的解決方法的詳細(xì)內(nèi)容,更多關(guān)于MySQL禁止用戶執(zhí)行KILL的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL性能優(yōu)化之Open_Table配置參數(shù)的合理配置建議
這篇文章主要介紹了MySQL性能優(yōu)化之Open_Table配置參數(shù)的合理配置建議,在MySQL數(shù)據(jù)庫(kù)中,Opened_tables表示打開過的表數(shù)量,需要的朋友可以參考下2014-07-07mysql數(shù)據(jù)庫(kù)分表分庫(kù)的策略
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)分表分庫(kù)的策略希望我們的整理能給你提供到幫助。2017-11-11ERROR 1862 (HY000): Your password has expired. To log in you
當(dāng)你在安裝 MySQL過程中,通過mysqld --initialize 初始化 mysql 操作后,生成臨時(shí)密碼后,沒有直接進(jìn)行 MySQL連接,中途重啟服務(wù)或者重啟機(jī)器等,導(dǎo)致密碼失效問題,怎么處理呢,感興趣的朋友一起看看吧2019-11-11MySQL兩種刪除用戶語(yǔ)句的區(qū)別(delete user和drop user)
這篇文章主要介紹了MySQL兩種刪除用戶語(yǔ)句的區(qū)別(delete user和drop user),幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-11-11MSQL中DATETIME或TIMESTAMP的區(qū)別小結(jié)
MySQL中的?DATETIME?和?TIMESTAMP?類型都用于存儲(chǔ)日期和時(shí)間信息,本文主要介紹了MSQL中DATETIME或TIMESTAMP的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03