MYSQL使用者帳號管理

來源:互聯網
上載者:User
mysql|帳號管理     MySQL管理員應該知道怎樣通過指定哪些使用者可串連到伺服器、從哪裡進行串連,以及在串連時做什麼,來設定MySQL使用者帳號。MySQL3.22.11引入了兩個更容易進行這項工作的語句:GRANT 語句建立MySQL使用者並指定其許可權,REVOKE 語句刪除許可權。這兩個語
句充當mysql資料庫中的授權表的前端,並提供直接操縱這些表內容的可選擇的方法。GRANT 和REVOKE 語句影響以下四個表:

授權表 內容
user 可串連到伺服器的使用者和他們擁有的任何全域特權
db 資料庫級的特權
tables _ priv 表級特權
c o l um n s _ priv 列級特權

    還有第五個授權表( host),但它不受GRANT 或REVOKE 的影響。
    當您為某個使用者發布GRANT 語句時,應在user 表中為該使用者建立一個項。如果該語句指定了所有全域特權(系統管理權限或用於所有資料庫的許可權),則這些指定也被記錄在user 表中。如果指定了資料庫、表或列的許可權,它們將記錄在db、tables_priv 和columns_priv 表中。
    使用GRANT 和REVOKE 語句比直接修改授權表更容易。但是,建議您最好通過閱讀第12章來補充本章的內容,第12章中詳細討論了授權表。這些表非常重要,作為一位管理員應該瞭解這些表是怎樣在GRANT 和REVOKE 語句級上工作的。
    本節下面的部分將討論如何設定MySQL使用者的帳號和授權,還將介紹如何取消許可權以及從授權表中刪除全部使用者,並且將考慮一個困擾許多新的MySQL管理員的難題。
    您還要考慮使用mysqlaccess 和mysql_setpermission 指令碼,它們是MySQL分發包的組成部分。這些是Perl 的指令碼,它們提供了設定使用者帳號的GRANT 語句的代用品。mysql_setpermission 需要具有DBI 的支援環境。

建立新使用者和授權

    GRANT 語句的文法如下:
    GRANT privileges (columns)
        ON what
        TO user IDENTIFIEDBY "password"
        WITH GRANT OPTION
    要使用該語句,需要填寫以下部分:
    privileges 分配給使用者的許可權。下表列出了可在GRANT 語句中使用的許可權說明符:
    許可權說明符許可權允許的操作

    上表顯示的第一組許可權說明符適用於資料庫、表和列。第二組說明符是管理特權。通常,這些許可權的授予相當保守,因為它們會影響伺服器的操作(例如, SHUTDOWN 特權不是按每天來分發的許可權)。第三組說明符是特殊的。ALL 的意思是“所有的許可權”,而USAGE 的
意思是“無許可權”─即建立使用者,但不授予任何的許可權。
    columns 許可權適用的列。這是可選的,只來設定列專有的許可權。如果命名多於一個列,則用逗號分開。
    what 許可權應用的層級。許可權可以是全域的(適用於所有資料庫和所有的表)、資料庫專有的(適用於某個資料庫中的所有表),或表專有的。可以通過指定一個C O L U M N S子句將許可權授予特定的列。
    user 使用許可權的使用者。它由使用者名稱和主機名稱組成。在MySQL中,不僅指定誰進行串連,還要指定從哪裡串連。它允許您擁有兩個帶有相同名字的、從不同位置串連的使用者。MySQL允許在它們之間進行區別並相互獨立地分配許可權。
    MySQL的使用者名稱就是您在串連到伺服器時指定的名字。該名字與您的UNIX 註冊名或Windows 名的沒有必然連繫。預設設定時,客戶機程式將使用您註冊的名字作為MySQL的使用者名稱(如果您不明確指定一個名字的話),但這隻是一個約定。有關將root 作為可以
