MySQL許可權控制實現原理

2020-07-16 10:05:28
MySQL 許可權表在資料庫啟動時載入記憶體,使用者通過身份認證後,系統會在記憶體中進行相應許可權的存取。當 MySQL 允許一個使用者執行各種操作時,它將首先核實該使用者向 MySQL 伺服器傳送的連線請求,然後確認使用者的操作請求是否被允許。

當使用者進行連線時,MySQL 實現許可權控制主要有以下兩個階段:

1)連線核實階段

登入 MySQL 伺服器時,用戶端連線請求中會提供使用者名稱稱、主機地址和密碼,MySQL 伺服器會使用 user 表中的 Host、User 和 authentication_string (MySQL 5.7 版本之前是 Password)欄位執行身份檢查。

只有用戶端請求的主機名和使用者名稱在 user 表中有匹配的記錄,並且密碼正確時,MySQL 伺服器才會通過身份認證,接受連線,否則拒絕連線。

MySQL 通過 IP 地址和使用者名稱聯合進行身份認證。例如 MySQL 安裝後預設建立的使用者 [email protected],表示使用者 root 只能從本地(localhost)進行連線時才能通過認證。此使用者從其它任何主機對資料庫進行連線時都將被拒絕。也就是說,使用者名稱相同,IP 地址不同,MySQL 則將其視為不同的使用者。

伺服器接受連線後進入請求核實階段等待使用者請求。如果連線核實沒有通過,伺服器則完全拒絕存取。

2)請求核實階段

建立連線後,伺服器進入請求核實階段,對在此連線上的每個請求,伺服器都會檢查使用者是否有足夠的許可權來執行它。這正是授權表中的許可權列發揮作用的地方。

許可權按照以下許可權表的順序得到資料庫許可權:user→db→tables_priv→columns_priv→procs_priv。在這幾個許可權表中,許可權範圍依次遞減,全域性許可權覆蓋區域性許可權。

請求核實的過程如下所示:

1)使用者向 MySQL 發出操作請求。

2)MySQL 首先檢查 user 表,匹配 User、Host 欄位值,檢視請求的全域性許可權在 user 表中是否被授權。授權則允許操作執行,如果指定的許可權在 user 表中沒有被授權。MySQL 將檢查 db 表。

3)db 表是下一安全層級,其中的許可權限定於資料庫層級,在該層級的 SELECT 許可權允許使用者檢視指定資料庫的所有表中的資料。

MySQL 檢查 db 許可權表中的許可權資訊,匹配 User、Host 欄位值,檢視請求的資料庫級別的許可權在 db 表中是否被授權。授權則允許操作執行,否則 MySQL 繼續向下查詢。

4)MySQL 檢查 tables_priv 許可權表中的許可權資訊,匹配 User、Host 欄位值,檢視請求的資料表級別的許可權在 tables_priv 表中是否被授權。授權則允許操作執行,否則 MySQL 繼續向下查詢。

5)MySQL 檢查 columns_priv 許可權表中的許可權資訊,匹配  User、Host 欄位值,檢視請求的列級別的許可權在 columns_priv 表中是否被授權。授權則允許操作執行,否則 MySQL 繼續向下查詢。

6)如果所有許可權表都檢查完畢,還是沒有找到允許的許可權操作,那麼 MySQL 將返回錯誤資訊,即使用者請求的操作不能執行,操作失敗。

提示:上面提到 MySQL 通過向下層級的順序檢查許可權表,但並不意味著所有的許可權都要執行該過程。例如,一個使用者登入到 MySQL 伺服器之後只執行對 MySQL 的管理操作,此時只涉及管理許可權,因此 MySQL 只檢查 user 表。