MySQL有一套先進的但非標准的安全/授權系統,掌握其授權機制是開始操作MySQL數據庫必須要走的第一步,對於一個熟悉SQL基本操作的人來說,也是MySQL所有的知識中比較難以理解的一個部分。本文通過揭開其授權系統的運作機制,希望大家能夠可以更好地操作和使用這個優秀的數據庫系統。
本文主要參考了MySQL安裝所附的使用手冊第六章中的部分內容。如果有任何疑問,請和我聯系(
[email protected])
1、授權機制的主要作用是什麼?
授權機制的基本作用是給某個主機上的用戶對某個數據庫以select,insert,update和detete的權限。而其額外的功能還包括是否允許匿名使用數據庫,使用MysQL的一些特定函數,如:LOAD DATA INFILE之類。在這裡請注意,MySQL中的用戶名和Unix系統中的用戶名並沒有什麼關系。雖然許多客戶端程序允許你可以用當前的用戶名進行登錄,但是最標准的做法還是通過--user的選項。
2、授權機制是如何進行運作的?
在MySQL中主機和用戶的聯合視為唯一標志。比如說,在主機1和主機2上的用戶lee實際上是不同的,他們對MySQL的使用權限也可以是有差別的。而整個授權機制的核心問題就是要解決授予從某個主機上登錄的某個用戶對某個數據庫的使用權限。你可以通過腳本mysqlAccess測試一個主機上用戶的對數據庫操作的權限。而所有的授權信息都被存儲在數據庫mysql的user、host和db表中。我們可以通過mysql MySQL的指令連接到這個數據庫中,並且通過select * from user(或者db,host)顯示每個數據表中的內容。user表中所授予的權限是整個授權機制的基本授權,也就是說,user中的定義對於任何一個用戶+主機來說都是適用的,除非在db表中另外有所定義,因此,對於用戶來說最好是就某個數據庫為基礎進行授權。而host表的主要目的是維護一個“安全”服務器的列表。而在具體考慮某個用戶/主機對某個數據庫的權限的的時候,我們還需要研究一下授權機制的的匹配搜索機制:
其次,在授權機制中可以對一個用戶的口令進行加密,而且是必須加密,加密的方法是passWord('口令'),如果直接填寫口令的話,會導致數據庫無法訪問。user表中所授予的權限是整個授權機制的基本授權,也就是說,user中的定義對於任何一個用戶+主機來說都是適用的,除非在db表中另外有所定義,因此,對於用戶來說最好是就某個數據庫為基礎進行授權。而host表的主要目的是維護一個“安全”服務器的列表。而在具體考慮某個用戶/主機對某個數據庫的權限的的時候,我們還需要研究一下授權機制的的匹配搜索機制:
首先,我們需要介紹一下統配符的概念,統配符包括“%”,其意思為任意(的主機、用戶或者數據庫),而如果一條記錄為空的話,也表示任意的意思。其次,在授權機制中可以對一個用戶的口令進行加密,而且是必須加密,加密的方法是passWord('口令'),如果直接填寫口令的話,會導致數據庫無法訪問。
從我們對這三個表的顯示我們可以看到,這三個表中的每一條記錄包含了對於某個用戶的授權情況的描述,MySQL數據庫中幾個相關的授權機制的數據表被搜索的順序為:user,db,host。也就是說,我們將首先首先檢索user數據表,找到第一個匹配的記錄,我們把在user數據表中首先匹配的記錄稱之為Priv;然後搜索db表,獲得相應的授權。如果在db數據表相應記錄中host字段的為空,並且Priv記錄中主機也被包含在host表的host字段之中,這樣的話,對於某個user來說,則可以在user表中加入在host表中的一些為“Y”的權限設定。如果在db表中的host字段不為空的話,那麼也就不會對該用戶/主機的授權產生什麼影響了。
了解了這一點之後,我們需要討論在各個數據表中的記錄的搜索的優先權的問題,也就是說,怎樣確定第一匹配的記錄,這並不是按照數據表中的記錄的自然先後順序來確定的。在各個數據表內的各條記錄的優先權排列如下:
(1)user表:根據先host後user的順序確定。搜索規則如下:不包含統配符的記錄,包含統配符的記錄,空記錄。而在同樣一個host裡面,繼續按照user來排列,規則和上述的一樣。
(2)db表:檢索的順序根據host字段確定:不包含統配符的記錄,包含統配符的記錄,空記錄。
(3)host表:檢索的順序根據host字段確定:不包含統配符的記錄,包含統配符的記錄,空記錄。我們用下面的例子來說明進行匹配搜索的規則:請記住如果你更改了這些數據表,你必須使用MySQLadmin reload使其生效。
下面是演示系統是如何進行搜索的:
+-----------+---------+-
| Host | User | ...
+-----------+---------+-
| % | root | ...
| % | jeffrey | ...
| localhost | root | ...
| localhost | | ...
+-----------+---------+-
搜索的順序應當是:
localhost/root
localhost/any
any/jeffrey
any/root
這樣,如果在localhost的用戶jeffrey要連接數據庫的話,那麼其授權應當根據localhost/“任意” 行所規定的權限而非“任意”/jeffrey行所規定的權限,請大家注意這一點,因為如果不合適的配置完全可能