操作一切MySQL的超級使用者名稱也是這樣,就是一種約定。您也可以在授權表中將此名修改成n o b o d y,然後作為nobody 使用者進行串連,以執行需要超級使用者特權的操作。
    password 分配給該使用者的口令。這是可選的。如果您不給新使用者指定IDENTIFIEDBY子句,該使用者不分配口令(是非安全的)。對於已有的使用者,任何指定的口令將替代舊口令。如果不指定新口令,使用者的舊口令仍然保持不變。當您確實要使用ID E N T I F I E DBY 時,該口令串應該是直接量,GRANT 將對口令進行編碼。當用SET PA S S W O R D語句時,不要使用PASSWORD() 函數。
    WITH GRANT OPTION 子句是可選的。如果包含該子句,該使用者可以將GRANT 語句授予的任何許可權授予其他的使用者。可以使用該子句將授權的能力授予其他的使用者。
    使用者名稱、口令以及資料庫和表的名稱在授權表項中是區分大小寫,而主機名稱和列名則不是。
    通過查詢某些問題,通常可以推斷出所需的GRANT 語句的類型:
    誰可以進行串連,從哪裡串連?
    使用者應具有什麼層級的許可權,這些許可權適用於什嗎?
    允許使用者系統管理權限嗎?
    讓我們來提問這些問題,同時看一些利用GRANT 語句設定MySQL使用者帳號的例子。
    1. 誰可以進行串連,從哪裡串連
    您可以允許使用者在特定的主機或涉及範圍很寬的一組主機中進行串連。在一個極端,如果知道使用者將僅從那個主機中進行串連,則可限定對單個主機的訪問:
    GRANT ALL ON samp_db.* TO boris@localhost IDENTFIEDBY "ruby"
    GRANT ALL ON samp_db.* TO fred@ares.mars.net IDENTFIEDBY "quartz"
    (符號samp_db.* 含義是“在samp_db 資料庫中的所有表”)在另一個極端,您可能會有一個使用者m a x,他週遊世界並需要能夠從世界各地的主機中進行串連。在這種情況下,無論他從哪裡串連您都將允許:
    GRANT ALL ON samp_db.* TO max@% IDENTFIEDBY "diamond"
    ‘%’字元起萬用字元的作用,與LIKE 模式比對的含義相同,在上個語句中,它的意思是“任何主機”。如果您根本不給出主機名稱部分,則它與指定“ %”的含義相同。因此, max 和max@% 是等價的。這是設定一個使用者最容易的方法,但安全性最小。
    要想採取妥協的辦法,可允許使用者在一組有限的主機中進行串連。例如,要使mary 從snake.net 域的任何主機中進行串連,可使用%.snake.net 主機說明符:
    GRANT ALL ON samp_db.* TO mary@%.snake.net IDENTFIEDBY "topaz"
    該使用者識別碼的主機部分可用IP 位址而不是主機名稱給出(如果願意的話)。可以指定一個直接的IP 位址或包含模式字元的地址。同樣,自MySQL3.23 起,可以用一個網路遮罩來指定IP 號,網路遮罩表明了用於該網路號的二進位位元:
    GRANT ALL ON samp_db.* TO joe@192.168.0.3 IDENTIFIEDBY "water"
    GRANT ALL ON samp_db.* TO ardis@192.168.128.% IDENTIFIEDBY "snow"
    GRANT ALL ON samp_db.* TO rex@192.168.128.0/17 IDENTIFIEDBY "ice"
    第一條語句指明使用者可進行串連的特定的主機。第二條語句指定129.168.128 Class C 子網的IP 模式。在第三條語句中, 192.168.128.0/17 指定一個17 位二進位的網路號,並將任何主機與其IP 位址的前17 個二進位位中的192.168.128.0/17 進行匹配。
    如果MySQL抱怨您指定的使用者值,則可能需要使用引號(但對使用者名稱和主機名稱分別加引號):
    GRANT ALL ON samp_db.president TO "my friend"@"boa.snake.net"
    2. 使用者應具有什麼層級的許可權,這些許可權適用於什麼
    您可授予不同層級的許可權。全域許可權的功能最強,因為它們適用於任何資料庫。為了使ethel 成為可以進行一切操作的超級使用者(其中包括可以對其他使用者授權),發布下列語句:
    GRANT ALL ON *.* TO ethel@localhost IDENTIFIEDBY "coffee"
        WITH GRANT OPTION
    ON 子句中*.* 說明符的意思是“所有資料庫,所有的表”,為保險起見,我們已經指定ethel 只能從本地主機中串連。限制超級使用者從哪些主機上進行串連通常是明智的做法,因為它限制住了其他使用者對口令進行試探。
    有些許可權( F I L E、P R O C E S S、RELOAD 和S H U T D O W N)是系統管理權限,只能用NO *.* 全域許可權說明符來授予。如果希望的話,也可以不用授予資料庫級的許可權來授予這些許可權。例如,下列語句建立了一個flush 使用者,它除了發布FLUSH 語句外不做其他任何事情。在管理指令碼中這可能是有用的,因為需要在這些指令碼中執行諸如在記錄檔迴圈期間重新整理日誌的操作:
    GRANT RELOAD ON *.* TO flush@localhost IDENTIFIEDBY "flushpass"
    通常授予系統管理權限應該是保守的,因為具有這些許可權的使用者可能影響伺服器的操作。
    資料庫級的許可權適用於特定資料庫中的所有表。這些許可權使用ON db_name.* 子句進行授予:
    GRANT ALL ON samp_db.* TO bill@racer.snake.net IDENTIFIEDBY "rock"
    GRANT SELECT ON menagerie.* TO ro_user@% IDENTIFIEDBY "dirt"
    第一條語句將bill 的所有許可權授予samp_db 資料庫的任何錶。第二條語句建立一個限制訪問的使用者r o _ user(唯讀使用者),它可以訪問menagerie 資料庫的所有表,但只能讀取。也就是說,該使用者只能發布SELECT 語句。
    怎樣在授權表項中指定本地主機名稱
    如果您使用伺服器的主機名稱而非localhost,通常存在從該伺服器主機串連的問題。這可能是由於在授權表中指定名字的方法和名字分解器常式( name reslover routine)向程式報告名字的方法之間的錯誤匹配。如果分解器報告了一個非限定的名字(如p i t - v i per),但授權表包含了具有全限定的名字的項(如p i t - v i per. s n a k e . n e t,反之亦然),則發生錯誤匹配。
    為了確定這種情況是否正在系統中發生,可試著用-h 選項串連到本機伺服器,該選項指定了主機的名字。然後查看伺服器的常規記錄檔。它是怎樣報告主機名稱的?是以非限定形式還是限定形式?不論它是哪種形式,都將告訴您在發布GRANT 語句時需要怎樣指定使用者說明符的主機名稱部分。
    可以同時列出許多被授予的單個許可權。例如,如果想讓使用者能讀取和修改已有表的內容,但又不允許建立新表或刪除表,可按如下授權:
    GRANT SELECT,INSERT,DELETE,UPDATE ON samp_db.* TO jennie@%
        IDENTIFIEDBY "boron"
    對於更小粒度( f i n e - g r a i n e d)的存取控制,可以在單個表上授權,甚至在表的單個列上授權。當存在要對使用者隱藏的表時,或者,當只允許使用者修改特定列時,列專有的許可權是有用的。假定曆史同盟會中有一些志願者利用您作為同盟會秘書應履行的職責來協助您工作。這是一個好訊息,但您決定首先給新的助手授予對member 表唯讀許可權(該表中包含了會員資格的資訊),然後再對他們增加授予該表的expiration 列的列專有UPDATE許可權。也就是說,您的助手可以在人們更新其會員資格時變更到期日的工作。設定此MySQL使用者的語句如下:

    第一條語句授予對整個member 表的讀訪問權並設定口令。第二條語句增加UPDATE許可權,但只是對expiration 列。此時不必要再指定口令,因為在第一條語句中已經完成了。
    如果想要為多個列授予列專有的許可權,可指定一個列清單,並用逗號將這些列分隔。例如,為了給assistant 使用者增加對member 表地址列的UPDATE許可權,可以使用下列語句。新的許可權將被增加到對該使用者來說已經存在的所有列上:
    GRANT UPDATE (street,city,state,zip) ON samp_db.member
        TO assistant@localhost
    通常,不要給使用者授予比實際需要更大的許可權。但是,當您想要使使用者能夠建立儲存中間結果的暫存資料表,而又不允許使用者在包含有他們不能修改的資料的資料庫中這樣做時,就有了要在資料庫上授予相當多的許可許可權的理由。您可以建立一個單獨的資料庫(筆者稱它為
t m p)並授予使用者該資料庫的所有許可權。例如,如果想要mars.net 域的主機中的任何使用者都能夠使用tmp 資料庫,可發布下列GRANT 語句:
    GRANT ALL ON tmp.* TO ""@%.mars.net
    在完成這些之後,使用者可使用tmp.tbl_name 格式的名字建立和引用tmp 資料庫中的表(使用者說明符中的“” 建立一個匿名使用者項,任何使用者都與空白使用者名稱相匹配)。
    3. 允許使用者系統管理權限嗎
    通過授予資料庫擁有者資料庫的所有許可權並在操作時指定WITH GRANT OPTION,可以允許資料庫擁有者控制對該資料庫的訪問。例如,如果要讓alicia 能在big.corp.com 域的所有主機中進行串連並管理sales 資料庫中所有表的許可權,應使用下列GRANT 語句:

    實際上,WITH GRANT OPTION 子句允許將訪問的權利授予給另一個使用者。要知道,具有GRANT 許可權的兩個使用者可以相互授予自己的許可權。如果只給一個使用者授予SELECT 許可權而給另一個使用者除SELECT 外還授予了GRANT 和其他的許可權,則第二個使用者可以使第一個使用者“強大”起來。

