mysql操作命令梳理(4)-grant授權和revoke回收許可權

散盡浮華發表於2016-07-29

 

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

mysql的許可權命令是grant,許可權撤銷的命令時revoke;
grant授權格式:grant 許可權列表 on 庫.表 to 使用者名稱@'ip' identified by "密碼";
revoke回收許可權格式:revoke 許可權列表 on 庫.表 from 使用者名稱@'ip';

下面通過一些例子說明:
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後也可以將這些許可權授予其他使用者。

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許可權,在這裡列出的使用者可以從任何表中刪除記錄,所以在你這樣做之前要認真考慮。

2)db表
db表列出資料庫,而使用者有許可權訪問它們。在這裡指定的許可權適用於一個資料庫中的所有表。

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

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裡生成一個密文密碼,然後把這個密文密碼給運維同事,運維同事在用這個密文密碼進行授權,
那麼授權的密碼就只有開發同事自己知道了,其他人都不知道!比較安全的一種做法~

相關文章