MySQL授權表學習

  一、MySQL授權表概述

      MySQL服務器的特點之一是,它在控制每個用戶行爲方面提供了極大的靈活性。例如,我們既可以限制用戶訪問整個數據庫,也可以限制用戶訪問數據庫中特定的表,或者禁止訪問特定表中的特定列。由此看出MySQL服務器在用戶授權方面的靈活性。本文將向大家詳細介紹MySQL服務器是如何處理用戶權限的授與/撤回的,尤其是MySQL的授權表tables_priv和columns_priv。

  MySQL的授權系統通常是通過MySQL數據庫中的五個表來實現的,這些表有user、db、host、tables_priv和columns_priv。這些表的用途各有不同,但是有一點是一致的,那就是都能夠檢驗用戶要做的事情是否爲被允許的。每個表的字段都可分解爲兩類,一類爲作用域字段,一類爲權限字段。作用域字段用來標識主機、用戶或者數據庫;而權限字段則用來確定對於給定主機、用戶或者數據庫來說,哪些動作是允許的。下面,我們對這些表的作用做簡單介紹:

      user表——該表決定是否允許用戶連接到服務器。如果允許連接,權限字段則爲該用戶的全局權限。

  db表——用於決定哪些用戶可以從哪些主機訪問哪些數據庫。包含在db表中的權限適用於這個表標識的數據庫。

  host表——當您想在db表的範圍之內擴展一個條目時,就會用到這個表。舉例來說,如果某個db允許通過多個主機訪問的話,那麼超級用戶就可以讓db表內將host列爲空,然後用必要的主機名填充host表。

  tables_priv表——該表與db表相似,不同之處是它用於表而不是數據庫。這個表還包含一個其他字段類型,包括timestamp和grantor兩個字段,用於存儲時間戳和授權方。在本文後面我們會對這個表做進一步的講解。

  columns_priv——該表作用幾乎與db和tables_priv表一樣,不同之處是它提供的是針對某些表的特定列的權限。這個表也多出了一個字段類型,即其他字段,包括了一個timestamp列,用於存放時間戳。 在本文後面部分,我們還會對columns_priv表做進一步的說明。

下面,我們通過如下幾個方面對MySQL用戶授權過程加以介紹:首先介紹MySQL訪問控制過程,解答MySQL授權表是如何工作的;然後,我們介紹tables_priv和columns_priv授權表,我們會給出與MySQL的tables_priv表有關的解釋和範例。最後,我們介紹與columns_priv授權表有關的解釋和若干範例。

、MySQL服務器的訪問控制

現在讓我們來看看MySQL服務器是如何通過用戶特權來控制用戶訪問的。雖然這乍聽起來好像挺嚇人的,但是通過一個例子的演示,您就會發現其實事情沒有我們想象的那麼難以理解。

  首先,對用戶的訪問進行控制的時候,系統需要查看作爲過濾器的一些授權表,這些表的使用過程是從一般到特殊,這些表包括:

User表

  Db表

  Host表

  Tables_priv 表

  Columns_priv 表

  此外,一旦連接到了服務器,一個用戶可以使用兩種類型的請求:

  管理請求(shutdown,reload,等)

  數據庫相關的請求(insert,delete,等)

您可能已經注意到了,這些授權表的內容好像有些重複,例如user表中有select權限,同時host和user表中也有同樣的權限。但是,這樣做自有其道理。我們可以考慮一下user表中全局性的與數據庫相關的權限,也就是說,在這個表中授予用戶的權限對服務器上的所有數據庫都有效。這些權限可以被認爲是超級用戶權限。相反,包含在host和db表之內的與數據庫相關的權限則是特定於主機或者數據庫的。因此,讓這個表內所有的權限保持爲“N”不失爲一個明智的選擇。

情景1:失敗的連接嘗試

  用戶“alessia”連接服務器時將被拒絕。因爲,主機、用戶和/或密碼與保持在user表中的不匹配, 所以會拒絕用戶的請求。

  情景2:user表中數據庫權限爲N,db表中數據庫權限爲Y

  1. 用戶wj嘗試連接時將會成功。

  2. 用戶wj試圖在數據庫oats上執行Select命令。

  3. 服務器查看user表,對應於Select命令的條目的值爲N,即表示拒絕。

  4. 服務器然後查看db表,對應於Select命令的表項的值爲Y,即表示允許。

  5. 該請求將成功執行,因爲該用戶的db表中的SELECT字段的值爲Y。

  情景3:user表中數據庫權限爲Y,db表中數據庫權限爲N

  1. 用戶wj嘗試連接時將會成功。

  2. 用戶wj試圖在數據庫oats上執行Select命令。

  3. 服務器查看user表,對應於Select命令的表項的值爲Y,即表示允許。 因爲在user表之內授與的權限是全局性的,所以該請求會成功執行。

  情景4:user表中數據庫權限爲N,db表中數據庫權限爲N

  1. 用戶wj嘗試連接時將會成功。

  2. 用戶wj試圖在數據庫oats上執行Select命令。

  3. 服務器查看user表,對應於Select命令的表項的值爲N,即表示拒絕。

  4. 服務器現在會查看db表,對應於Select命令的表項的值爲N,即表示拒絕。

  5. 服務器現在將查找tables_priv和columns_priv表。如果用戶的請求符合表中賦予的權限,則准予訪問。 否則,訪問就會被拒絕。

  對於tables_priv和columns_priv表,後面會進一步加以詳述。

  情景5:讓我們假定下列情況爲真:

  user表中用戶wj的host字段的值爲%。

  db表中用戶wj對應的host字段的值爲空。