取消許可權和刪除使用者

    為了收回某個使用者的許可權,可使用REVOKE 語句。除了要用FROM 替換TO 並且沒有IDENTIFIEDBY 或WITH GRANT OPTION 子句外,REVOKE 的文法與GRANT 語句非常相似:
    REVOKE privileges (columns) ON what FROM user
    user 部分必須與您想要取消其許可權的使用者的原始GRANT 語句的user 部分相匹配。priv i l e g e s 部分不需要匹配,您可用GRANT 語句授權,然後用REVOKE 語句取消其中的一部分。REVOKE 語句只刪除許可權,不刪除使用者。使用者的項仍然保留在user 表中,即使您取消了該使用者的所有許可權也是如此。這意味著該使用者仍然可串連到伺服器上。要想刪除整個使用者,必須用DELETE 語句將該使用者的記錄從user 表中直接刪除:

    DELETE 語句刪除該使用者的項, FLUSH 語句告訴伺服器重新載入授權表(當使用GRANT 或REVOKE 語句,而不是直接修改授權表時,這些表將自動重新載入)。
    11.4 節將討論為什麼刪除user 表項的原因。
    一個許可權難題,第一部分
    下面是一個在MySQL郵件清單中反覆出現的情況:一位新的MySQL管理員給某使用者增加一個項,使用了主機名稱部分,該部分是用一個模式來指定的。例如:
    GRANT ALL ON samp_db.* TO fred@%.snake.net IDENTIFIEDBY "cocoa"
    這裡的意圖是允許使用者fred 從snake.net 域的所有主機中進行串連,並且具有對samp_db 資料庫的所有許可權。事實上, fred 能夠從那些主機中串連(除了伺服器主機本身外)。當fred 試著從伺服器主機中進行串連時,該企圖以“訪問被拒絕”的訊息而告失敗。
即使使用者指定了正確的口令也是如此。
    如果授權表中包含了由mysql_install_db 安裝指令碼安裝的預設項,這種情況也會發生。其原因是,當伺服器驗證fred 串連的企圖時,一個匿名使用者項( anonymous-user entry)比fred 項優先。匿名使用者項要求該使用者不用口令來串連,並且一個口令錯誤匹配發生。
該問題的另一個背景將在第12章“許可權難題,第二部分”中給出。目前,只要說修正此問題的方法是從user 表中刪除匿名使用者項就足夠了,我們不能用R E V O K E,因為該命令只刪除許可權。要想完全擺脫這些匿名項,執行如下操作:
    % mysql-uroot mysql    mysql> DELETE FROM user where User="";
    mysql>FLUSH PRIVILEGES;
    現在,當fred 試圖從本地主機串連時成功了。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.