MySQL 操做命令梳理(4)-- grant受權和revoke回收權限

 

在mysql維護工做中,作好權限管理是一個很重要的環節。下面對mysql權限操做進行梳理:mysql

mysql的權限命令是grant,權限撤銷的命令時revoke;
grant受權格式:grant 權限列表 on 庫.表 to 用戶名@'ip' identified by "密碼";
revoke回收權限格式:revoke 權限列表 on 庫.表 from 用戶名@'ip';sql

下面經過一些例子說明:
1.grant受權
1)grant 普通數據用戶,查詢、插入、更新、刪除 數據庫中全部表數據的權利。數據庫

mysql> grant all on *.* to wang@'192.168.1.150' identified by "password";           //all等同於all privilege,其中的privileges能夠省略
mysql> grant all privileges on *.* to wang@'192.168.1.%' identified by "123456";    //192.168.1.%表示一個網段
mysql> grant insert,select,update,delete,drop,create,alter on huanqiu.* to wang@'%' identified by "123456";
mysql> flush privileges      //受權以後,不要忘記更新權限表

2.查看權限
1)查看當前用戶下全部的權限安全

mysql> show grants;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

2)查看指定用戶下的全部權限
USAGE是默認的初始狀態,表示無任何權限!!
下面表示wang用戶在192.168.1.0/24網段登錄本機mysql後,對huanqiu庫下的全部表有insert,update,alter,delete,create,select的操做權限!服務器

mysql> show grants for wang@'192.168.1.%';           //能夠在select user,host,password from mysql.user執行結果中找對應的權限用戶信息
+---------------------------------------------------------------------------------------------------------------+
| Grants for wang@192.168.1.%                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F92736C080819AD76DF' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON `huanqiu`.* TO 'wang'@'192.168.1.%'                    |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

3.revoke撤銷權限
revoke跟grant語法差很少,只須要把關鍵字 「to」 換成 「from」 便可,而且revoke語句中不須要跟密碼設置。
注意:revoke能夠回收全部權限,也能夠回收部分權限。運維

mysql> revoke all on *.* from wang@'192.168.1.150';                   
mysql> revoke all privileges on *.* from wang@'192.168.1.%';               
mysql> revoke insert,select,update,delete,drop,create,alter on huanqiu.* from wang@'%';
mysql> flush privileges

注意事項:
1)grant, revoke用戶權限後,該用戶只有從新鏈接MySQL數據庫,權限才能生效。
2)若是想讓受權的用戶,也能夠將這些權限grant給其餘用戶,那麼受權時需添加選項 "grant option"!
以下設置後,那麼這個wang用戶鏈接mysql後也能夠將這些權限授予其餘用戶。ide

mysql> grant insert,select,update,alter on huanqiu.* to wang@'%' identified by "123456" with grant option;

-------------------------------------------------------------------------------------------------------------------
mysql受權表一共涉及到5個表,分別是user、db、host、tables_priv和columns_priv。
這5張表的內容和用途以下:
1)user表
user表列出能夠鏈接服務器的用戶及其口令,而且它指定他們有哪一種全局(超級用戶)權限。在user表啓用的任何權限均是全局權限,並適用於全部數據庫。例如,若是你啓用了DELETE權限,在這裏列出的用戶能夠從任何表中刪除記錄,因此在你這樣作以前要認真考慮。ip

2)db表
db表列出數據庫,而用戶有權限訪問它們。在這裏指定的權限適用於一個數據庫中的全部表。開發

3)host表
host表與db表結合使用在一個較好層次上控制特定主機對數據庫的訪問權限,這可能比單獨使用db好些。這個表不受GRANT和REVOKE語句的影響,因此,你可能發覺你根本不是用它。it

4)tables_priv表
tables_priv表指定表級權限,在這裏指定的一個權限適用於一個表的全部列。

5)columns_priv表
columns_priv表指定列級權限。這裏指定的權限適用於一個表的特定列。
------------------------------------------------------------------------------------------------------------------
看下面一個實例:
給wang用戶受權的權限太大了,如今要收回部分權限,只留給wang用戶select和alter的權限。

mysql> show grants for wang@'192.168.1.%';
+---------------------------------------------------------------------------------------------------------------+
| Grants for wang@192.168.1.%                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F92736C080819AD76DF' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON `huanqiu`.* TO 'wang'@'192.168.1.%'                    |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> revoke insert,update,delete,create on huanqiu.* from wang@'192.168.1.%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for wang@'192.168.1.%';
+---------------------------------------------------------------------------------------------------------------+
| Grants for wang@192.168.1.%                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F92736C080819AD76DF' |
| GRANT SELECT, ALTER ON `huanqiu`.* TO 'wang'@'192.168.1.%'                                                    |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

發現revoke回收權限操做後,只剩下select和alter權限了。
revoke回收部分權限,剩下的權限的密碼保持不變。

這裏特別注意下:
若是給一個用戶設置的權限過大,除了上面使用revoke回收部分權限外,還可使用grant進行權限修改!
也就是說,grant不只能夠添加權限,也能夠修改權限(實際上就是對同一'用戶名'@'ip'設置權限,以覆蓋以前的權限);
grant修改後的權限將覆蓋以前的權限!
那麼問題來了:受權後的密碼是密文形式保存的,若是記不住以前受權時的密碼,那麼怎樣保證覆蓋後的權限跟以前的權限一致?

莫慌!
grant受權操做中其實不只能夠設置明文密碼,也能夠設置密文密碼,以下:
1)grant 權限列表 on 庫.表.* to 用戶名@'ip' identified by "明文密碼"
2)grant 權限列表 on 庫.表.* to 用戶名@'ip' identified by password "密文密碼"

也就是說:
在grant重置權限的時候能夠用查看的密文密碼當作新的密碼,而後去覆蓋以前的權限,這就保證了修改先後的密碼一致!
如上的例子,採用grant的操做以下:

mysql> show grants for wang@'192.168.1.%';
+---------------------------------------------------------------------------------------------------------------+
| Grants for wang@192.168.1.%                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F92736C080819AD76DF' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON `huanqiu`.* TO 'wang'@'192.168.1.%'                    |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> grant alter,select on huanqiu.* to wang@'192.168.1.%' identified by password '*678E2A46B8C71291A3915F92736C080819AD76DF';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for wang@'192.168.1.%';
+---------------------------------------------------------------------------------------------------------------+
| Grants for wang@192.168.1.%                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F92736C080819AD76DF' |
| GRANT SELECT, ALTER ON `huanqiu`.* TO 'wang'@'192.168.1.%'                                                    |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

一般開發同事在讓運維同事開通mysql權限時,他們會在本身本地mysql裏生成一個密文密碼,而後把這個密文密碼給運維同事,運維同事在用這個密文密碼進行受權,那麼受權的密碼就只有開發同事本身知道了,其餘人都不知道!比較安全的一種作法~

相關文章
相關標籤/搜索