這時會發生什麼情況呢?

  1. 用戶wj嘗試通過一個給定主機進行連接。

  2. 假設密碼是正確的,那麼就會連接成功,因爲user表指出只要是通過用戶名wj和有關密碼進行連接的話,任何(字符%所代表的含義)主機都是允許的。

  3. MySQL服務器將查找db表,不過,這裏沒有指定主機。

  4. MySQL服務器現在將查看host表。如果該用戶要連接的數據庫以及用戶建立連接時所在主機的名稱都位於host表中,那麼該用戶就能夠按照host表中所列出的權限來執行命令。 否則的話,用戶將無法執行命令,實際上更本就無法連接。

  通過了解上述情形,讀者就應該對授權系統有一定了解了。下面,我們再來仔細聊聊tables_priv表和columns_priv表。

  三、Tables_priv表與columns_priv表

在上面介紹的五種授權表中,tables_priv和columns_priv是後來加入進來的,它們的主要目的是提供細粒度的用戶控制。這兩個表與授權表db非常類似,但是其控制的範圍更加細緻,即特定數據庫中的特定的表。前面說過,超級用戶可以通過授權表db來限制用戶在一個數據庫中的行爲,有了這兩個授權表,超級用戶可以進一步控制用戶針對每個表和每個字段的動作。所以,這給超級用戶提供了更加靈活的控制選項。

在深入學習對數據表的訪問控制之前,首先讓我們瞭解一下下列特性:

  通配符可以用於這兩個表的host字段,但是不允許在Db、Table_name和Column_name字段使用通配符。

權限字段被聲明爲SET字段。

  tables_priv和columns_priv表只應當通過GRANT/REVOKE命令進行修改。通過INSERT命令向這兩個表插入數據會導致服務器不穩定!

  tables_priv表中的table_priv字段可以允許下列命令:Select、Insert、Update、Delete、Create、Drop、Grant、References、Index和Alter。

  tables_priv表中的column_priv字段允許下列命令:Select、Insert、Update和References。

  columns_priv表中的type字段允許下列命令:Select、Insert、Update和References。

  授權表tables_priv

 

下面簡要介紹各tables_priv字段的含義:

Host——適用於那些主機?

  Db——適用於從上面的主機所連接的哪些數據庫?

  User——適用於來自上述主機的哪些用戶?

  Table_name——適用於上述數據庫中的哪些表?

  Table_priv——爲這個表賦予哪些權限?

  Column_priv——爲這個表中的個字段賦予哪些權限?

  Timestamp——這個權限是何時賦予的?

  Grantor——誰授與該用戶的這個權限?

  要想真正弄懂tables_priv表,最好的辦法就是通過實例進行學習,下面我們就給出一些例子。

  例1:

  %>GRANT SELECT ON italy TO [email protected];

  這條命令的作用是什麼?以上命令允許來自主機314interactive.com的用戶wj在表italy上至下一個SELECT語句。請記住,只有當給定數據庫/主機和用戶名對應的db或者host表中的SELECT字段的值爲N時,才需要訪問這個表。如果給定數據庫/主機和用戶名對應的db或者host表中的SELECT字段中有一個值爲Y的話,那麼就無需控制該tables_priv表。

  例2:

  %>GRANT SELECT, INSERT ON oats.italy TO [email protected];

  這條命令的作用是什麼?以上命令允許來自主機314interactive.com的用戶wj對數據庫oats中的數據表italy執行SELECT和INSERT語句。

  例3:

  %>REVOKE SELECT on oats.italy from [email protected]

  這條命令的作用是什麼?以上命令撤消來自主機314interactive.com的用戶wj對數據庫oats中的表italy的執行SELECT的權限。

  重要的是要認識到,包含在tables_priv中的信息僅當host/db表不允許用戶執行要求的功能所需的權限時才生效。如果給定的權限在host/db表中爲Y,那麼就無需考察tables_priv表。

  例4:

  %>GRANT SELECT(id,name,address,phone),update(address,phone) ON

  company.customers TO [email protected];

  這條命令的作用是什麼?以上命令將授予對company數據庫中customers表內id、name、address和phone字段執行SELECT的權限,以及對address和phone字段執行UPDATE的權限。

  這將帶來哪些影響?這條命令會修改tables_priv表和columns_priv表,這是因爲它引用這兩個表和表內特定的字段。

  例5:

  %>REVOKE UPDATE(address,phone) ON company.customers FROM [email protected];

  這條命令的作用是什麼?這個命令將撤消對company數據庫中customers表內的address和phone字段執行UPDATE操作的權限。

  這將帶來哪些影響?因爲該命令直接涉及給定表中的某些字段,所以columns_priv表以及tables_priv表也會更新。

  前面說過,只有在必須的情況下才會使用授權表,舉例來說,如果高優先級的表提供了適當的權限的話,那麼就無需查閱優先級較低的授權表了。如果高優先級的表中對應命令的值爲N,那麼就需要進一步查看低優先級的授權表。

  四、小結

  在本文中,我們爲讀者詳細介紹了MySQL的授權表,並通過一些實例來講解MySQL是如何提高這些授權表來實現用戶訪問控制的。我們首先介紹了MySQL訪問控制過程,解答了MySQL授權表是如何工作的;然後,我們介紹了tables_priv和columns_priv授權表,並提供了與MySQL的tables_priv表有關的解釋和範例。最後,我們介紹了columns_priv授權表並給出了若干範例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章