MySQL 8.0.16新特性:SYSTEM_USER動態權限(英譯中文)

文本使用翻譯工具協助翻譯,存在明顯機翻味,同時加入了個人一些實際操做看法。html

  翻譯這篇文章,源於我在最新(8.0.16)版本的MySQL使用root用戶建立用戶並授予全部(all)權限後,出現沒法經過revoke all撤銷新建用戶的全部權限,後在官網得知這是8.0.16新出的一個權限,又因爲本人捉急的英語水平和直接用翻譯頁面的錯誤翻譯,因而嘗試手動調整翻譯內容,便於理解,便有了本文,歡迎大佬指出、完善翻譯。mysql


本系列共三部分:sql

  若要修改用戶,必須在MySQL架構上具備CREATE USER權限或UPDATE權限。在MySQL 8.0.16中咱們添加了SYSTEM_USER動態權限,以保護用戶不受第一種狀況的影響:其餘擁有CREATE USER權限的用戶進行修改。具備SYSTEM_USER權限的賬戶不能被沒有SYSTEM_USER的賬戶修改,即便該賬戶具備CREATE USER權限數據庫

  在本文中,咱們將討論第一個用例。下一篇博客文章(原文)將介紹如何防止用戶被MySQL模式上具備UPDATE權限的賬戶所修改服務器

SYSTEM_USER權限是如何工做的?

  SYSTEM_USER權限強制執行這樣的約定:若是要修改授予SYSTEM_USER權限的用戶,那麼除了修改用戶所需的權限外,還須要具備SYSTEM_USER權限。換句話說,擁有SYSTEM_USER和CREATE權限的用戶能夠修改擁有SYSTEM_USER權限的用戶架構

下面咱們經過例子更好的理解:運維

使用root用戶,建立兩個用戶,一個具備CREATE USER權限,另外一個具備SYSTEM_USER權限

在實際操做中,在不改動配置下,不能建立空密碼的用戶:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,但這並不影響教程所要表達的意思ide

mysql> CREATE USER admin_user, elite_user; #建立admin_user用戶和elite_user用戶
Query OK, 0 rows affected (0.01 sec)
 
mysql> GRANT CREATE USER ON *.* TO admin_user; #賦予admin_user用戶CREATE USER權限
Query OK, 0 rows affected (0.01 sec)
 
mysql> GRANT SYSTEM_USER ON *.* TO elite_user; #賦予elite_user用戶SYSTEM_USER權限
Query OK, 0 rows affected (0.00 sec)
複製代碼

嘗試在admin_user用戶會話下更改elite_user用戶的密碼函數

mysql> SELECT USER();
+----------------------+
| USER()               |
+----------------------+
| admin_user@localhost |
+----------------------+
1 row in set (0.00 sec)
 
mysql> ALTER USER elite_user IDENTIFIED BY 'blahblah';
ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation
複製代碼

顯然是不能夠的工具

返回到root用戶會話下,並建立另外一個具備這兩種權限的用戶

mysql> CREATE USER power_user; #建立power_user用戶
Query OK, 0 rows affected (0.01 sec)
 
mysql> GRANT CREATE USER, SYSTEM_USER ON *.* TO power_user; #賦予power_user用戶CREATE USER和SYSTEM_USER權限
Query OK, 0 rows affected (0.01 sec)
複製代碼

嘗試經過新建立的用戶修改power_user密碼

mysql> SELECT USER();
+------------------------+
| USER()                 |
+------------------------+
| power_user@localhost   |
+------------------------+
1 row in set (0.00 sec)
 
mysql> ALTER USER power_user IDENTIFIED BY 'blahblah';
Query OK, 0 rows affected (0.01 sec)
複製代碼

是能夠成功修個power_user的密碼的

如何經過角色(ROLE)授予權限?

若是將角色授予用戶,則用戶只有在激活該角色以後才能在給定會話中得到該角色的功能。若是用戶沒有被直接授予SYSTEM_USER,但只能經過一個或多個角色授予,則除非激活了具備SYSTEM_USER的角色,不然用戶的會話不具備SYSTEM_USER。一旦激活了這樣的角色,用戶就可以修改具備SYSTEM_USER特權的其餘用戶。

咱們經過例子來理解

