MySQL8.0賬戶system_user許可權,你瞭解嗎?

語言: CN / TW / HK

公眾號: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  #