一.概述
mysql 的權限系統主要用來對連接到數據庫的用戶進行權限驗證,以此來判斷此用戶是否屬於合法用戶,以及合法用戶給予的相應數據庫權限。下面將介紹權限系統的工作原理,以及將要熟練掌握賬號的管理和使用方法(mysql版本 5.7)。
1.1 權限系統的工作原理
mysql 權限系統通過兩個階段進行認證:(1) 對連接的用戶進行身份認證,合法的用戶通過認證,不合法的用戶拒絕連接;(2) 對通過認證的合法用戶賦予相應的權限,用戶可以在這些權限范圍內對數據庫做相應操作。
對於身份認證, mysql是通過ip地址和用戶名聯合進行確認的, 例如在mysql安裝后默認創建的用戶root@localhost表示用戶root 只能從本地(localhost)進行連接才可以通過認證,此用戶從其它任何主機上對數據庫進行的連接都將被拒絕。 可以說同樣一個用戶名,如果來自不同的ip地址,則mysql將視為不同的用戶。
如下圖所示,mysql.user表中第一行的host列限定是localhost 代表本地:
mysql權限表在數據庫啟動的時候就載入內存了,當用戶通過身份認證后,就在內存中進行相應權限的存取,這樣,此用戶就可以在數據庫中做權限范圍內的各種操作了。
1.2 權限表的權限介紹
在權限表存取的兩個過程中,系統會用到"mysql" 數據庫(安裝mysql時被創建, 數據庫名稱叫" mysql ")中的user,host,db這3個最重要的權限表(在MySQL 5.6.7中刪除了mysql.host表)。
表名 | user | db | 描述 |
用戶列 | Host | Host | 允許用戶登錄所使用的IP |
User(對應的用戶名稱) | Db(對應的庫名稱) | ||
Password (5.7 版本 authentication_string) |
User | ||
權限列 | |||
Select_priv | Select_priv | 是否通過SELECT命令查詢數據 | |
Insert_priv | Insert_priv | 是否通過INSERT命令插入數據; | |
Update_priv | Update_priv | 是否通過UPDATE命令修改現有數據 | |
Delete_priv | Delete_priv | 是否通過DELETE命令刪除現有數據 | |
Create_priv | Create_priv | 是否可以創建新的數據庫和表 | |
Drop_priv | Drop_priv | 是否可以刪除現有數據庫和表 | |
Reload_priv | 是否可以執行刷新和重新加載MySQL所用各種內部緩存的特定命令,包括日志、權限、主機、查詢和表;重新加載權限表 | ||
Shutdown_priv | 是否可以關閉MySQL服務器 | ||
Process_priv | 是否可以通過SHOW PROCESSLIST命令查看其他用戶的進程;服務器管理 | ||
File_priv | 是否可以執行SELECT INTO OUTFILE和LOAD DATA INFILE命令;加載服務器上的文件 | ||
Grant_priv | Grant_priv | 是否可以將自己的權限再授予其他用戶 | |
References_priv | References_priv | 創建外鍵約束 | |
Index_priv | Index_priv | 是否可以創建和刪除表索引;用索引查詢表 | |
Alter_priv | Alter_priv | 是否可以重命名和修改表結構 | |
Show_db_priv | 是否可以查看服務器上所有數據庫的名字,包括用戶擁有足夠訪問權限的數據庫 | ||
Super_priv | 是否可以執行某些強大的管理功能,例如通過KILL命令刪除用戶進程,使用SET GLOBAL修改全局MySQL變量,執行關於復制和日志的各種命令;超級權限 | ||
Create_tmp_table_priv | Create_tmp_table_priv | 是否可以創建臨時表 | |
Lock_tables_priv | Lock_tables_priv | 是否可以使用LOCK TABLES命令阻止對表的訪問/修改; | |
Execute_priv | Execute_priv | 是否可以執行存儲過程 | |
Repl_slave_priv | 是否可以讀取用於維護復制數據庫環境的二進制日志文件;此用戶位於主系統中,有利於主機和客戶機之間的通信;主服務器管理 | ||
Repl_client_priv | 是否可以確定復制從服務器和主服務器的位置;從服務器管理 | ||
Create_view_priv | Create_view_priv | 是否可以創建視圖 | |
Show_view_priv | Show_view_priv | 是否可以查看視圖 | |
Create_routine_priv | Create_routine_priv | 是否可以更改或放棄存儲過程和函數 | |
Alter_routine_priv | Alter_routine_priv | 是否可以修改或刪除存儲函數及函數 | |
Create_user_priv | 是否可以執行CREATE USER命令,這個命令用於創建新的MySQL賬戶 | ||
Event_priv | Event_priv | 是否能否創建、修改和刪除事件 | |
Trigger_priv | Trigger_priv | 是否能否創建和刪除觸發器 | |
Create_tablespace_priv | 是否可以創建表空間 | ||
安全列 | |||
ssl_type | 支持ssl標准加密安全字段 | ||
ssl_cipher | 支持ssl標准加密安全字段 | ||
x509_issuer | 支持x509標准字段 | ||
x509_subject | 支持x509標准字段 | ||
資源控制列 | |||
max_questions | 每小時允許執行多少次查詢 | ||
max_updates | 每小時可以執行多少次更新 | ||
max_connections | 每小時可以建立的多少次連接 | ||
max_user_connections | 單用戶可以同時具有的連接數 | ||
安全列 | |||
plugin | 引入plugins以進行用戶連接時的密碼驗證,plugin創建外部/代理用戶 | ||
password_expired | 密碼是否過期 (y 已過期) | ||
password_last_changed | |||
password_lifetime | |||
account_locked |
在這二個表中,最重要的是user表,其次是db表,在user表中通常使用最多的是用戶列和權限列, 權限列分為普通權限和管理權限。
普通權限主要用於數據庫操作,如seelct_priv,create_priv等。
管理權限主要用來對數據庫進行管理的操作包括:Create_tablespace_priv ,Create_user_priv ,process_priv,
Reload_priv, Repl_client_priv , Repl_slave_priv , Show_db_priv ,Shutdown_priv ,super_priv。
最后權限表中權限列,對應的權限名(privilege)如下圖所示(在下一章中有用GRANT賦予權限時會用到,例如權限列Delete_priv對應的是DELETE權限):
詳細的權限文檔參考:
https://dev.mysql.com/doc/mysql-security-excerpt/5.7/en/privileges-provided.html#priv_references