MySQL8.0賬戶system_user許可權,你瞭解嗎?
公眾號:DBA隨筆
MySQL8.0賬戶system_user許可權,你瞭解嗎?
01
MySQL system_user許可權介紹
MySQL從8.0.16版本開始,MySQL利用system_user許可權來區分普通使用者和系統使用者。具體表現是:
1、擁有system_user許可權的賬號,是系統賬號
2、沒有system_user許可權的賬號,是普通賬號
系統賬號可以修改系統賬號自身和普通賬號;
普通賬號只能修改普通賬號自身。
system_user許可權的影響範圍:
1、賬號管理方面
具有system_user許可權的系統賬號,可以對普通賬號和其他系統賬號進行管理,
包含賬號的建立、刪除、修改,許可權的授予和回收,密碼修改,或者密碼屬性修改等(例如修改密碼過期時間);
2、kill會話方面
a、kill一個具有system_user許可權的賬號A持有的會話,你自身執行kill命令的賬號B也必須有system_user許可權;
b、從MySQL8.0.30開始,
如果賬號A將MySQL server置為下線模式(引數offline-mode控制), 除非賬號B擁有connection_admin許可權或者super許可權, 否則賬號B無法建立新的連線,但是賬號B老的連線不會被打斷。
c、MySQL8.0.16 之前,如果一個使用者擁有connection_admin許可權或者super許可權,則它可以kill任何正在執行的會話和語句。
3、修改儲存過程、事件或者檢視的定義
想要修改某個儲存過程的定義使用者,如果原來的賬號A擁有system_user許可權,那麼修改的賬號也需要擁有system_user許可權。
4、定義強制角色(mandatory role)
首先,我們簡單解釋下強制角色的概念,mandatory role,它是MySQL8.0裡面的一個配置,可以通過下面的語句檢視:
show variables like '%manda%'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | mandatory_roles | | +-----------------+-------+ 1 row in set (0.00 sec)
這個引數裡面可以寫入一些定義好的角色, 對於任意一個定義的使用者,這些角色都會被強加在這個使用者上 。一個常見的用法是:
SET mandatory_roles = '`role1`@`%`,`role2`,role3,role4@localhost';
瞭解了強制角色概念之後,說回到system_user許可權,在 MySQL8.0.16版本以後,如果一個角色role有system_user許可權,那麼它不能被放在強制角色列表中,而之前,任何角色role都可以放在這個列表中 。
5、審計方面的影響。
這個特點很少使用,這裡我不做贅述了。有興趣可以檢視官網。
02
具體案例分析
1、 system_user許可權對賬號安全性的影響
MySQL5.7版本下:
一、
利用root使用者登入,建立root和test 2個賬號,
其中,test賬號只有create user許可權
create user root@'10.%' ;
grant all privileges on *.* to root@'10.%';
create user test@'%';
grant create user on *.* to test@'%';
二、
再次利用test賬號登入,並刪除root@''賬號:
drop user root@'10.%' ;
Query OK, 0 rows affected (0.00 sec)
執行成功
MySQL 8.0 版本下:
一、
利用root使用者登入,建立root和test 2個賬號,
其中,test賬號只有create user許可權
create user root@'10.%' ;
grant all privileges on *.* to root@'10.%';
create user test@'%';
grant create user on *.* to test@'%';
二、
再次利用test賬號登入,並刪除root@''賬號:
drop user root@'10.%' ;
ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation
執行失敗!!!
上述例子中不難看出:
MySQL5.7版本下,只要一個賬號有create user許可權,就可以對其他賬號進行刪除操作,甚至root賬號它都可以刪除,也就是說普通賬號可以刪除root這種高許可權的系統賬號;
MySQL8.0版本下,一個賬號A有create user許可權,無法對擁有system_user許可權的root賬號進行刪除。
A賬號還需要擁有system_user許可權,才可以對root賬號進行刪除,因為root使用者本身擁有system_user許可權,也是一個系統賬號,只有系統賬號才能作業系統賬號
2、system_user許可權,對賬號密碼的修改
看下面MySQL8.0.22版本下的例子,讓我們對system_user許可權更加理解 :
create user a,b,c,d; grant create user on *.* to a; grant system_user on *.* to b; grant create user,system_user on *.* to c; grant all on *.* to d; 1、用 a 使用者登入,去改 c 使用者的密碼,提示需要SYSTEM_USER 許可權 alter user c identified by 'c'; ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation 理由:a使用者是一個普通使用者,無法修改具有system_user許可權的系統使用者 2、用 b 使用者登入,去改 c 使用者的密碼,提示需要CREATE USER 許可權 alter user c identified by 'c'; ERROR 1227 (42000): Access denied; you need (at least one of) the CREATE USER privilege(s) for this operation 理由:b使用者是一個系統使用者,但是由於缺少create user許可權,所以不能修改系統使用者c的密碼 3、用 c 使用者登入,去改 c 使用者的密碼,修改成功 alter user c identified by 'c'; Query OK, 0 rows affected (0.01 sec) 理由:c使用者是一個系統使用者,本身有create user和system_user的許可權,所以修改自己也能成功 4、用 c 使用者登入,去改 d 使用者的密碼,修改成功(d使用者有all的許可權) alter user d identified by 'd'; Query OK, 0 rows affected (0.01 sec) 理由:c使用者是一個系統使用者,本身有create user和system_user的許可權,所以可以修改其他任意的系統賬號
可以看到:
普通賬號想要修改系統賬號的密碼,必須將普通賬號變成系統賬號,也就是新增system_user的許可權 。
0 3
總結
從MySQL8.0版本開始,系統賬號和普通賬號之間有了鴻溝,具體表現在:
1、擁有system_user許可權的賬號,是系統賬號
2、沒有system_user許可權的賬號,是普通賬號
3、在擁有create user許可權的情況下,系統賬號可以修改其他系統賬號和所有普通賬號;
4、在擁有create user許可權的情況下,普通賬號只能修改其他普通賬號。
PS:這裡還有一個細節。
如果一個賬號本身沒有system_user的許可權,但是被賦予了一個角色,這個角色擁有system_user許可權,那麼相當於這個賬號也就擁有了system_user許可權。也就變成了一個系統賬號 。
更多更詳細的內容,可以參考官方文件:
http://dev.mysql.com/doc/refman/8.0/en/account-categories.html
往期回顧
# DBA #
- 技術分享 | orchestrator--運維--配置叢集自動切換&測試
- AIOPS的莫拉維克悖論
- 詳談 MySQL 8.0 原子 DDL 原理
- 為什麼不建議用 from xxx import *
- 最近解決的兩個拖延數年的問題
- Oracle資料庫解決方案集錦
- 新一代雲原生資料庫暢想
- MySQL8.0賬戶system_user許可權,你瞭解嗎?
- Data Fabric,下一個風口?
- 帶著孩子做開學準備清單
- 十多年前的入職第一天
- 技術分享 | MySQL 編寫指令碼時避免煩人的警告
- GoldenGate案例一則:抽取程序無法捕獲資料
- 技術分享 | MySQL 設定管理員密碼無法生效一例
- PG資料庫的鎖咋弄得這麼複雜呢
- 金融業分散式資料庫選型及HTAP場景實踐
- 我們的企業為什麼寫不好文件
- 新資料庫時代,DBA 發展之路該如何選擇
- MySQL:修改系統時鐘會導致資料庫hang住嗎?
- 從程式設計師的盡頭是業務說起