建立具備SYSTEM_USER權限的角色,將該角色授予咱們在前面的示例中建立的admin_user

mysql> CREATE ROLE elite_role; #建立elite_role角色
Query OK, 0 rows affected (0.01 sec)
 
mysql> GRANT SYSTEM_USER ON *.* TO elite_role; #賦予elite_role角色SYSTEM_USER權限
Query OK, 0 rows affected (0.01 sec)
 
mysql> GRANT elite_role to admin_user; #賦予admin_user用戶elite_role角色
Query OK, 0 rows affected (0.01 sec)
複製代碼

【MySQL8.0-新特性-role】role能夠看作一個權限的集合,這個集合有一個統一的名字role名。能夠給多個帳戶統一的某個role的權限權限的修改直接經過修改role來實現,不須要每一個帳戶一個一個的grant權限,方便運維和管理。role能夠建立、刪除、修改並做用到他管理的帳戶上。

即便經過將角色授予的admin_user,該用戶也只能在激活該角色以後才能修改elite_user

mysql> SHOW GRANTS;
+----------------------------------------------+
| Grants for admin_user@%                      |
+----------------------------------------------+
| GRANT CREATE USER ON *.* TO `admin_user`@`%` |
| GRANT `elite_role`@`%` TO `admin_user`@`%`   |
+----------------------------------------------+
2 rows in set (0.00 sec)
 
mysql> ALTER USER elite_user IDENTIFIED BY 'blahblah'; #更改elite_user用戶的密碼
ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation  #更改失敗
 
mysql> SET ROLE elite_role; #激活elite_role角色
Query OK, 0 rows affected (0.00 sec)
 
mysql> SHOW GRANTS;
+----------------------------------------------+
| Grants for admin_user@%                      |
+----------------------------------------------+
| GRANT CREATE USER ON *.* TO `admin_user`@`%` |
| GRANT SYSTEM_USER ON *.* TO `admin_user`@`%` |
| GRANT `elite_role`@`%` TO `admin_user`@`%`   |
+----------------------------------------------+
3 rows in set (0.00 sec)
 
mysql> ALTER USER elite_user IDENTIFIED BY 'blahblah'; #更改elite_user用戶的密碼
Query OK, 0 rows affected (0.01 sec) #更改爲功
複製代碼

什麼時候能夠將SYSTEM_USER權限授予或撤銷其餘用戶?

只有在具備授予GRANT選項的SYSTEM_USER權限的狀況下。正如咱們所看到的,即便用戶擁有SUPER權限與GRANT OPTION,它也不能從其餘用戶中撤銷SYSTEM_USER

mysql> SHOW GRANTS;
+-----------------------------------------------------------------------+
| Grants for admin_user@%                                               |
+-----------------------------------------------------------------------+
| GRANT SUPER, CREATE USER ON *.* TO `admin_user`@`%` WITH GRANT OPTION |
+-----------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> REVOKE SYSTEM_USER ON *.* FROM elite_user;
ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation
複製代碼

若是用戶擁有SYSTEM_USER權限,則能夠撤消其餘用戶的SYSTEM_USER權限

mysql> SHOW GRANTS;
+-----------------------------------------------------------------------+
| Grants for admin_user@%                                               |
+-----------------------------------------------------------------------+
| GRANT SUPER, CREATE USER ON *.* TO `admin_user`@`%` WITH GRANT OPTION |
| GRANT SYSTEM_USER ON *.* TO `admin_user`@`%` WITH GRANT OPTION        |
+-----------------------------------------------------------------------+
2 rows in set (0.00 sec)
 
mysql> REVOKE SYSTEM_USER ON *.* FROM power_user;
Query OK, 0 rows affected (0.01 sec)
複製代碼

能夠經過函數或存儲過程來提高權限嗎?

若是你擁有SET_USER_ID權限,那你能夠建立一個帶有DEFINER屬性的存儲過程,並將DEFINER屬性設置爲任何用戶

也能夠經過在DEFINER屬性中具備SYSTEM_USER、clever、no權限的用戶來授予本身SYSTEM_USER權限

嗯,不太好。若要將DEFINER屬性設置爲具備SYSTEM_USER權限的用戶,還必須在SET_USER_ID權限以外擁有SYSTEM_USER權限。

