數(shù)據(jù)庫的用戶帳號管理基礎(chǔ)知識
更新時間:2006年11月21日 00:00:00 作者:
MySQL管理員應(yīng)該知道怎樣通過指定哪些用戶可連接到服務(wù)器、從哪里進(jìn)行連接,以及在連接時做什么,來設(shè)置MySQL用戶賬號。MySQL3.22.11引入了兩個更容易進(jìn)行這項工作的語句:GRANT 語句創(chuàng)建MySQL用戶并指定其權(quán)限,REVOKE 語句刪除權(quán)限。這兩個語句充當(dāng)mysql數(shù)據(jù)庫中的授權(quán)表的前端,并提供直接操縱這些表內(nèi)容的可選擇的方法。GRANT 和REVOKE 語句影響以下四個表:
授權(quán)表 內(nèi)容
user 可連接到服務(wù)器的用戶和他們擁有的任何全局特權(quán)
db 數(shù)據(jù)庫級的特權(quán)
tables _ priv 表級特權(quán)
c o l um n s _ priv 列級特權(quán)
還有第五個授權(quán)表( host),但它不受GRANT 或REVOKE的影響。
當(dāng)您為某個用戶發(fā)布GRANT 語句時,應(yīng)在user表中為該用戶創(chuàng)建一個項。如果該語句指定了所有全局特權(quán)(管理權(quán)限或用于所有數(shù)據(jù)庫的權(quán)限),則這些指定也被記錄在user表中。如果指定了數(shù)據(jù)庫、表或列的權(quán)限,它們將記錄在db、tables_priv 和columns_priv表中。
使用GRANT 和REVOKE語句比直接修改授權(quán)表更容易。但是,建議您最好通過閱讀第12章來補(bǔ)充本章的內(nèi)容,第12章中詳細(xì)討論了授權(quán)表。這些表非常重要,作為一位管理員應(yīng)該了解這些表是怎樣在GRANT 和REVOKE 語句級上工作的。
本節(jié)下面的部分將討論如何設(shè)置MySQL用戶的賬號和授權(quán),還將介紹如何取消權(quán)限以及從授權(quán)表中刪除全部用戶,并且將考慮一個困擾許多新的MySQL管理員的難題。
您還要考慮使用mysqlaccess 和mysql_setpermission 腳本,它們是MySQL分發(fā)包的組成部分。這些是Perl 的腳本,它們提供了設(shè)置用戶賬號的GRANT 語句的代用品。mysql_setpermission 需要具有DBI 的支持環(huán)境。
創(chuàng)建新用戶和授權(quán)
GRANT 語句的語法如下:
GRANT privileges (columns)
ON what
TO user IDENTIFIEDBY "password"
WITH GRANT OPTION
要使用該語句,需要填寫以下部分:
privileges 分配給用戶的權(quán)限。下表列出了可在GRANT 語句中使用的權(quán)限說明符:
權(quán)限說明符權(quán)限允許的操作
上表顯示的第一組權(quán)限說明符適用于數(shù)據(jù)庫、表和列。第二組說明符是管理特權(quán)。通常,這些權(quán)限的授予相當(dāng)保守,因為它們會影響服務(wù)器的操作(例如, SHUTDOWN 特權(quán)不是按每天來分發(fā)的權(quán)限)。第三組說明符是特殊的。ALL的意思是“所有的權(quán)限”,而USAGE 的意思是“無權(quán)限”─即創(chuàng)建用戶,但不授予任何的權(quán)限。
columns 權(quán)限適用的列。這是可選的,只來設(shè)置列專有的權(quán)限。如果命名多于一個列,則用逗號分開。
what 權(quán)限應(yīng)用的級別。權(quán)限可以是全局的(適用于所有數(shù)據(jù)庫和所有的表)、數(shù)據(jù)庫專有的(適用于某個數(shù)據(jù)庫中的所有表),或表專有的。可以通過指定一個C O L U M N S子句將權(quán)限授予特定的列。
user 使用權(quán)限的用戶。它由用戶名和主機(jī)名組成。在MySQL中,不僅指定誰進(jìn)行連接,還要指定從哪里連接。它允許您擁有兩個帶有相同名字的、從不同位置連接的用戶。MySQL允許在它們之間進(jìn)行區(qū)別并相互獨立地分配權(quán)限。
MySQL的用戶名就是您在連接到服務(wù)器時指定的名字。該名字與您的UNIX 注冊名或Windows 名的沒有必然連系。缺省設(shè)置時,客戶機(jī)程序?qū)⑹褂媚缘拿肿鳛镸ySQL的用戶名(如果您不明確指定一個名字的話),但這只是一個約定。有關(guān)將root作為可以操作一切MySQL的超級用戶名也是這樣,就是一種約定。您也可以在授權(quán)表中將此名修改成nobody,然后作為nobody 用戶進(jìn)行連接,以執(zhí)行需要超級用戶特權(quán)的操作。
password 分配給該用戶的口令。這是可選的。如果您不給新用戶指定IDENTIFIEDBY子句,該用戶不分配口令(是非安全的)。對于已有的用戶,任何指定的口令將替代舊口令。如果不指定新口令,用戶的舊口令仍然保持不變。當(dāng)您確實要使用ID E N T I F I E DBY 時,該口令串應(yīng)該是直接量,GRANT 將對口令進(jìn)行編碼。當(dāng)用SET PA S S W O R D語句時,不要使用PASSWORD() 函數(shù)。
WITH GRANT OPTION 子句是可選的。如果包含該子句,該用戶可以將GRANT 語句授予的任何權(quán)限授予其他的用戶??梢允褂迷撟泳鋵⑹跈?quán)的能力授予其他的用戶。
用戶名、口令以及數(shù)據(jù)庫和表的名稱在授權(quán)表項中是區(qū)分大小寫的,而主機(jī)名和列名則不是。
通過查詢某些問題,通??梢酝茢喑鏊璧腉RANT 語句的類型:
誰可以進(jìn)行連接,從哪里連接?
用戶應(yīng)具有什么級別的權(quán)限,這些權(quán)限適用于什么?
允許用戶管理權(quán)限嗎?
讓我們來提問這些問題,同時看一些利用GRANT 語句設(shè)置MySQL用戶賬號的例子。
1. 誰可以進(jìn)行連接,從哪里連接
您可以允許用戶在特定的主機(jī)或涉及范圍很寬的一組主機(jī)中進(jìn)行連接。在一個極端,如果知道用戶將僅從那個主機(jī)中進(jìn)行連接,則可限定對單個主機(jī)的訪問:
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 數(shù)據(jù)庫中的所有表”)在另一個極端,您可能會有一個用戶m a x,他周游世界并需要能夠從世界各地的主機(jī)中進(jìn)行連接。在這種情況下,無論他從哪里連接您都將允許:
GRANT ALL ON samp_db.* TO max@% IDENTFIEDBY "diamond"
‘%'字符起通配符的作用,與LIKE模式匹配的含義相同,在上個語句中,它的意思是“任何主機(jī)”。如果您根本不給出主機(jī)名部分,則它與指定“ %”的含義相同。因此, max和max@%是等價的。這是設(shè)置一個用戶最容易的方法,但安全性最小。
要想采取妥協(xié)的辦法,可允許用戶在一組有限的主機(jī)中進(jìn)行連接。例如,要使mary 從snake.net 域的任何主機(jī)中進(jìn)行連接,可使用%.snake.net 主機(jī)說明符:
GRANT ALL ON samp_db.* TO mary@%.snake.net IDENTFIEDBY "topaz"
該用戶標(biāo)識符的主機(jī)部分可用IP 地址而不是主機(jī)名給出(如果愿意的話)??梢灾付ㄒ粋€直接的IP 地址或包含模式字符的地址。同樣,自MySQL3.23 起,可以用一個網(wǎng)絡(luò)掩碼來指定IP 號,網(wǎng)絡(luò)掩碼表明了用于該網(wǎng)絡(luò)號的二進(jìn)制位數(shù):
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"
第一條語句指明用戶可進(jìn)行連接的特定的主機(jī)。第二條語句指定129.168.128 Class C 子網(wǎng)的IP 模式。在第三條語句中, 192.168.128.0/17 指定一個17 位二進(jìn)制的網(wǎng)絡(luò)號,并將任何主機(jī)與其IP 地址的前17 個二進(jìn)制位中的192.168.128.0/17 進(jìn)行匹配。
如果MySQL抱怨您指定的用戶值,則可能需要使用引號(但對用戶名和主機(jī)名分別加引號):
GRANT ALL ON samp_db.president TO "my friend"@"boa.snake.net"
2. 用戶應(yīng)具有什么級別的權(quán)限,這些權(quán)限適用于什么
您可授予不同級別的權(quán)限。全局權(quán)限的功能最強(qiáng),因為它們適用于任何數(shù)據(jù)庫。為了使ethel 成為可以進(jìn)行一切操作的超級用戶(其中包括可以對其他用戶授權(quán)),發(fā)布下列語句:
GRANT ALL ON *.* TO ethel@localhost IDENTIFIEDBY "coffee"
WITH GRANT OPTION
ON 子句中*.* 說明符的意思是“所有數(shù)據(jù)庫,所有的表”,為保險起見,我們已經(jīng)指定ethel 只能從本地主機(jī)中連接。限制超級用戶從哪些主機(jī)上進(jìn)行連接通常是明智的做法,因為它限制住了其他用戶對口令進(jìn)行試探。
有些權(quán)限( F I L E、P R O C E S S、RELOAD 和S H U T D O W N)是管理權(quán)限,只能用NO *.* 全局權(quán)限說明符來授予。如果希望的話,也可以不用授予數(shù)據(jù)庫級的權(quán)限來授予這些權(quán)限。例如,下列語句建立了一個flush 用戶,它除了發(fā)布FLUSH語句外不做其他任何事情。在管理腳本中這可能是有用的,因為需要在這些腳本中執(zhí)行諸如在日志文件循環(huán)期間刷新日志的操作:
GRANT RELOAD ON *.* TO flush@localhost IDENTIFIEDBY "flushpass"
通常授予管理權(quán)限應(yīng)該是保守的,因為具有這些權(quán)限的用戶可能影響服務(wù)器的操作。
數(shù)據(jù)庫級的權(quán)限適用于特定數(shù)據(jù)庫中的所有表。這些權(quán)限使用ON db_name.* 子句進(jìn)行授予:
GRANT ALL ON samp_db.* TO bill@racer.snake.net IDENTIFIEDBY "rock"
GRANT SELECT ON menagerie.* TO ro_user@% IDENTIFIEDBY "dirt"
第一條語句將bill 的所有權(quán)限授予samp_db 數(shù)據(jù)庫的任何表。第二條語句創(chuàng)建一個限制訪問的用戶r o _ user(只讀用戶),它可以訪問menagerie 數(shù)據(jù)庫的所有表,但只能讀取。也就是說,該用戶只能發(fā)布SELECT 語句。
怎樣在授權(quán)表項中指定本地主機(jī)名
如果您使用服務(wù)器的主機(jī)名而非localhost,通常存在從該服務(wù)器主機(jī)連接的問題。這可能是由于在授權(quán)表中指定名字的方法和名字分解器例程( name reslover routine)向程序報告名字的方法之間的錯誤匹配。如果分解器報告了一個非限定的名字(如p i t - v i per),但授權(quán)表包含了具有全限定的名字的項(如p i t - v i per. s n a k e . n e t,反之亦然),則發(fā)生錯誤匹配。
為了確定這種情況是否正在系統(tǒng)中發(fā)生,可試著用-h 選項連接到本地服務(wù)器,該選項指定了主機(jī)的名字。然后查看服務(wù)器的常規(guī)日志文件。它是怎樣報告主機(jī)名的?是以非限定形式還是限定形式?不論它是哪種形式,都將告訴您在發(fā)布GRANT 語句時需要怎樣指定用戶說明符的主機(jī)名部分。
可以同時列出許多被授予的單個權(quán)限。例如,如果想讓用戶能讀取和修改已有表的內(nèi)容,但又不允許創(chuàng)建新表或刪除表,可按如下授權(quán):
GRANT SELECT,INSERT,DELETE,UPDATE ON samp_db.* TO jennie@%
IDENTIFIEDBY "boron"
對于更小粒度( f i n e - g r a i n e d)的訪問控制,可以在單個表上授權(quán),甚至在表的單個列上授權(quán)。當(dāng)存在要對用戶隱藏的表時,或者,當(dāng)只允許用戶修改特定列時,列專有的權(quán)限是有用的。假定歷史同盟會中有一些志愿者利用您作為同盟會秘書應(yīng)履行的職責(zé)來幫助您工作。這是一個好消息,但您決定首先給新的助手授予對member 表只讀的權(quán)限(該表中包含了會員資格的信息),然后再對他們增加授予該表的expiration 列的列專有UPDATE權(quán)限。也就是說,您的助手可以在人們更新其會員資格時進(jìn)行更改
第一條語句授予對整個member 表的讀訪問權(quán)并設(shè)置口令。第二條語句增加UPDATE權(quán)限,但只是對expiration 列。此時不必要再指定口令,因為在第一條語句中已經(jīng)完成了。
截止日期的工作。設(shè)置此MySQL用戶的語句如下:
如果想要為多個列授予列專有的權(quán)限,可指定一個列清單,并用逗號將這些列分隔。例如,為了給assistant 用戶增加對member 表地址列的UPDATE權(quán)限,可以使用下列語句。新的權(quán)限將被增加到對該用戶來說已經(jīng)存在的所有列上:
GRANT UPDATE (street,city,state,zip) ON samp_db.member
TO assistant@localhost
通常,不要給用戶授予比實際需要更大的權(quán)限。但是,當(dāng)您想要使用戶能夠創(chuàng)建存儲中間結(jié)果的臨時表,而又不允許用戶在包含有他們不能修改的數(shù)據(jù)的數(shù)據(jù)庫中這樣做時,就有了要在數(shù)據(jù)庫上授予相當(dāng)多的許可權(quán)限的理由。您可以建立一個單獨的數(shù)據(jù)庫(筆者稱它為t m p)并授予用戶該數(shù)據(jù)庫的所有權(quán)限。例如,如果想要mars.net 域的主機(jī)中的任何用戶都能夠使用tmp 數(shù)據(jù)庫,可發(fā)布下列GRANT語句:
GRANT ALL ON tmp.* TO ""@%.mars.net
在完成這些之后,用戶可使用tmp.tbl_name 格式的名字創(chuàng)建和引用tmp 數(shù)據(jù)庫中的表(用戶說明符中的“” 創(chuàng)建一個匿名用戶項,任何用戶都與空白用戶名相匹配)。
3. 允許用戶管理權(quán)限嗎
通過授予數(shù)據(jù)庫所有者數(shù)據(jù)庫的所有權(quán)限并在操作時指定WITH GRANT OPTION,可以允許數(shù)據(jù)庫所有者控制對該數(shù)據(jù)庫的訪問。例如,如果要讓alicia 能在big.corp.com 域的所有主機(jī)中進(jìn)行連接并管理sales 數(shù)據(jù)庫中所有表的權(quán)限,應(yīng)使用下列GRANT語句:
實際上,WITH GRANT OPTION 子句允許將訪問的權(quán)利授予給另一個用戶。要知道,具有GRANT 權(quán)限的兩個用戶可以相互授予自己的權(quán)限。如果只給一個用戶授予SELECT 權(quán)限而給另一個用戶除SELECT 外還授予了GRANT 和其他的權(quán)限,則第二個用戶可以使第一個用戶“強(qiáng)大”起來。
取消權(quán)限和刪除用戶
為了收回某個用戶的權(quán)限,可使用REVOKE 語句。除了要用FROM 替換TO 并且沒有IDENTIFIEDBY 或WITH GRANT OPTION 子句外,REVOKE 的語法與GRANT 語句非常相似:
REVOKE privileges (columns) ON what FROM user
user 部分必須與您想要取消其權(quán)限的用戶的原始GRANT 語句的user 部分相匹配。priv i l e g e s 部分不需要匹配,您可用GRANT 語句授權(quán),然后用REVOKE 語句取消其中的一部分。REVOKE 語句只刪除權(quán)限,不刪除用戶。用戶的項仍然保留在user 表中,即使您取消了該用戶的所有權(quán)限也是如此。這意味著該用戶仍然可連接到服務(wù)器上。要想刪除整個用戶,必須用DELETE 語句將該用戶的記錄從user 表中直接刪除:
DELETE 語句刪除該用戶的項, FLUSH 語句告訴服務(wù)器重新加載授權(quán)表(當(dāng)使用GRANT 或REVOKE 語句,而不是直接修改授權(quán)表時,這些表將自動重新加載)。
一個權(quán)限難題,第一部分
下面是一個在MySQL郵件清單中反復(fù)出現(xiàn)的情況:一位新的MySQL管理員給某用戶增加一個項,使用了主機(jī)名部分,該部分是用一個模式來指定的。例如:
GRANT ALL ON samp_db.* TO fred@%.snake.net IDENTIFIEDBY "cocoa"
這里的意圖是允許用戶fred 從snake.net 域的所有主機(jī)中進(jìn)行連接,并且具有對samp_db 數(shù)據(jù)庫的所有權(quán)限。事實上, fred 能夠從那些主機(jī)中連接(除了服務(wù)器主機(jī)本身外)。當(dāng)fred 試著從服務(wù)器主機(jī)中進(jìn)行連接時,該企圖以“訪問被拒絕”的消息而告失敗。即使用戶指定了正確的口令也是如此。
如果授權(quán)表中包含了由mysql_install_db 安裝腳本安裝的缺省項,這種情況也會發(fā)生。其原因是,當(dāng)服務(wù)器驗證fred 連接的企圖時,一個匿名用戶項( anonymous-user entry)比fred 項優(yōu)先。匿名用戶項要求該用戶不用口令來連接,并且一個口令錯誤匹配發(fā)生。
該問題的另一個背景將在第12章“權(quán)限難題,第二部分”中給出。目前,只要說修正此問題的方法是從user 表中刪除匿名用戶項就足夠了,我們不能用R E V O K E,因為該命令只刪除權(quán)限。要想完全擺脫這些匿名項,執(zhí)行如下操作:
% mysql-uroot mysql mysql> DELETE FROM user where User="";
mysql>FLUSH PRIVILEGES;
現(xiàn)在,當(dāng)fred 試圖從本地主機(jī)連接時成功了。
授權(quán)表 內(nèi)容
user 可連接到服務(wù)器的用戶和他們擁有的任何全局特權(quán)
db 數(shù)據(jù)庫級的特權(quán)
tables _ priv 表級特權(quán)
c o l um n s _ priv 列級特權(quán)
還有第五個授權(quán)表( host),但它不受GRANT 或REVOKE的影響。
當(dāng)您為某個用戶發(fā)布GRANT 語句時,應(yīng)在user表中為該用戶創(chuàng)建一個項。如果該語句指定了所有全局特權(quán)(管理權(quán)限或用于所有數(shù)據(jù)庫的權(quán)限),則這些指定也被記錄在user表中。如果指定了數(shù)據(jù)庫、表或列的權(quán)限,它們將記錄在db、tables_priv 和columns_priv表中。
使用GRANT 和REVOKE語句比直接修改授權(quán)表更容易。但是,建議您最好通過閱讀第12章來補(bǔ)充本章的內(nèi)容,第12章中詳細(xì)討論了授權(quán)表。這些表非常重要,作為一位管理員應(yīng)該了解這些表是怎樣在GRANT 和REVOKE 語句級上工作的。
本節(jié)下面的部分將討論如何設(shè)置MySQL用戶的賬號和授權(quán),還將介紹如何取消權(quán)限以及從授權(quán)表中刪除全部用戶,并且將考慮一個困擾許多新的MySQL管理員的難題。
您還要考慮使用mysqlaccess 和mysql_setpermission 腳本,它們是MySQL分發(fā)包的組成部分。這些是Perl 的腳本,它們提供了設(shè)置用戶賬號的GRANT 語句的代用品。mysql_setpermission 需要具有DBI 的支持環(huán)境。
創(chuàng)建新用戶和授權(quán)
GRANT 語句的語法如下:
GRANT privileges (columns)
ON what
TO user IDENTIFIEDBY "password"
WITH GRANT OPTION
要使用該語句,需要填寫以下部分:
privileges 分配給用戶的權(quán)限。下表列出了可在GRANT 語句中使用的權(quán)限說明符:
權(quán)限說明符權(quán)限允許的操作
上表顯示的第一組權(quán)限說明符適用于數(shù)據(jù)庫、表和列。第二組說明符是管理特權(quán)。通常,這些權(quán)限的授予相當(dāng)保守,因為它們會影響服務(wù)器的操作(例如, SHUTDOWN 特權(quán)不是按每天來分發(fā)的權(quán)限)。第三組說明符是特殊的。ALL的意思是“所有的權(quán)限”,而USAGE 的意思是“無權(quán)限”─即創(chuàng)建用戶,但不授予任何的權(quán)限。
columns 權(quán)限適用的列。這是可選的,只來設(shè)置列專有的權(quán)限。如果命名多于一個列,則用逗號分開。
what 權(quán)限應(yīng)用的級別。權(quán)限可以是全局的(適用于所有數(shù)據(jù)庫和所有的表)、數(shù)據(jù)庫專有的(適用于某個數(shù)據(jù)庫中的所有表),或表專有的。可以通過指定一個C O L U M N S子句將權(quán)限授予特定的列。
user 使用權(quán)限的用戶。它由用戶名和主機(jī)名組成。在MySQL中,不僅指定誰進(jìn)行連接,還要指定從哪里連接。它允許您擁有兩個帶有相同名字的、從不同位置連接的用戶。MySQL允許在它們之間進(jìn)行區(qū)別并相互獨立地分配權(quán)限。
MySQL的用戶名就是您在連接到服務(wù)器時指定的名字。該名字與您的UNIX 注冊名或Windows 名的沒有必然連系。缺省設(shè)置時,客戶機(jī)程序?qū)⑹褂媚缘拿肿鳛镸ySQL的用戶名(如果您不明確指定一個名字的話),但這只是一個約定。有關(guān)將root作為可以操作一切MySQL的超級用戶名也是這樣,就是一種約定。您也可以在授權(quán)表中將此名修改成nobody,然后作為nobody 用戶進(jìn)行連接,以執(zhí)行需要超級用戶特權(quán)的操作。
password 分配給該用戶的口令。這是可選的。如果您不給新用戶指定IDENTIFIEDBY子句,該用戶不分配口令(是非安全的)。對于已有的用戶,任何指定的口令將替代舊口令。如果不指定新口令,用戶的舊口令仍然保持不變。當(dāng)您確實要使用ID E N T I F I E DBY 時,該口令串應(yīng)該是直接量,GRANT 將對口令進(jìn)行編碼。當(dāng)用SET PA S S W O R D語句時,不要使用PASSWORD() 函數(shù)。
WITH GRANT OPTION 子句是可選的。如果包含該子句,該用戶可以將GRANT 語句授予的任何權(quán)限授予其他的用戶??梢允褂迷撟泳鋵⑹跈?quán)的能力授予其他的用戶。
用戶名、口令以及數(shù)據(jù)庫和表的名稱在授權(quán)表項中是區(qū)分大小寫的,而主機(jī)名和列名則不是。
通過查詢某些問題,通??梢酝茢喑鏊璧腉RANT 語句的類型:
誰可以進(jìn)行連接,從哪里連接?
用戶應(yīng)具有什么級別的權(quán)限,這些權(quán)限適用于什么?
允許用戶管理權(quán)限嗎?
讓我們來提問這些問題,同時看一些利用GRANT 語句設(shè)置MySQL用戶賬號的例子。
1. 誰可以進(jìn)行連接,從哪里連接
您可以允許用戶在特定的主機(jī)或涉及范圍很寬的一組主機(jī)中進(jìn)行連接。在一個極端,如果知道用戶將僅從那個主機(jī)中進(jìn)行連接,則可限定對單個主機(jī)的訪問:
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 數(shù)據(jù)庫中的所有表”)在另一個極端,您可能會有一個用戶m a x,他周游世界并需要能夠從世界各地的主機(jī)中進(jìn)行連接。在這種情況下,無論他從哪里連接您都將允許:
GRANT ALL ON samp_db.* TO max@% IDENTFIEDBY "diamond"
‘%'字符起通配符的作用,與LIKE模式匹配的含義相同,在上個語句中,它的意思是“任何主機(jī)”。如果您根本不給出主機(jī)名部分,則它與指定“ %”的含義相同。因此, max和max@%是等價的。這是設(shè)置一個用戶最容易的方法,但安全性最小。
要想采取妥協(xié)的辦法,可允許用戶在一組有限的主機(jī)中進(jìn)行連接。例如,要使mary 從snake.net 域的任何主機(jī)中進(jìn)行連接,可使用%.snake.net 主機(jī)說明符:
GRANT ALL ON samp_db.* TO mary@%.snake.net IDENTFIEDBY "topaz"
該用戶標(biāo)識符的主機(jī)部分可用IP 地址而不是主機(jī)名給出(如果愿意的話)??梢灾付ㄒ粋€直接的IP 地址或包含模式字符的地址。同樣,自MySQL3.23 起,可以用一個網(wǎng)絡(luò)掩碼來指定IP 號,網(wǎng)絡(luò)掩碼表明了用于該網(wǎng)絡(luò)號的二進(jìn)制位數(shù):
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"
第一條語句指明用戶可進(jìn)行連接的特定的主機(jī)。第二條語句指定129.168.128 Class C 子網(wǎng)的IP 模式。在第三條語句中, 192.168.128.0/17 指定一個17 位二進(jìn)制的網(wǎng)絡(luò)號,并將任何主機(jī)與其IP 地址的前17 個二進(jìn)制位中的192.168.128.0/17 進(jìn)行匹配。
如果MySQL抱怨您指定的用戶值,則可能需要使用引號(但對用戶名和主機(jī)名分別加引號):
GRANT ALL ON samp_db.president TO "my friend"@"boa.snake.net"
2. 用戶應(yīng)具有什么級別的權(quán)限,這些權(quán)限適用于什么
您可授予不同級別的權(quán)限。全局權(quán)限的功能最強(qiáng),因為它們適用于任何數(shù)據(jù)庫。為了使ethel 成為可以進(jìn)行一切操作的超級用戶(其中包括可以對其他用戶授權(quán)),發(fā)布下列語句:
GRANT ALL ON *.* TO ethel@localhost IDENTIFIEDBY "coffee"
WITH GRANT OPTION
ON 子句中*.* 說明符的意思是“所有數(shù)據(jù)庫,所有的表”,為保險起見,我們已經(jīng)指定ethel 只能從本地主機(jī)中連接。限制超級用戶從哪些主機(jī)上進(jìn)行連接通常是明智的做法,因為它限制住了其他用戶對口令進(jìn)行試探。
有些權(quán)限( F I L E、P R O C E S S、RELOAD 和S H U T D O W N)是管理權(quán)限,只能用NO *.* 全局權(quán)限說明符來授予。如果希望的話,也可以不用授予數(shù)據(jù)庫級的權(quán)限來授予這些權(quán)限。例如,下列語句建立了一個flush 用戶,它除了發(fā)布FLUSH語句外不做其他任何事情。在管理腳本中這可能是有用的,因為需要在這些腳本中執(zhí)行諸如在日志文件循環(huán)期間刷新日志的操作:
GRANT RELOAD ON *.* TO flush@localhost IDENTIFIEDBY "flushpass"
通常授予管理權(quán)限應(yīng)該是保守的,因為具有這些權(quán)限的用戶可能影響服務(wù)器的操作。
數(shù)據(jù)庫級的權(quán)限適用于特定數(shù)據(jù)庫中的所有表。這些權(quán)限使用ON db_name.* 子句進(jìn)行授予:
GRANT ALL ON samp_db.* TO bill@racer.snake.net IDENTIFIEDBY "rock"
GRANT SELECT ON menagerie.* TO ro_user@% IDENTIFIEDBY "dirt"
第一條語句將bill 的所有權(quán)限授予samp_db 數(shù)據(jù)庫的任何表。第二條語句創(chuàng)建一個限制訪問的用戶r o _ user(只讀用戶),它可以訪問menagerie 數(shù)據(jù)庫的所有表,但只能讀取。也就是說,該用戶只能發(fā)布SELECT 語句。
怎樣在授權(quán)表項中指定本地主機(jī)名
如果您使用服務(wù)器的主機(jī)名而非localhost,通常存在從該服務(wù)器主機(jī)連接的問題。這可能是由于在授權(quán)表中指定名字的方法和名字分解器例程( name reslover routine)向程序報告名字的方法之間的錯誤匹配。如果分解器報告了一個非限定的名字(如p i t - v i per),但授權(quán)表包含了具有全限定的名字的項(如p i t - v i per. s n a k e . n e t,反之亦然),則發(fā)生錯誤匹配。
為了確定這種情況是否正在系統(tǒng)中發(fā)生,可試著用-h 選項連接到本地服務(wù)器,該選項指定了主機(jī)的名字。然后查看服務(wù)器的常規(guī)日志文件。它是怎樣報告主機(jī)名的?是以非限定形式還是限定形式?不論它是哪種形式,都將告訴您在發(fā)布GRANT 語句時需要怎樣指定用戶說明符的主機(jī)名部分。
可以同時列出許多被授予的單個權(quán)限。例如,如果想讓用戶能讀取和修改已有表的內(nèi)容,但又不允許創(chuàng)建新表或刪除表,可按如下授權(quán):
GRANT SELECT,INSERT,DELETE,UPDATE ON samp_db.* TO jennie@%
IDENTIFIEDBY "boron"
對于更小粒度( f i n e - g r a i n e d)的訪問控制,可以在單個表上授權(quán),甚至在表的單個列上授權(quán)。當(dāng)存在要對用戶隱藏的表時,或者,當(dāng)只允許用戶修改特定列時,列專有的權(quán)限是有用的。假定歷史同盟會中有一些志愿者利用您作為同盟會秘書應(yīng)履行的職責(zé)來幫助您工作。這是一個好消息,但您決定首先給新的助手授予對member 表只讀的權(quán)限(該表中包含了會員資格的信息),然后再對他們增加授予該表的expiration 列的列專有UPDATE權(quán)限。也就是說,您的助手可以在人們更新其會員資格時進(jìn)行更改
第一條語句授予對整個member 表的讀訪問權(quán)并設(shè)置口令。第二條語句增加UPDATE權(quán)限,但只是對expiration 列。此時不必要再指定口令,因為在第一條語句中已經(jīng)完成了。
截止日期的工作。設(shè)置此MySQL用戶的語句如下:
如果想要為多個列授予列專有的權(quán)限,可指定一個列清單,并用逗號將這些列分隔。例如,為了給assistant 用戶增加對member 表地址列的UPDATE權(quán)限,可以使用下列語句。新的權(quán)限將被增加到對該用戶來說已經(jīng)存在的所有列上:
GRANT UPDATE (street,city,state,zip) ON samp_db.member
TO assistant@localhost
通常,不要給用戶授予比實際需要更大的權(quán)限。但是,當(dāng)您想要使用戶能夠創(chuàng)建存儲中間結(jié)果的臨時表,而又不允許用戶在包含有他們不能修改的數(shù)據(jù)的數(shù)據(jù)庫中這樣做時,就有了要在數(shù)據(jù)庫上授予相當(dāng)多的許可權(quán)限的理由。您可以建立一個單獨的數(shù)據(jù)庫(筆者稱它為t m p)并授予用戶該數(shù)據(jù)庫的所有權(quán)限。例如,如果想要mars.net 域的主機(jī)中的任何用戶都能夠使用tmp 數(shù)據(jù)庫,可發(fā)布下列GRANT語句:
GRANT ALL ON tmp.* TO ""@%.mars.net
在完成這些之后,用戶可使用tmp.tbl_name 格式的名字創(chuàng)建和引用tmp 數(shù)據(jù)庫中的表(用戶說明符中的“” 創(chuàng)建一個匿名用戶項,任何用戶都與空白用戶名相匹配)。
3. 允許用戶管理權(quán)限嗎
通過授予數(shù)據(jù)庫所有者數(shù)據(jù)庫的所有權(quán)限并在操作時指定WITH GRANT OPTION,可以允許數(shù)據(jù)庫所有者控制對該數(shù)據(jù)庫的訪問。例如,如果要讓alicia 能在big.corp.com 域的所有主機(jī)中進(jìn)行連接并管理sales 數(shù)據(jù)庫中所有表的權(quán)限,應(yīng)使用下列GRANT語句:
實際上,WITH GRANT OPTION 子句允許將訪問的權(quán)利授予給另一個用戶。要知道,具有GRANT 權(quán)限的兩個用戶可以相互授予自己的權(quán)限。如果只給一個用戶授予SELECT 權(quán)限而給另一個用戶除SELECT 外還授予了GRANT 和其他的權(quán)限,則第二個用戶可以使第一個用戶“強(qiáng)大”起來。
取消權(quán)限和刪除用戶
為了收回某個用戶的權(quán)限,可使用REVOKE 語句。除了要用FROM 替換TO 并且沒有IDENTIFIEDBY 或WITH GRANT OPTION 子句外,REVOKE 的語法與GRANT 語句非常相似:
REVOKE privileges (columns) ON what FROM user
user 部分必須與您想要取消其權(quán)限的用戶的原始GRANT 語句的user 部分相匹配。priv i l e g e s 部分不需要匹配,您可用GRANT 語句授權(quán),然后用REVOKE 語句取消其中的一部分。REVOKE 語句只刪除權(quán)限,不刪除用戶。用戶的項仍然保留在user 表中,即使您取消了該用戶的所有權(quán)限也是如此。這意味著該用戶仍然可連接到服務(wù)器上。要想刪除整個用戶,必須用DELETE 語句將該用戶的記錄從user 表中直接刪除:
DELETE 語句刪除該用戶的項, FLUSH 語句告訴服務(wù)器重新加載授權(quán)表(當(dāng)使用GRANT 或REVOKE 語句,而不是直接修改授權(quán)表時,這些表將自動重新加載)。
一個權(quán)限難題,第一部分
下面是一個在MySQL郵件清單中反復(fù)出現(xiàn)的情況:一位新的MySQL管理員給某用戶增加一個項,使用了主機(jī)名部分,該部分是用一個模式來指定的。例如:
GRANT ALL ON samp_db.* TO fred@%.snake.net IDENTIFIEDBY "cocoa"
這里的意圖是允許用戶fred 從snake.net 域的所有主機(jī)中進(jìn)行連接,并且具有對samp_db 數(shù)據(jù)庫的所有權(quán)限。事實上, fred 能夠從那些主機(jī)中連接(除了服務(wù)器主機(jī)本身外)。當(dāng)fred 試著從服務(wù)器主機(jī)中進(jìn)行連接時,該企圖以“訪問被拒絕”的消息而告失敗。即使用戶指定了正確的口令也是如此。
如果授權(quán)表中包含了由mysql_install_db 安裝腳本安裝的缺省項,這種情況也會發(fā)生。其原因是,當(dāng)服務(wù)器驗證fred 連接的企圖時,一個匿名用戶項( anonymous-user entry)比fred 項優(yōu)先。匿名用戶項要求該用戶不用口令來連接,并且一個口令錯誤匹配發(fā)生。
該問題的另一個背景將在第12章“權(quán)限難題,第二部分”中給出。目前,只要說修正此問題的方法是從user 表中刪除匿名用戶項就足夠了,我們不能用R E V O K E,因為該命令只刪除權(quán)限。要想完全擺脫這些匿名項,執(zhí)行如下操作:
% mysql-uroot mysql mysql> DELETE FROM user where User="";
mysql>FLUSH PRIVILEGES;
現(xiàn)在,當(dāng)fred 試圖從本地主機(jī)連接時成功了。
相關(guān)文章
Windows環(huán)境下的MYSQL5.7配置文件定位圖文分析
本文通過圖文并茂的形式給大家介紹了Windows環(huán)境下的MYSQL5.7配置文件定位 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05MySQL按年/月/周/日/小時分組查詢、排序、limit及判空用法實例
我們在用Mysql抽取數(shù)據(jù)時候,經(jīng)常需要按照天、周、月等不同的粒度對數(shù)據(jù)進(jìn)行分組統(tǒng)計,下面這篇文章主要給大家介紹了關(guān)于MySQL按年/月/周/日/小時分組查詢、排序、limit及判空用法的相關(guān)資料,需要的朋友可以參考下2023-03-03Mysql主鍵UUID和自增主鍵的區(qū)別及優(yōu)劣分析
這篇文章主要介紹了Mysql主鍵UUID和自增主鍵的區(qū)別及優(yōu)劣分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02mysql嚴(yán)格模式Strict?Mode詳細(xì)說明
使用mysql嚴(yán)格模式可以使數(shù)據(jù)更加安全嚴(yán)格,缺點是減少了對空數(shù)據(jù)入庫的兼容性,下面這篇文章主要給大家介紹了關(guān)于mysql嚴(yán)格模式Strict?Mode詳細(xì)說明的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08MySQL數(shù)據(jù)庫優(yōu)化經(jīng)驗詳談(服務(wù)器普通配置)
同時在線訪問量繼續(xù)增大 對于1G內(nèi)存的服務(wù)器明顯感覺到吃力嚴(yán)重時甚至每天都會死機(jī) 或者時不時的服務(wù)器卡一下 這個問題曾經(jīng)困擾了我半個多月MySQL使用是很具伸縮性的算法,因此你通常能用很少的內(nèi)存運行或給MySQL更多的被存以得到更好的性能。2011-03-03