mysql權限系統非常重要,但同時又是一個很多開發者或管理者所忽略的。權限分配不但,將會造成難以挽回的悲慘后果。我之前所在一家公司,關于數據庫權限這塊就完全不重視,所有開發者都有線上系統的最高權限。想想看,如果哪天有其中一個人刪庫了,那么多人你知道是誰弄的嗎?所以,大家一定要引起重視。
一般建議最高權限只會給一個人,這個人做為管理者,再去分配其他開發者對應權限。開發階段本地的庫還好些,對于線上的庫,給予權限時要慎重。
權限認證的原理
mysql的權限認證是通過兩個方面來認證的。首先會進行用戶的ip、用戶名及密碼校驗,校驗通過的用戶,才能連接上Mysql。當連上后,用戶進行任何操作時,Mysql都會對其所擁有的權限進行校驗,擁有該權限,才會執行用戶請求的操作。否則,不執行。
Mysql權限分類
MySQL的權限大致分為三類:
-
對數據的操作,比如增刪改查。
-
結構的操作,比如創建庫,修改表結構等。
-
管理方面的權限,比如創建用戶、分配權限等。
Mysql權限分配原則
-
給予最小權限,比如目前該用戶只需要看的權限且只需要看一個表時,那就不要去分配所有表的讀權限。只限制為一個表的權限,不要怕麻煩就給予所有表的讀權限。
-
創建用戶時一定要限制ip及設定足夠強度的密碼。
-
定期清理不需要的用戶,及回收那些不需要的權限。
賬號管理
創建賬號
mysql文檔里創建用戶的語法如下:
CREATE?USER?[IF?NOT?EXISTS] ????user?[auth_option]?[,?user?[auth_option]]?... ????[REQUIRE?{NONE?|?tls_option?[[AND]?tls_option]?...}] ????[WITH?resource_option?[resource_option]?...] ????[password_option?|?lock_option]?...
參數有點多,別急,慢慢來通過例子來看。首先用最少的選項創建一個賬號。
#?創建一個無需密碼即可本地登錄的用戶 mysql>?CREATE?USER?'u1'@'localhost'; Query?OK,?0?rows?affected #?創建一個需要密碼授權的用戶,但不限制ip mysql>?CREATE?USER?'u2'@'%'?identified?by?'321232'; #?注意,密碼必須使用引號,單引號或雙引號都行,但不加就出錯。 #?如果不想使用明文的密碼,可以使用password mysql>?select?password('111111'); +-------------------------------------------+ |?password('111111')????????????????????????| +-------------------------------------------+ |?*FD571203974BA9AFE270FE62151AE967ECA5E0AA?| +-------------------------------------------+ 1?row?in?set mysql>?CREATE?USER?'u3'@'192.168.1.%'?IDENTIFIED?BY?PASSWORD?'*FD571203974BA9AFE270FE62151AE967ECA5E0AA'; Query?OK,?0?rows?affected
查看用戶列表
系統用戶列表是存放是mysql庫里的user表。
mysql> SELECT user,host,account_locked FROM mysql.user;
+—————+————-+—————-+
| user ? ? ? ? ?| host ? ? ? ?| account_locked |
+—————+————-+—————-+
| root ? ? ? ? ?| localhost ? | N ? ? ? ? ? ? ?|
| mysql.Session | localhost ? | Y ? ? ? ? ? ? ?|
| mysql.sys ? ? | localhost ? | Y ? ? ? ? ? ? ?|
| u1 ? ? ? ? ? ?| localhost ? | N ? ? ? ? ? ? ?|
| u2 ? ? ? ? ? ?| % ? ? ? ? ? | N ? ? ? ? ? ? ?|
| u2 ? ? ? ? ? ?| localhost ? | N ? ? ? ? ? ? ?|
| u3 ? ? ? ? ? ?| 192.168.1.% | N ? ? ? ? ? ? ?|
+—————+————-+—————-+
7 rows in set
刪除用戶
刪除用戶的語法如下:
DROP?USER?用戶名@ip;
現在我們來刪除u2@’%’
mysql>?drop?user?u2@'%'; Query?OK,?0?rows?affected
這樣u2用戶就被刪除了。
修改用戶賬號
語法如下:
rename?user?old@'oldip'?to?new@'newip';
案例如下:
mysql>?RENAME?USER?u1@localhost?to?user1@'127.0.0.1'; Query?OK,?0?rows?affected
授權
學完了如何創建賬號及管理賬號后,我們來看看如何給用戶授權以及如何回收不需要的權限。
用戶授權
給用戶授權語法如下:
GRANT?權限?ON?數據庫名*表名?TO?用戶名@ip;
案例如下:
mysql>?GRANT?SELECT?ON?*.*?TO?'u1'@'localhost'?;? Query?OK,?0?rows?affected?(0.00?sec)? --?全局級別授權??? mysql>?GRANT?ALL?ON?test.*?TO?'u2'@'localhost';? Query?OK,?0?rows?affected?(0.00?sec)? --?數據庫級別授權??? mysql>?GRANT?ALL?ON?test.student?TO?'u3'@'localhost'?WITH?GRANT?OPTION;? --?表級別授權
查看用戶的權限
給用戶授權后,我們來查看用戶是否已經獲得到了這些權限。
回收用戶權限
當發現給與的權限多了,那么就應該及時回收這些權限。回收權限的語法和授權的語法非常像。
REVOKE?權限?ON?數據庫*表?FROM?用戶名@ip地址