前言:
MySQL許可權系統的主要功能是證實連線到一臺給定主機的使用者,並且賦予該使用者在資料庫上的SELECT、INSERT、UPDATE和DELETE許可權。附加的功能包括有匿名的使用者並對於MySQL特定的功能例如LOAD DATA INFILE進行授權及管理操作的能力。
mysql賦許可權操作:
談到mysql許可權,在工作中第一個想到的就是給使用者設定允許外部連線的許可權,因為要使用類似navicat的圖形化工具,更加方便更加簡便快捷的運算元據庫。操作也很簡單以root使用者為例,分三個步驟,分別是
1、設定mysql資料庫中user表host欄位為%,如下圖
2、賦予root 使用者許可權
grant all privileges on *.* to ‘root’@’%’ with grant option
3、重新整理
flush privileges;
做完這些,就可以使用圖形化工具連線mysql了。
但是今天同事在安裝的時候出現了一個問題,就是安裝過後,不用上面的操作依然可以連線,按道理來講肯定是行不通的,這簡直顛覆了信仰......所以懷疑是不是有快取什麼的,所以又是一頓重新整理快取,重啟服務
但結果仍然可以正常連結,折騰了半天才發現原來配置檔案中有這麼一句配置
"取消密碼驗證" 第一想法感覺只是取消了密碼驗證而已,和使用者的遠端連線應該沒關係,但是結果很意外,於是關閉又開啟這個配置後果然,外部連結的許可權也跟著關閉和開啟。
為了進一步搞清楚問題所在,查詢了mysql的官方文件(文件是真心亂)發現原來 skip-grant-tables 不是取消密碼驗證的意思,官網解釋如下
於是才知道skip-grant-tables 是關閉mysql的許可權系統~~~不單單是密碼驗證,因為根本需要驗證了。
mysql許可權系統工作思路:
那麼mysql的許可權系統到底是怎麼工作的?下面也整理了一些個人的理解。mysql對於許可權的控制分為兩個階段。
階段1、伺服器檢查是否允許你連線。
階段2:假定你能連線,伺服器檢查你的操作許可權
先看下面一張圖
流程圖很清楚的解釋了許可權體系的流程mysql在定義許可權的時候是跟你使用者名稱和網路地址來形成許可權集的,就是說允許tom從不同的主機擁有不同的mysql許可權,換句話說,就是不同主機的tom可能不是同一個人,所以就不能擁有同一個許可權集了
而許可權集的表主要由MySQL庫中 user,db ,host三張表組成
表名 |
user |
db |
host |
列範圍 |
Host |
Host |
Host |
|
User |
Db |
Db |
|
Password |
User |
|
1、user 表範圍列決定是否允許或拒絕到來的連線。對於允許的連線,user表授予的許可權指出使用者的全域性(超級使用者)許可權。這些許可權適用於伺服器上的all資料庫。
2、db 表範圍列決定使用者能從哪個主機存取哪個資料庫。許可權列決定允許哪個操作。授予的資料庫級別的許可權適用於資料庫和它的表。
3、host表不受GRANT和REVOKE語句的影響。大多數MySQL安裝根本不需要使用該表
4、tables_priv和columns_priv表可以對錶和列提供更精確的許可權控制
舉個例子,user表中host為192.168.0.1 user為 lisi ,db表中同樣會存有 host為192.168.0.1 user為 lisi 的記錄,Db的值則為該使用者可以操作的資料庫,至此最上面設定mysql資料庫中user表host欄位為%的操作就很好理解了,就是允許所有的root使用者以所有ip連線mysql服務
當使用者有許可權連線到mysql後,會從記憶體中載入到上述幾個表中的許可權集,進行許可權控制,如果更新了某個使用者的許可權,則需要重新整理快取也就是最上面將的第三步
最後說下第二步操作 grant all privileges on *.* to ‘root’@’%’ with grant option ;整條語句唯一需要解釋的就是 *.* 這一處,這一處代表的是操作的層級,通俗的講就是許可權在表層級,欄位層級,還是庫的層級,
那麼層級可以具體劃分如下:
層級 | 範圍 | 所在位置 | 授予語法 | 撤銷語法 |
全域性層級 | 所有資料庫 | mysql.user | GRANT ALL ON *.* | REVOKE ALL ON *.* |
資料庫層級 | 指定資料庫 | mysql.db和mysql.host | GRANT ALL ON db_name.* | REVOKE ALL ON db_name.* |
表層級 | 給定表中的所有列 | mysql.talbes_priv | GRANT ALL ON db_name.tbl_name | REVOKE ALL ON db_name.tbl_name |
列層級 | 給定表中的單一列 | mysql.columns_priv | GRANT ALL ON db_name.tbl_name.col | REVOKE ALL ON db_name.tbl_name.clo |
子程式層級 | 一個已儲存的函式或一個已儲存的過程時 |
總結:
在使用資料庫的時候,對賦予使用者的許可權一定要細緻和慎重,不建議用%和*.*來給與普通使用者操作,同樣對root使用者也是如此。畢竟資料的安全是很重要的。