MySQL用戶賬戶分類的使用
MySQL 8.0.16 及以后版本 中引入的一項重要安全機制:用戶賬戶分類(Account Categories),通過 SYSTEM_USER 權限來區(qū)分 系統(tǒng)用戶(System User) 和 普通用戶(Regular User)。
下面我將用中文為你逐層解析、通俗易懂地解釋這段內容的核心思想和實際意義,幫助你真正“理解”它。
一、核心概念:什么是“系統(tǒng)用戶”和“普通用戶”?
從 MySQL 8.0.16 開始,MySQL 把用戶分為兩類:
| 類型 | 判斷標準 | 俗稱 |
|---|---|---|
| 系統(tǒng)用戶(System User) | 擁有 SYSTEM_USER 權限的用戶 | “高權限管理員” |
| 普通用戶(Regular User) | 沒有 SYSTEM_USER 權限的用戶 | “一般管理員或應用用戶” |
? 注意:SYSTEM_USER 是一個獨立的權限,它不賦予任何其他操作能力(比如建表、查數(shù)據(jù)),它的作用是控制誰能管理“系統(tǒng)級賬戶”。
二、為什么要分“系統(tǒng)用戶”和“普通用戶”?—— 安全隔離
問題背景:
在早期版本中,只要一個用戶有 CREATE USER 或 SUPER 權限,他就可以:
- 創(chuàng)建/刪除/修改任何用戶(包括 root)
- 終止任何會話(包括 DBA 的連接)
- 設置存儲過程的
DEFINER為 root
這就導致了一個嚴重問題:
?? 一個“普通管理員”可能誤刪 root 賬戶,或者被攻擊者利用提權,造成整個數(shù)據(jù)庫失控。
解決方案:
引入 SYSTEM_USER 權限作為“守門員”,實現(xiàn)權限的層級控制。
三、關鍵規(guī)則總結(重點?。?/h2>
? 規(guī)則 1:誰可以改誰?
| 操作者身份 | 能否修改“系統(tǒng)用戶”? | 能否修改“普通用戶”? |
|---|---|---|
| 系統(tǒng)用戶(有 SYSTEM_USER) | ? 可以(需其他權限配合) | ? 可以 |
| 普通用戶(無 SYSTEM_USER) | ? 不可以 | ? 可以 |
?? 舉例:
- 用戶 A 是普通用戶,擁有
CREATE USER權限 → 他只能創(chuàng)建/修改/刪除其他“普通用戶”,不能動 root。 - 用戶 B 是系統(tǒng)用戶,擁有
CREATE USER→ 他可以操作所有用戶,包括 root。
這就像公司里的“超級管理員”和“部門管理員”:
- 部門管理員可以管理本部門員工賬號;
- 但不能動 CEO 或總管理員的賬號;
- 只有超級管理員才能動 CEO 的賬號。
? 規(guī)則 2:哪些操作受SYSTEM_USER限制?
以下操作如果涉及“系統(tǒng)用戶”,執(zhí)行者必須自己也是“系統(tǒng)用戶”:
| 操作 | 說明 |
|---|---|
| 賬戶管理(CREATE USER, GRANT, ALTER USER, DROP USER) | 修改系統(tǒng)用戶的密碼、權限、認證方式等,必須由系統(tǒng)用戶操作 |
| 終止會話(KILL) | 你想 KILL 一個系統(tǒng)用戶的連接?你也得是系統(tǒng)用戶才行! |
| 設置 DEFINER | 如果你想讓一個存儲過程/視圖以“系統(tǒng)用戶”身份運行(DEFINER = 'root'@'localhost'),那你必須有 SYSTEM_USER 權限 |
| 設置 mandatory_roles | 不能把“系統(tǒng)用戶角色”設為強制角色(避免所有用戶自動獲得高權限) |
| 審計豁免(MySQL Enterprise Audit) | 從 8.0.28 起,系統(tǒng)用戶自動獲得 AUDIT_ABORT_EXEMPT,即使審計規(guī)則禁止某些查詢,系統(tǒng)用戶仍可執(zhí)行 —— 這是為了防止審計配置錯誤導致“完全無法登錄”的災難 |
四、“會話”也有系統(tǒng)/普通之分
不僅用戶分類型,當前連接的“會話”也分類型:
- 會話是否為“系統(tǒng)會話”,取決于:
- 當前用戶的賬號是否有
SYSTEM_USER - 或者當前激活的角色中是否有包含
SYSTEM_USER的角色
- 當前用戶的賬號是否有
會話可以動態(tài)變化!
-- 當前是普通會話 SET ROLE admin_role; -- 如果 admin_role 包含 SYSTEM_USER -- 現(xiàn)在變成了系統(tǒng)會話! -- 再取消角色 SET ROLE NONE; -- 又變回普通會話了
?? 注意:
- 權限變更(如
GRANT SYSTEM_USER TO user)只對新連接生效,不影響已存在的會話。 - 存儲過程執(zhí)行時,繼承的是調用它的會話類型,而不是 DEFINER 是否是系統(tǒng)用戶。
五、如何保護系統(tǒng)賬戶不被普通用戶篡改?(實戰(zhàn)建議)
僅僅不讓普通用戶有 SYSTEM_USER 權限還不夠!因為還有另一種方式可以改用戶信息:
?? 直接修改 mysql 系統(tǒng)數(shù)據(jù)庫中的表(如 mysql.user)!
所以,為了徹底保護系統(tǒng)賬戶,你需要雙重防護:
? 防護策略 1:禁止普通用戶操作mysql表
即使用戶有 ALL PRIVILEGES ON *.*,也可以通過 Partial Revoke(部分撤銷) 剝奪其對 mysql 庫的操作權。
示例:創(chuàng)建一個“全能但安全”的普通管理員 u1
-- 1. 創(chuàng)建用戶 CREATE USER u1 IDENTIFIED BY 'password'; -- 2. 授予全局所有權限(包含 SYSTEM_USER) GRANT ALL ON *.* TO u1 WITH GRANT OPTION; -- 3. 撤銷 SYSTEM_USER —— 讓 u1 成為普通用戶 REVOKE SYSTEM_USER ON *.* FROM u1; -- 4. 撤銷對 mysql 系統(tǒng)庫的所有修改權限 -- 防止他直接 INSERT/UPDATE mysql.user 來繞過限制 REVOKE ALL ON mysql.* FROM u1;
? 結果:
- u1 可以管理所有數(shù)據(jù)庫、所有普通用戶;
- 但不能修改系統(tǒng)用戶(如 root);
- 也不能直接改
mysql.user表來“偷渡”; - 完全安全!
更精細的權限控制示例:
示例 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)用戶” | 舊時代的萬能權限,幾乎無所不能 |
| 精細度 | 更細粒度,專用于賬戶管理隔離 | 太粗放,容易造成權限泛濫 |
| 推薦 | ? 推薦使用 | ?? 已標記為 deprecated,未來會被移除 |
??
SUPER正在被拆解成多個專用權限(如CONNECTION_ADMIN,SYSTEM_USER,SET_USER_ID等),這是 MySQL 權限體系現(xiàn)代化的一部分。
? Q2: root 用戶是系統(tǒng)用戶嗎?
? 是的!默認的 root@localhost 在 MySQL 8.0+ 中會被自動賦予 SYSTEM_USER 權限,屬于系統(tǒng)用戶。
? Q3: 我怎么查看某個用戶有沒有SYSTEM_USER權限?
-- 查看用戶權限 SHOW GRANTS FOR 'username'@'host'; -- 或查詢 mysql.user 表 SELECT User, Host, System_user FROM mysql.user WHERE User = 'root';
注意:字段名是 System_user(在 mysql.user 表中),值為 'Y' 或 'N'。
七、總結:一句話理解
?? SYSTEM_USER 權限是一個“守門員”,它決定了一個用戶是否有資格去管理和影響那些“更高權限的系統(tǒng)賬戶”(如 root),從而實現(xiàn)了權限的層級隔離,提升了數(shù)據(jù)庫的安全性。
??? 實際建議(給 DBA 的最佳實踐)
- 只給真正需要的 DBA 分配 SYSTEM_USER 權限
- 普通運維人員、應用管理員應設為“普通用戶”
- 使用 Partial Revoke 禁止普通用戶訪問 mysql 系統(tǒng)庫
- 避免使用 SUPER,改用細粒度權限(如 CONNECTION_ADMIN, SYSTEM_USER)
- 定期審計誰有 SYSTEM_USER 權限
如果你是數(shù)據(jù)庫管理員,這個機制就像是給你的“保險箱”加了一把鎖:
?? 普通員工可以處理日常事務,但動不了保險箱(root 賬號);
?? 只有拿著特定鑰匙(SYSTEM_USER)的人才能打開。
這樣,即使有人拿到管理員賬號,也無法輕易破壞核心系統(tǒng)。
如有具體場景(比如你想創(chuàng)建一個“受限管理員”),我可以幫你寫具體的 SQL 示例。
到此這篇關于MySQL用戶賬戶分類的使用的文章就介紹到這了,更多相關MySQL用戶賬戶分類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL中表復制:create table like 與 create table as select
這篇文章主要介紹了MySQL中表復制:create table like 與 create table as select,需要的朋友可以參考下2014-12-12
mysql如何動態(tài)創(chuàng)建連續(xù)時間段
這篇文章主要介紹了mysql如何動態(tài)創(chuàng)建連續(xù)時間段問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
MySQL中SELECT+UPDATE處理并發(fā)更新問題解決方案分享
這篇文章主要介紹了MySQL中SELECT+UPDATE處理并發(fā)更新問題解決方案分享,需要的朋友可以參考下2014-05-05

