MySQL用戶賬戶分類的使用
MySQL 8.0.16 及以后版本 中引入的一項(xiàng)重要安全機(jī)制:用戶賬戶分類(Account Categories),通過 SYSTEM_USER 權(quán)限來區(qū)分 系統(tǒng)用戶(System User) 和 普通用戶(Regular User)。
下面我將用中文為你逐層解析、通俗易懂地解釋這段內(nèi)容的核心思想和實(shí)際意義,幫助你真正“理解”它。
一、核心概念:什么是“系統(tǒng)用戶”和“普通用戶”?
從 MySQL 8.0.16 開始,MySQL 把用戶分為兩類:
| 類型 | 判斷標(biāo)準(zhǔn) | 俗稱 |
|---|---|---|
| 系統(tǒng)用戶(System User) | 擁有 SYSTEM_USER 權(quán)限的用戶 | “高權(quán)限管理員” |
| 普通用戶(Regular User) | 沒有 SYSTEM_USER 權(quán)限的用戶 | “一般管理員或應(yīng)用用戶” |
? 注意:SYSTEM_USER 是一個(gè)獨(dú)立的權(quán)限,它不賦予任何其他操作能力(比如建表、查數(shù)據(jù)),它的作用是控制誰能管理“系統(tǒng)級賬戶”。
二、為什么要分“系統(tǒng)用戶”和“普通用戶”?—— 安全隔離
問題背景:
在早期版本中,只要一個(gè)用戶有 CREATE USER 或 SUPER 權(quán)限,他就可以:
- 創(chuàng)建/刪除/修改任何用戶(包括 root)
- 終止任何會(huì)話(包括 DBA 的連接)
- 設(shè)置存儲(chǔ)過程的
DEFINER為 root
這就導(dǎo)致了一個(gè)嚴(yán)重問題:
?? 一個(gè)“普通管理員”可能誤刪 root 賬戶,或者被攻擊者利用提權(quán),造成整個(gè)數(shù)據(jù)庫失控。
解決方案:
引入 SYSTEM_USER 權(quán)限作為“守門員”,實(shí)現(xiàn)權(quán)限的層級控制。
三、關(guān)鍵規(guī)則總結(jié)(重點(diǎn)?。?/h2>
? 規(guī)則 1:誰可以改誰?
| 操作者身份 | 能否修改“系統(tǒng)用戶”? | 能否修改“普通用戶”? |
|---|---|---|
| 系統(tǒng)用戶(有 SYSTEM_USER) | ? 可以(需其他權(quán)限配合) | ? 可以 |
| 普通用戶(無 SYSTEM_USER) | ? 不可以 | ? 可以 |
?? 舉例:
- 用戶 A 是普通用戶,擁有
CREATE USER權(quán)限 → 他只能創(chuàng)建/修改/刪除其他“普通用戶”,不能動(dòng) root。 - 用戶 B 是系統(tǒng)用戶,擁有
CREATE USER→ 他可以操作所有用戶,包括 root。
這就像公司里的“超級管理員”和“部門管理員”:
- 部門管理員可以管理本部門員工賬號;
- 但不能動(dòng) CEO 或總管理員的賬號;
- 只有超級管理員才能動(dòng) CEO 的賬號。
? 規(guī)則 2:哪些操作受SYSTEM_USER限制?
以下操作如果涉及“系統(tǒng)用戶”,執(zhí)行者必須自己也是“系統(tǒng)用戶”:
| 操作 | 說明 |
|---|---|
| 賬戶管理(CREATE USER, GRANT, ALTER USER, DROP USER) | 修改系統(tǒng)用戶的密碼、權(quán)限、認(rèn)證方式等,必須由系統(tǒng)用戶操作 |
| 終止會(huì)話(KILL) | 你想 KILL 一個(gè)系統(tǒng)用戶的連接?你也得是系統(tǒng)用戶才行! |
| 設(shè)置 DEFINER | 如果你想讓一個(gè)存儲(chǔ)過程/視圖以“系統(tǒng)用戶”身份運(yùn)行(DEFINER = 'root'@'localhost'),那你必須有 SYSTEM_USER 權(quán)限 |
| 設(shè)置 mandatory_roles | 不能把“系統(tǒng)用戶角色”設(shè)為強(qiáng)制角色(避免所有用戶自動(dòng)獲得高權(quán)限) |
| 審計(jì)豁免(MySQL Enterprise Audit) | 從 8.0.28 起,系統(tǒng)用戶自動(dòng)獲得 AUDIT_ABORT_EXEMPT,即使審計(jì)規(guī)則禁止某些查詢,系統(tǒng)用戶仍可執(zhí)行 —— 這是為了防止審計(jì)配置錯(cuò)誤導(dǎo)致“完全無法登錄”的災(zāi)難 |
四、“會(huì)話”也有系統(tǒng)/普通之分
不僅用戶分類型,當(dāng)前連接的“會(huì)話”也分類型:
- 會(huì)話是否為“系統(tǒng)會(huì)話”,取決于:
- 當(dāng)前用戶的賬號是否有
SYSTEM_USER - 或者當(dāng)前激活的角色中是否有包含
SYSTEM_USER的角色
- 當(dāng)前用戶的賬號是否有
會(huì)話可以動(dòng)態(tài)變化!
-- 當(dāng)前是普通會(huì)話 SET ROLE admin_role; -- 如果 admin_role 包含 SYSTEM_USER -- 現(xiàn)在變成了系統(tǒng)會(huì)話! -- 再取消角色 SET ROLE NONE; -- 又變回普通會(huì)話了
?? 注意:
- 權(quán)限變更(如
GRANT SYSTEM_USER TO user)只對新連接生效,不影響已存在的會(huì)話。 - 存儲(chǔ)過程執(zhí)行時(shí),繼承的是調(diào)用它的會(huì)話類型,而不是 DEFINER 是否是系統(tǒng)用戶。
五、如何保護(hù)系統(tǒng)賬戶不被普通用戶篡改?(實(shí)戰(zhàn)建議)
僅僅不讓普通用戶有 SYSTEM_USER 權(quán)限還不夠!因?yàn)檫€有另一種方式可以改用戶信息:
?? 直接修改 mysql 系統(tǒng)數(shù)據(jù)庫中的表(如 mysql.user)!
所以,為了徹底保護(hù)系統(tǒng)賬戶,你需要雙重防護(hù):
? 防護(hù)策略 1:禁止普通用戶操作mysql表
即使用戶有 ALL PRIVILEGES ON *.*,也可以通過 Partial Revoke(部分撤銷) 剝奪其對 mysql 庫的操作權(quán)。
示例:創(chuàng)建一個(gè)“全能但安全”的普通管理員 u1
-- 1. 創(chuàng)建用戶 CREATE USER u1 IDENTIFIED BY 'password'; -- 2. 授予全局所有權(quán)限(包含 SYSTEM_USER) GRANT ALL ON *.* TO u1 WITH GRANT OPTION; -- 3. 撤銷 SYSTEM_USER —— 讓 u1 成為普通用戶 REVOKE SYSTEM_USER ON *.* FROM u1; -- 4. 撤銷對 mysql 系統(tǒng)庫的所有修改權(quán)限 -- 防止他直接 INSERT/UPDATE mysql.user 來繞過限制 REVOKE ALL ON mysql.* FROM u1;
? 結(jié)果:
- u1 可以管理所有數(shù)據(jù)庫、所有普通用戶;
- 但不能修改系統(tǒng)用戶(如 root);
- 也不能直接改
mysql.user表來“偷渡”; - 完全安全!
更精細(xì)的權(quán)限控制示例:
示例 1:只允許讀mysql表(用于監(jiān)控)
CREATE USER monitor IDENTIFIED BY 'pass'; GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO monitor; REVOKE INSERT, UPDATE, DELETE ON mysql.* FROM monitor; -- monitor 可以讀 mysql.user、mysql.db 查用戶信息,但不能改
示例 2:只允許看特定字段
CREATE USER auditor IDENTIFIED BY 'pass'; GRANT ALL ON *.* TO auditor; REVOKE ALL ON mysql.* FROM auditor; GRANT SELECT ON mysql.db TO auditor; GRANT SELECT (Host, User) ON mysql.user TO auditor; -- 只能查看 user 表的 Host 和 User 字段
六、常見問題解答(FAQ)
? Q1:SYSTEM_USER和SUPER有什么區(qū)別?
| 特性 | SYSTEM_USER | SUPER(已棄用) |
|---|---|---|
| 功能 | 控制是否能操作“系統(tǒng)用戶” | 舊時(shí)代的萬能權(quán)限,幾乎無所不能 |
| 精細(xì)度 | 更細(xì)粒度,專用于賬戶管理隔離 | 太粗放,容易造成權(quán)限泛濫 |
| 推薦 | ? 推薦使用 | ?? 已標(biāo)記為 deprecated,未來會(huì)被移除 |
??
SUPER正在被拆解成多個(gè)專用權(quán)限(如CONNECTION_ADMIN,SYSTEM_USER,SET_USER_ID等),這是 MySQL 權(quán)限體系現(xiàn)代化的一部分。
? Q2: root 用戶是系統(tǒng)用戶嗎?
? 是的!默認(rèn)的 root@localhost 在 MySQL 8.0+ 中會(huì)被自動(dòng)賦予 SYSTEM_USER 權(quán)限,屬于系統(tǒng)用戶。
? Q3: 我怎么查看某個(gè)用戶有沒有SYSTEM_USER權(quán)限?
-- 查看用戶權(quán)限 SHOW GRANTS FOR 'username'@'host'; -- 或查詢 mysql.user 表 SELECT User, Host, System_user FROM mysql.user WHERE User = 'root';
注意:字段名是 System_user(在 mysql.user 表中),值為 'Y' 或 'N'。
七、總結(jié):一句話理解
?? SYSTEM_USER 權(quán)限是一個(gè)“守門員”,它決定了一個(gè)用戶是否有資格去管理和影響那些“更高權(quán)限的系統(tǒng)賬戶”(如 root),從而實(shí)現(xiàn)了權(quán)限的層級隔離,提升了數(shù)據(jù)庫的安全性。
??? 實(shí)際建議(給 DBA 的最佳實(shí)踐)
- 只給真正需要的 DBA 分配 SYSTEM_USER 權(quán)限
- 普通運(yùn)維人員、應(yīng)用管理員應(yīng)設(shè)為“普通用戶”
- 使用 Partial Revoke 禁止普通用戶訪問 mysql 系統(tǒng)庫
- 避免使用 SUPER,改用細(xì)粒度權(quán)限(如 CONNECTION_ADMIN, SYSTEM_USER)
- 定期審計(jì)誰有 SYSTEM_USER 權(quán)限
如果你是數(shù)據(jù)庫管理員,這個(gè)機(jī)制就像是給你的“保險(xiǎn)箱”加了一把鎖:
?? 普通員工可以處理日常事務(wù),但動(dòng)不了保險(xiǎn)箱(root 賬號);
?? 只有拿著特定鑰匙(SYSTEM_USER)的人才能打開。
這樣,即使有人拿到管理員賬號,也無法輕易破壞核心系統(tǒng)。
如有具體場景(比如你想創(chuàng)建一個(gè)“受限管理員”),我可以幫你寫具體的 SQL 示例。
到此這篇關(guān)于MySQL用戶賬戶分類的使用的文章就介紹到這了,更多相關(guān)MySQL用戶賬戶分類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ARM64架構(gòu)下安裝mysql5.7.22的全過程
這篇文章主要介紹了ARM64架構(gòu)下安裝mysql5.7.22的全過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
Xtrabackup使用指南 InnoDB數(shù)據(jù)備份工具
Xtrabackup是一個(gè)對InnoDB做數(shù)據(jù)備份的工具,支持在線熱備份(備份時(shí)不影響數(shù)據(jù)讀寫),是商業(yè)備份工具InnoDB Hotbackup的一個(gè)很好的替代品2011-10-10
mysql-8.0.15-winx64 使用zip包進(jìn)行安裝及服務(wù)啟動(dòng)后立即關(guān)閉問題
這篇文章主要介紹了mysql 使用zip包進(jìn)行安裝以及服務(wù)啟動(dòng)后立即關(guān)閉問題 ,本實(shí)例使用的mysql版本為mysql-8.0.15-winx64,需要的朋友可以參考下2019-05-05
遠(yuǎn)程連接mysql數(shù)據(jù)庫注意事項(xiàng)記錄(遠(yuǎn)程連接慢skip-name-resolve)
有時(shí)候我們需要遠(yuǎn)程連接mysql數(shù)據(jù)庫,就需要注意下面的問題,方便大家解決,腳本之家小編特為大家準(zhǔn)備了一些資料2012-07-07
PbootCMS的SQLite數(shù)據(jù)庫轉(zhuǎn)換為MySQL數(shù)據(jù)庫幾種方法步驟
隨著業(yè)務(wù)的發(fā)展,數(shù)據(jù)從一個(gè)系統(tǒng)遷移到另一個(gè)系統(tǒng)是一個(gè)常見的需求,這篇文章主要介紹了PbootCMS的SQLite數(shù)據(jù)庫轉(zhuǎn)換為MySQL數(shù)據(jù)庫幾種方法步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-02-02
關(guān)于mysql主備切換canal出現(xiàn)的問題解決
這篇文章主要給大家介紹了關(guān)于mysql主備切換canal出現(xiàn)的一些問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

