MySQL系列:12 用戶管理之2 授權

開門見山

         前文講述了MySQL用戶管理之認證,當某客戶端成功認證,接下來的操作就需要進行權限驗證,如驗證用戶的select、insert、update等操作權限,shutdown、process、file等管理權限等。

MySQL授權雜貨

授權層級

MySQL支持global、database、table、column等不同層級授權。同時,還可以對用戶的routine(procedures & functions)等權限進行控制,具體控制項可以查看mysql.user表的列信息。如下:

管理權限

         MySQL的主要管理選項有:FILE、PROCESS:、SUPER、ALL等。

FILE:允許用戶讀寫服務器上的文件;
PROCESS:允許用戶執行show PROCESSLIST命令查看所有連接的客戶端;
SUPER: 允許用戶kill掉其他客戶端的連接;
ALL:允許所有權限, 除了給其他用戶授權;

注意:

      給其他用戶授權的權限,需要在對此用戶本身授權時加上WITH GRANT OPTION子句。如下,筆者用debian-sys-maint用戶登錄(密碼在/etc/mysql/debian.cnf文件中,root用戶本身沒有grant權限),並創建一個super用戶,賦予WITH GRANT OPTION選項。後面就可以用super給其他用戶授權了。

  • root用戶給test1用戶授權,失敗---因爲root用戶本身沒有grant權限;

  • debian-sys-maint給super用戶授權,成功;

  • 用super用戶再次給test1用戶授權—成功。

GRANT授權

         MySQL使用grant語句爲用戶授權,格式如下:

GRANT XXX1 ON database.XXX2 TO 'user'@'hostname' [ with grant option ]

其中:

  • XXX1標識具體權限,如select、insert、all privileges等,多個權限項用,分割,如下:
mysql> grant all privileges on  *.* TO 'test1'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.16 sec)
  • with grant option表示傳遞grant 授權,帶此子句後,被授權的user可以進一步爲其他用戶授權相關權限;

顯示用戶的grant權限

  • 顯示當前用戶的grant權限
mysql> show grants;
+----------------------------------------------------------------------+
| Grants for super@localhost                                           |
+----------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'super'@'localhost' WITH GRANT OPTION |
+----------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show grants for current_user();
+----------------------------------------------------------------------+
| Grants for super@localhost                                           |
+----------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'super'@'localhost' WITH GRANT OPTION |
+----------------------------------------------------------------------+
1 row in set (0.00 sec)
  • 顯示指定用戶權限
mysql> show grants for 'common'@'%';
+---------------------------------------------------------------+
| Grants for common@%                                           |
+---------------------------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO 'common'@'%' WITH GRANT OPTION |
+---------------------------------------------------------------+
1 row in set (0.00 sec)

Grant Tables權限元數據表

MySQL使用特定的表存儲權限相關的信息,即metadata。除了我們熟知的mysql.user表外,還有:db、tables_priv、columns_priv、procs_priv等;如

  • mysql.sys用戶對sys數據庫擁有權限;

       

  • tables_priv表記錄用戶對錶的權限;

FLUSH PRIVILEGES語句

         我們在MySQL系列:9 存儲引擎中已經知道,表是存儲在表空間(文件)中的。mysqld在啓動時將權限相關表讀入到內存中,以免頻繁磁盤訪問開銷。當我們使用類似update、insert直接修改表時,其內存副本並不生效。因而需要FLUSH PRIVILEGES語句指示mysqld重新加載權限表。

  • 關於skip-grant-tables選項的詳細解釋:

上篇博文中提到,若忘記mysql登錄密碼,可以使用skip-grant-tables選項重啓服務進程,然後免密登錄修改指定用戶密碼。但是修改之前需要先FLUSH PRIVILEGES重新加載權限表。原因就是因爲skip-grant-tables選項啓動mysqld進程時,內存中根本沒有選項表的數據,所以無法更改。

  • 權限表內存副本自動刷新條件

使用create user、grant、revoke等子句修改相關用戶權限時,MySQL自動刷新內存副本(具體不同MySQL版本略有不同),因爲當使用alter命令修改權限時,需要flush才能生效。

回收賬戶權限

         可使用revoke XXX from命令回收賬戶權限,如下:

mysql> show grants for 'common'@'%' ;
+---------------------------------------------------------------+
| Grants for common@%                                           |
+---------------------------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO 'common'@'%' WITH GRANT OPTION |
+---------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> revoke INSERT ON *.* from 'common'@'%';
Query OK, 0 rows affected (0.03 sec)

mysql> show grants for 'common'@'%' ;
+-------------------------------------------------------+
| Grants for common@%                                   |
+-------------------------------------------------------+
| GRANT SELECT ON *.* TO 'common'@'%' WITH GRANT OPTION |
+-------------------------------------------------------+
1 row in set (0.00 sec)

SHOW PROCESSLIST

         此命令顯示所有已連接的客戶線程ID(並不是整個mysqld守護進程的所有線程)和正在執行的命令,mysql對每個連接創建一個線程(thread_handling選項,one-thread-per-connection)。如下:

mysql> SHOW PROCESSLIST;
+----+-------+-----------+------+---------+------+----------+------------------+
| Id | User  | Host      | db   | Command | Time | State    | Info             |
+----+-------+-----------+------+---------+------+----------+------------------+
| 11 | super | localhost | NULL | Query   |    0 | starting | SHOW PROCESSLIST |
| 12 | root  | localhost | NULL | Sleep   |    6 |          | NULL             |
+----+-------+-----------+------+---------+------+----------+------------------+
2 rows in set (0.00 sec)

設置賬戶資源限制

         mysql.user表的最後記錄是關於資源限制的信息,如可以設置同一用戶的同時連接數。如下:

說明:

  1. 首先用alter user 'common'@'%' with MAX_USER_CONNECTIONS 1;設置最大用戶連接數爲1;
  2. 同時開兩個窗口進行鏈接,第二次鏈接會報連接超限。第一次鏈接已成功(show processlist)。

總結

         如上兩篇博文詳細的介紹了MySQL的認證/授權機制,針對不同的MySQL版本,其控制細節略有差異。讀者在實際應用中,應根據具體場景、具體版本合理的設置應用用戶的權限,以實現MySQL數據庫安全穩定的運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章