經過例子瞭解:

  • admin_user:具備建立存儲過程的權限
  • elite_user:能夠執行存儲過程,有SYSTEM_USER權限
  • regular_user:能夠執行存儲過程,沒有SYSTEM_USER權限
mysql> SHOW GRANTS FOR admin_user;  #顯示授予admin_user的權限
+----------------------------------------------------------------+
| Grants for admin_user@%                                        |
+----------------------------------------------------------------+
| GRANT CREATE USER ON *.* TO `admin_user`@`%` WITH GRANT OPTION |
| GRANT SET_USER_ID ON *.* TO `admin_user`@`%`                   |
| GRANT ALL PRIVILEGES ON `test`.* TO `admin_user`@`%`           |
+----------------------------------------------------------------+
3 rows in set (0.00 sec)
 
mysql> SHOW GRANTS FOR elite_user; #顯示授予elite_user的權限
+----------------------------------------------------------------+
| Grants for power_user@%                                        |
+----------------------------------------------------------------+
| GRANT EXECUTE ON *.* TO `elite_user`@`%` WITH GRANT OPTION     |
| GRANT SYSTEM_USER ON *.* TO `elite_user`@`%` WITH GRANT OPTION |
+----------------------------------------------------------------+
2 rows in set (0.00 sec)
 
mysql> SHOW GRANTS FOR regular_user; #顯示授予regular_user的權限
+--------------------------------------------+
| Grants for regular_user@%                  |
+--------------------------------------------+
| GRANT EXECUTE ON *.* TO `regular_user`@`%` |
+--------------------------------------------+
1 row in set (0.00 sec)
複製代碼

admin_user嘗試使用具備SYSTEM_USER權限的DEFINER建立一個存儲過程,可是它會獲得一個錯誤。

mysql> CREATE DEFINER= elite_user PROCEDURE test.gp() GRANT SYSTEM_USER ON *.* TO CURRENT_USER();
ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation
複製代碼

試圖在存儲過程當中授予SYSTEM_USER權限的嘗試也被阻止

mysql> CREATE DEFINER= regular_user PROCEDURE test.gp() GRANT SYSTEM_USER ON *.* TO CURRENT_USER();
Query OK, 0 rows affected (0.01 sec)
 
mysql> call test.gp();
ERROR 1227 (42000): Access denied; you need (at least one of) the GRANT OPTION privilege(s) for this operation
複製代碼

接受DEFINER屬性的其餘數據庫對象的行爲與上面演示的相似。這些對象是:函數、視圖、觸發器、事件。

在角色的狀況下,將會有一些有趣的場景。我不該該一我的玩,因此我把這些場景留給你去嘗試

哪些用戶在新安裝或升級的MySQL安裝中被授予SYSTEM_USER權限?

做爲起點,必須至少有一個具備SYSTEM_USER權限的用戶。在升級服務器時,具備SET_USER_ID權限的用戶將被授予SYSTEM_USER權限。若是沒有用戶擁有SET_USER_ID權限,那麼擁有SUPER權限的用戶將被授予SYSTEM_USER權限。咱們選擇SET_USER_ID來做出這個決定,由於它是管理權限之一。它使用戶可以在視圖或存儲過程的DEFINER屬性中指定任何賬戶,這是SYSTEM_USER應用到的操做。

SYSTEM_USER權限與SYSTEM_USER()函數或操做系統用戶之間的關係?

函數返回鏈接到服務器的當前MySQL用戶。它是user()函數的同義詞。操做系統用戶一般也被稱爲系統用戶

正如您可能已經注意到的,SYSTEM_USER權限與SYSTEM_USER()或操做系統用戶都沒有關聯。咱們將權限命名爲‘SYSTEM_USER’,由於它恰當地描述了目的。

結尾

在這篇博文中,咱們瞭解了SYSTEM_USER權限的目的以及它是如何工做的。在下一篇博客文章中,咱們將更深刻地研究如何在數據庫對象上建立部分撤銷,以防止直接修改MySQL模式中的用戶。

在本系列的最後一篇博客文章中,咱們將把各個部分放在一塊兒,爲一個應用程序建立多個用戶。

謝謝你使用MySQL!

翻譯原文The SYSTEM_USER Dynamic Privilege | MySQL Server Blog

推薦資料擴展

相關文章
相關標籤/搜索