Mysql培訓經典教程第七章_第1頁
Mysql培訓經典教程第七章_第2頁
Mysql培訓經典教程第七章_第3頁
Mysql培訓經典教程第七章_第4頁
Mysql培訓經典教程第七章_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

章本章要點:MySQL權限系統(tǒng)原理如何授予撤銷用戶和授權如何直接修改授權表授予用戶權限的規(guī)范和注意事項作為一個MySQL的系統(tǒng)管理員,你有責任維護你的MySQL數據庫系統(tǒng)的數據安全性和完整性。本文主要主要介紹如何建立一個安全的MySQL系統(tǒng),從系統(tǒng)內部和外部網絡兩個角度,為你提供一個指南。本章主要考慮下列安全性有關的問題:為什么安全性很重要,你應該防范那些攻擊?服務器面臨的風險(內部安全性),如何處理?連接服務器的客戶端風險(外部安全性),如何處理?MySQL管理員有責任保證數據庫內容的安全性,使得這些數據記錄只能被那些正確授權的用戶訪問,這涉及到數據庫系統(tǒng)的內部安全性和外部安全性。內部安全性關心的是文件系統(tǒng)級的問題,即,防止MySQL數據目錄(DATADIR)被在服務器主機有賬號的人(合法或竊取的)進行攻擊。如果數據目錄內容的權限過分授予,使得每個人均能簡單地替代對應于那些數據庫表的文件,那么確??刂瓶蛻敉ㄟ^網絡訪問的授權表設置正確,對此毫無意義。外部安全性關心的是從外部通過網絡連接服務器的客戶的問題,即,保護MySQL服務器免受來自通過網絡對服務器的連接的攻擊。你必須設置MySQL授權表(granttable),使得他們不允許訪問服務器管理的數據庫內容,除非提供有效的用戶名和口令。下面就詳細介紹如何設置文件系統(tǒng)和授權表mysql,實現(xiàn)MySQL的兩級安全性。7.1MySQL的權限系統(tǒng)MySQL有一套先進的但非標準的安全/授權系統(tǒng),掌握其授權機制是開始操作MySQL數據庫必須要走的第一步,對于一個熟悉SQL基本操作的人來說,也是MySQL所有的知識中比較難以理解的一個部分。本節(jié)通過揭開其授權系統(tǒng)的運作機制,希望大家能夠可以更好地操作和使用這個優(yōu)秀的數據庫系統(tǒng)。MySQL的安全系統(tǒng)是很靈活的,它允許你以多種不同方式設置用戶權限。一般地,你可使用標準的SQL語句GRANT和REVOKE語句做,他們?yōu)槟阈薷目刂瓶蛻粼L問的授權表,然而,你可能由一個不支持這些語句的老版本的MySQL(在3.22.11之前這些語句不起作用),或者你發(fā)覺用戶權限看起來不是以你想要的方式工作。對于這種情況,了解MySQL授權表的結構和服務器如何利用它們決定訪問權限是有幫助的,這樣的了解允許你通過直接修改授權表增加、刪除或修改用戶權限,它也允許你在檢查這些表時診斷權限問題。7.1.1授權表的結構通過網絡連接服務器的客戶對MySQL數據庫的訪問由授權表內容來控制。這些表位于mysql數據庫中,并在第一次安裝MySQL的過程中初始化(運行mysql_install_db腳本)。授權表共有5個表:user、db、host、tables_priv和columns_priv。授權表user、db和host的結構和作用表7-1授權表user、db和host的結構User表Db表Host表作用域列HostHostHostDbDbUserUserPassword數據庫/表的權限列Alter_privAlter_privAlter_privCreate_privCreate_privDelete_privDelete_privDrop_privDrop_privIndex_privIndex_privIndex_privInsert_privInsert_privReferences_privReferences_privSelect_privSelect_privUpdate_privUpdate_privUpdate_privAlter_privAlter_privAlter_privFile_privGrant_privGrant_privGrant_privProcess_privReload_privShutdown_priv授權表的內容有如下用途:user表user表列出可以連接服務器的用戶及其口令,并且它指定他們有哪種全局(超級用戶)權限。在user表啟用的任何權限均是全局權限,并適用于所有數據庫。例如,如果你啟用了DELETE權限,在這里列出的用戶可以從任何表中刪除記錄,所以在你這樣做之前要認真考慮。db表db表列出數據庫,而用戶有權限訪問它們。在這里指定的權限適用于一個數據庫中的所有表。host表host表與db表結合使用在一個較好層次上控制特定主機對數據庫的訪問權限,這可能比單獨使用db好些。這個表不受GRANT和REVOKE語句的影響,所以,你可能發(fā)覺你根本不是用它。授權表tables_priv和columns_priv的結構和作用表7-2授權表tables_priv和columns_priv的結構授權表tables_priv授權表columns_priv作用域列HostHostDbDbUserUserTable_nameTable_nameColumn_name權限列Table_privColumn_priv其他列TimestampTimestampGrantorMySQL沒有rows_priv表,因為它不提供記錄級權限,例如,你不能限制用戶于表中包含特定列值的行。如果你確實需要這種能力,你必須用應用編程來提供。如果你想執(zhí)行建議的記錄級鎖定,你可用GET_LOCK()函數做到。授權表的內容有如下用途:tables_priv表tables_priv表指定表級權限,在這里指定的一個權限適用于一個表的所有列。columns_priv表columns_priv表指定列級權限。這里指定的權限適用于一個表的特定列。tables_priv和columns_priv表在MySQL3.22.11版引進(與GRANT語句同時)。如果你有較早版本的MySQL,你的mysql數據庫將只有user、db和host表。如果你從老版本升級到3.22.11或更新,而沒有tables_priv和columns_priv表,運行mysql_fix_privileges_tables腳本創(chuàng)建它們。7.1.2用戶的權限權限信息用user、db、host、tables_priv和columns_priv表被存儲在mysql數據庫中(即在名為mysql的數據庫中)。在MySQL啟動時和在7.5權限修改何時生效所說的情況時,服務器讀入這些數據庫表內容。數據庫和表的權限下列權限運用于數據庫和表上的操作。SELECT允許你使用SELECT語句從表中檢索數據。SELECT語句只有在他們真正從一個表中檢索行是才需要select權限,你可以執(zhí)行某個SELECT語句,甚至沒有任何到服務器上的數據庫里的存取任何東西的許可。例如,你可使用mysql客戶作為一個簡單的計算器:mysql>SELECT1+1;mysql>SELECTPI()*2;UPDATE允許你修改表中的已有的記錄。INSERT允許在表中插入記錄DELETE允許你從表中刪除現(xiàn)有記錄。ALTER允許你使用ALTERTABLE語句,這其實是一個簡單的第一級權限,你必須由其他權限,這看你想對數據庫實施什么操作。CREATE允許你創(chuàng)建數據庫和表,但不允許創(chuàng)建索引。DROP允許你刪除(拋棄)數據庫和表,但不允許刪除索引。注意:如果你將mysql數據庫的drop權限授予一個用戶,該用戶能拋棄存儲了MySQL存取權限的數據庫!INDEX允許你創(chuàng)建并刪除索引。REFERENCES目前不用。管理權限下列權限運用于控制服務器或用戶授權能力的操作的管理性操作。FILE允許你告訴服務器讀或寫服務器主機上的文件。該權限不應該隨便授予,它很危險,見“回避授權表風險”。服務器確實較謹慎地保持在一定范圍內使用該權限。你只能讀任何人都能讀的文件。你正在寫的文件必須不是現(xiàn)存的文件,這防止你迫使服務器重寫重要文件,如/etc/passwd或屬于別人的數據庫的數據目錄。如果你授權FILE權限,確保你不以UNIX的root用戶運行服務器,因為root可在文件系統(tǒng)的任何地方創(chuàng)建新文件。如果你以一個非特權用戶運行服務器,服務器只能在給用戶能訪問的目錄中創(chuàng)建文件。GRANT允許你將你自己的權限授予別人,包括GRANT。PROCESS允許你通過使用SHOWPROCESS語句或mysqladminprocess命令查看服務器內正在運行的線程(進程)的信息。這個權限也允許你用KILL語句或mysqladminkill命令殺死線程。你總是能看到或殺死你自己的線程。PROCESS權限賦予你對任何線程做這些事情的能力。RELOAD允許你執(zhí)行大量的服務器管理操作。你可以發(fā)出FLUSH語句,你也能指性mysqladmin的reload、refresh、flush-hosts、flush-logs、flush-privileges和flush-tables等命令。SHUTDOWN允許你用mysqladminshutdown關閉服務器。在user、db和host表中,每一個權限以一個單獨的列指定。這些列全部聲明為一個ENUM("N","Y")類型,所以每個權的缺省值是“N”。在tables_priv和columns_priv中的權限以一個SET表示,它允許權限用一個單個列以任何組合指定。這兩個表比其他三個表更新,這就是為什么它們使用更有效的表示方式的原因。(有可能在未來,user、db和host表也用一個SET類型表示。)7.1.3授權表列的內容作用域列內容一些范圍列要求文字值,但它們大多數允許通配符或其他特殊值。表7-3作用域列的類型字段名類型HostCHAR(60)UserCHAR(16)PasswordCHAR(16)DbCHAR(64)(tables_priv和columns_priv表為CHAR(60))Host一個Host列值可以是一個主機名或一個IP地址。值localhost意味著本地主機,但它只在你用一個localhost主機名時才匹配,而不是你在使用主機名時。假如你的本地主機名是并且在user表中有對你的兩條記錄,一個有一個Host值或localhost,而另一個有,有l(wèi)ocalhost的記錄將只當你連接localhost時匹配,其他在只在連接時才匹配。如果你想讓客戶能以兩種方式連接,你需要在user表中有兩條記錄。你也可以用通配符指定Host值??梢允褂肧QL的模式字符“%”和“_”并具有當你在一個查詢中使用LIKE算符同樣的含義(不允許regex算符)。SQL模式字符都能用于主機名和IP地址。如%匹配任何域內的主機,而%.edu匹配任何教育學院的主機。類似地,192.168.%匹配任何在192.168B類子網的主機,而192.168.3.%匹配任何在192.168.3C類子網的主機。%值匹配所有主機,并可用于允許一個用戶從任何地方連接。一個空白的Host值等同于%。(例外:在db表中,一個空白Host值含義是“進一步檢查host表”,該過程在“查詢訪問驗證”中介紹。)從MySQL3.23起,你也可以指定帶一個表明那些為用于網絡地址的網絡掩碼的IP地址,如/17指定一個17位網絡地址并匹配其IP地址是192.168.128前17位的任何主機。User用戶名必須是文字的或空白。一個空白值匹配任何用戶。%作為一個User值不意味著空白,相反它匹配一個字面上的%名字,這可能不是你想要的。當一個到來的連接通過user表被驗證而匹配的記錄包含一個空白的User值,客戶被認為是一個匿名用戶。Password口令值可以是空或非空,不允許用通配符。一個空口令不意味著匹配任何口令,它意味著用戶必須不指定口令。口令以一個加密過的值存儲,不是一個字面上的文本。如果你在Password列中存儲一個照字面上的口令,用戶將不能連接!GRANT語句和mysqladminpassword命令為你自動加密口令,但是如果你用諸如INSERT、REPLACE、UPDATE或SETPASSWORD等命令,一定要用PASSWORD("new_password")而不是簡單的"new_password"來指定口令。Db在columns_priv和tables_priv表中,Db值必須是真正的數據庫名(照字面上),不允許模式和空白。在db和host中,Db值可以以字面意義指定或使用SQL模式字符'%'或'_'指定一個通配符。一個'%'或空白匹配任何數據庫。Table_name,Column_name這些列中的值必須是照字面意思的表或列名,不允許模式和空白。某些范圍列被服務器視為大小寫敏感的,其余不是。這些原則總結在下表中。特別注意Table_name值總是被看作大小寫敏感的,即使在查詢中的表名的大小寫敏感性對待視服務器運行的主機的文件系統(tǒng)而定(UNIX下是大小寫敏感,而Windows不是)。某些作用域列被服務器視為大小寫敏感的,其余不是。這些原則總結在下表中。特別注意Table_name值總是被看作大小寫敏感的,即使在查詢中的表名的大小寫敏感性對待視服務器運行的主機的文件系統(tǒng)而定(UNIX下是大小寫敏感,而Windows不是)。表7-4作用域列的大小寫敏感性列大小寫敏感性HostNoUserYesPasswordYesDbYesTable_nameYesColumn_nameNo授權表User、Db和Host的權限列的內容在user、db和host表中,所有權限字段被聲明為ENUM('N','Y')--每一個都可有值'N'或'Y',并且缺省值是'N'.授權表tables_priv和columns_priv的權限列的內容在tables_priv和columns_priv表中,權限字段被聲明為SET字段:表7-5授權表tables_priv和columns_priv的權限列的類型表名字段名可能的集合成員tables_privTable_priv'Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter'tables_privColumn_priv'Select','Insert','Update','References'columns_privColumn_priv'Select','Insert','Update','References'7.1.4權限系統(tǒng)工作原理權限系統(tǒng)工作的一般過程MySQL權限系統(tǒng)保證所有的用戶可以嚴格地做他們假定被允許做的事情。當你連接一個MySQL服務器時,你的身份由你從那連接的主機和你指定的用戶名來決定,系統(tǒng)根據你的身份和你想做什么來授予權限。MySQL在認定身份中考慮你的主機名和用戶名字,是因為有很小的原因假定一個給定的用戶在因特網上屬于同一個人。例如,用戶從連接的bill不必和從連接bill是同一個人。MySQL通過允許你區(qū)分在不同的主機上碰巧有同樣名字用戶來處理它:你可以對從連接授與bill一個權限集,而為從的連接授予一個不同的權限集。MySQL存取控制包含2個階段:階段1:服務器檢查你是否允許連接。階段2:假定你能連接,服務器檢查你發(fā)出的每個請求。看你是否有足夠的權限實施它。例如,如果你從數據庫中一個表精選(select)行或從數據庫拋棄一個表,服務器確定你對表有select權限或對數據庫有drop權限。服務器在存取控制的兩個階段使用在mysql的數據庫中的user、db和host表對存取控制的第二階段(請求證實),如果請求涉及表,服務器可以另外參考tables_priv和columns_priv表。簡單地說,服務器使用這樣的授權表:user表范圍字段決定是否允許或拒絕到來的連接。對于允許的連接,權限字段指出用戶的全局(超級用戶)權限。db和host表一起使用:db表范圍字段決定用戶能從哪個主機存取哪個數據庫。權限字段決定允許哪個操作。當你想要一個給定的db條目應用于若干主機時,host表作為db表的擴展被使用。例如,如果你想要一個用戶能在你的網絡從若干主機使用一個數據庫,在用戶的db表的Host條目設為空值,然后將那些主機的每一個移入host表。這個機制詳細描述在存取控制,階段2:請求證實。tables_priv和columns_priv表類似于db表,但是更精致:他們在表和列級應用而非在數據庫級。注意管理權限(reload,shutdown,等等)僅在user表中被指定。這是因為管理性操作是服務器本身的操作并且不是特定數據庫,因此沒有理由在其他授權表中列出這樣的權限。事實上,只需要請教user表來決定你是否執(zhí)行一個管理操作。file權限也僅在user表中指定。它不是管理性權限,但你讀或謝在服務器主機上的文件的的能力獨立于你正在存取的數據庫。當mysqld服務器啟動時,讀取一次授權表內容。對授權表的更改生效在7.5權限修改何時生效。一個有用的診斷工具是mysqlaccess腳本,由CarlierYves提供給MySQL分發(fā)。使用--help選項調用mysqlaccess查明它怎樣工作。注意:mysqlaccess僅用user、db和host表僅檢查存取。它不檢查表或列級權限。存取控制,階段1:連接證實當你試圖聯(lián)接一個MySQL服務器時,服務器基于你的身份和你是否能通過供應正確的口令驗證身份來接受或拒絕連接。如果不是,服務器完全具結你的存取,否則,服務器接受連接,然后進入階段2并且等待請求。你的身份基于2個信息:你從那個主機連接你的MySQL用戶名身份檢查使用3個user表(Host,User和Password)范圍字段執(zhí)行。服務器只有在一個user表條目匹配你的主機名和用戶名并且你提供了正確的口令時才接受連接。在user表范圍字段可以如下被指定:一個Host值可以是主機名或一個IP數字,或'localhost'指出本地主機。你可以在Host字段里使用通配符字符“%”和“_”。一個Host值'%'匹配任何主機名,一個空白Host值等價于'%'。注意這些值匹配能創(chuàng)建一個連接到你的服務器的任何主機!通配符字符在User字段中不允許,但是你能指定空白的值,它匹配任何名字。如果user表匹配到來的連接的條目有一個空白的用戶名,用戶被認為是匿名用戶(沒有名字的用戶),而非客戶實際指定的名字。這意味著一個空白的用戶名被用于在連接期間的進一步的存取檢查(即,在階段2期間)。Password字段可以是空白的。這不意味著匹配任何口令,它意味著用戶必須不指定一個口令進行連接。非空白Password值代表加密的口令。MySQL不以任何人可以看的純文本格式存儲口令,相反,正在試圖聯(lián)接的一個用戶提供的口令被加密(使用PASSWORD()函數),并且與存儲了user表中的已經加密的版本比較。如果他們匹配,口令是正確的。下面的例子顯示出各種user表中Host和User條目的值的組合如何應用于到來的連接:表7-6Host和User條目的值的組合Host值User值被條目匹配的連接'''Gwen'Gwen,從連接''''任何用戶,從連接,'%''Gwen'Gwen,從任何主機連接'%'''任何用戶,從任何主機連接'%.''Gwen'Gwen,從在域的任何主機連接'x.y.%''Gwen'Gwen,從、,等聯(lián)接。(這或許無用)'77''Gwen'Gwen,從有77IP地址的主機連接'144.155.166.%''Gwen'Gwen,從144.155.166C類子網的任何主機連接既然你能在Host字段使用IP通配符值(例如,'144.155.166.%'匹配在一個子網上的每臺主機),有可能某人可能企圖探究這種能力,通過命名一臺主機為144.155.166.。為了阻止這樣的企圖,MySQL不允許匹配以數字和一個點起始的主機名,這樣,如果你用一個命名為類似1.2.的主機,它的名字決不會匹配授權表中Host列。只有一個IP數字能匹配IP通配符值。一個到來的連接可以被在user表中的超過一個條目匹配。例如,一個由Gwen從的連接匹配多個條目如上所述。如果超過一個匹配,服務器怎么選擇使用哪個條目呢?服務器在啟動時讀入user表后通過排序來解決這個問題,然后當一個用戶試圖連接時,以排序的順序瀏覽條目,第一個匹配的條目被使用。MySQL服務器按一種特定方式排序符授權表中的記錄,然后通過按序瀏覽記錄匹配到來的連接。找到的第一個匹配決定了被使用的記錄。理解MySQL使用的排序順序很重要,特別是對user表。當服務器讀取user表內容時,它根據在Host和User列中的值排序記錄,Host值起決定作用(相同的Host值排在一起,然后再根據User值排序)。然而,排序不是典序(按詞排序),它只是部分是。要牢記的是字面上的詞優(yōu)先于模式。這意味著如果你正從連接服務器而Host有和%.兩個值,則第一個先選。類似地,%.優(yōu)先于%.net,然后是%。IP地址的匹配也是這樣的。總之一句話,越具體越優(yōu)先。user表排序工作如下,假定user表看起來像這樣:+-----------+----------+-|Host|User|...+-----------+----------+-|%|root|...|%|jerry|...|localhost|root|...|localhost||...+-----------+----------+-當服務器在表中讀取時,它以最特定的Host值為先的次序排列('%'在Host列里意味著“任何主機”并且是最不特定的)。有相同Host值的條目以最特定的User值為先的次序排列(一個空白User值意味著“任何用戶”并且是最不特定的)。最終排序的user表看起來像這樣:+-----------+----------+-|Host|User|...+-----------+----------+-|localhost|root|...|localhost||...|%|jerry|...|%|root|...+-----------+----------+-當一個連接被嘗試時,服務器瀏覽排序的條目并使用找到的第一個匹配。對于由jeffrey從localhost的一個連接,在Host列的'localhost'條目首先匹配。那些有空白用戶名的條目匹配連接的主機名和用戶名。('%'/'jeffrey'條目也將匹配,但是它不是在表中的第一匹配。)這是另外一個例子。假定user表看起來像這樣:+----------------+----------+-|Host|User|...+----------------+----------+-|%|jerry|...|||...+----------------+----------+-排序后的表看起來像這樣:+----------------+----------+-|Host|User|...+----------------+----------+-|||...|%|jerry|...+----------------+----------+-一個由jerry從的連接被第一個條目匹配,而一個由jerry從的連接被第二個匹配。普遍的誤解是認為,對一個給定的用戶名,當服務器試圖對連接尋找匹配時,明確命名那個用戶的所有條目將首先被使用。這明顯不是事實。先前的例子說明了這點,在那里一個由jerry從的連接沒被包含'jerry'作為User字段值的條目匹配,但是由沒有用戶名的題目匹配!如果你有服務器連接的問題,打印出user表并且手工排序它看看第一個匹配在哪兒進行。存取控制,階段2:請求證實一旦你建立了一個連接,服務器進入階段2。對在此連接上進來的每個請求,服務器檢查你是否有足夠的權限來執(zhí)行它,它基于你希望執(zhí)行的操作類型。這正是在授權表中的權限字段發(fā)揮作用的地方。這些權限可以來子user、db、host、tables_priv或columns_priv表的任何一個。授權表用GRANT和REVOKE命令操作。(你可以發(fā)覺參考第七章權限系統(tǒng)怎樣工作很有幫助,它列出了在每個權限表中呈現(xiàn)的字段。)user表在一個全局基礎上授予賦予你的權限,該權限不管當前的數據庫是什么均適用。例如,如果user表授予你delete權限,你可以刪除在服務器主機上從任何數據庫刪除行!換句話說,user表權限是超級用戶權限。只把user表的權限授予超級用戶如服務器或數據庫主管是明智的。對其他用戶,你應該把在user表中的權限設成'N'并且僅在一個特定數據庫的基礎上授權,使用db和host表。db和host表授予數據庫特定的權限。在范圍字段的值可以如下被指定:通配符字符“%”和“_”可被用于兩個表的Host和Db字段。在db表的'%'Host值意味著“任何主機”,在db表中一個空白Host值意味著“對進一步的信息咨詢host表”。在host表的一個'%'或空白Host值意味著“任何主機”。在兩個表中的一個'%'或空白Db值意味著“任何數據庫”。在兩個表中的一個空白User值匹配匿名用戶。db和host表在服務器啟動時被讀取和排序(同時它讀user表)。db表在Host、Db和User范圍字段上排序,并且host表在Host和Db范圍字段上排序。對于user表,排序首先放置最特定的值然后最后最不特定的值,并且當服務器尋找匹配入條目時,它使用它找到的第一個匹配。tables_priv和columns_priv表授予表和列特定的權限。在范圍字段的值可以如下被指定:通配符“%”和“_”可用在使用在兩個表的Host字段。在兩個表中的一個'%'或空白Host意味著“任何主機”。在兩個表中的Db、Table_name和Column_name字段不能包含通配符或空白。tables_priv和columns_priv表在Host、Db和User字段上被排序。這類似于db表的排序,盡管因為只有Host字段可以包含通配符,但排序更簡單。請求證實進程在下面描述。(如果你熟悉存取檢查的源代碼,你會注意到這里的描述與在代碼使用的算法略有不同。描述等價于代碼實際做的東西;它只是不同于使解釋更簡單。)對管理請求(shutdown、reload等等),服務器僅檢查user表條目,因為那是唯一指定管理權限的表。如果條目許可請求的操作,存取被授權了,否則拒絕。例如,如果你想要執(zhí)行mysqladminshutdown,但是你的user表條目沒有為你授予shutdown權限,存取甚至不用檢查db或host表就被拒絕。(因為他們不包含Shutdown_priv行列,沒有這樣做的必要。)對數據庫有關的請求(insert、update等等),服務器首先通過查找user表條目來檢查用戶的全局(超級用戶)權限。如果條目允許請求的操作,存取被授權。如果在user表中全局權限不夠,服務器通過檢查db和host表確定特定的用戶數據庫權限:服務器在db表的Host、Db和User字段上查找一個匹配。Host和User對應連接用戶的主機名和MySQL用戶名。Db字段對應用戶想要存取的數據庫。如果沒有Host和User的條目,存取被拒絕。如果db表中的條目有一個匹配而且它的Host字段不是空白的,該條目定義用戶的數據庫特定的權限。如果匹配的db表的條目的Host字段是空白的,它表示host表列舉主機應該被允許存取數據庫的主機。在這種情況下,在host表中作進一步查找以發(fā)現(xiàn)Host和Db字段上的匹配。如果沒有host表條目匹配,存取被拒絕。如果有匹配,用戶數據庫特定的權限以在db和host表的條目的權限,即在兩個條目都是'Y'的權限的交集(而不是并集!)計算。(這樣你可以授予在db表條目中的一般權限,然后用host表條目按一個主機一個主機為基礎地有選擇地限制它們。)在確定了由db和host表條目授予的數據庫特定的權限后,服務器把他們加到由user表授予的全局權限中。如果結果允許請求的操作,存取被授權。否則,服務器檢查在tables_priv和columns_priv表中的用戶的表和列權限并把它們加到用戶權限中?;诖私Y果允許或拒絕存取。用布爾術語表示,前面關于一個用戶權限如何計算的描述可以這樣總結:globalprivilegesOR(databaseprivilegesANDhostprivileges)ORtableprivilegesORcolumnprivileges它可能不明顯,為什么呢,如果全局user條目的權限最初發(fā)現(xiàn)對請求的操作不夠,服務器以后把這些權限加到數據庫、表和列的特定權限。原因是一個請求可能要求超過一種類型的權限。例如,如果你執(zhí)行一個INSERT...SELECT語句,你就都要insert和select權限。你的權限必須如此以便user表條目授予一個權限而db表條目授予另一個。在這種情況下,你有必要的權限執(zhí)行請求,但是服務器不能自己把兩個表區(qū)別開來;兩個條目授予的權限必須組合起來。host表能被用來維護一個“安全”服務器列表。在TcX,host表包含一個在本地的網絡上所有的機器的表,這些被授予所有的權限。你也可以使用host表指定不安全的主機。假定你有一臺機器public.your.domain,它位于你不認為是安全的一個公共區(qū)域,你可以用下列的host表條目子允許除了那臺機器外的網絡上所有主機的存?。?--------------------+----+-|Host|Db|...+--------------------+----+-|public.your.domain|%|...(所有權限設為'N')|%.your.domain|%|...(所有權限設為'Y')+--------------------+----+-當然,你應該總是測試你在授權表中的條目(例如,使用mysqlaccess)讓你確保你的存取權限實際上以你認為的方式被設置。7.1.5總結本節(jié)詳細敘述了MySQL權限系統(tǒng)的原理,包括MySQL存取證實的完整過程。MySQL通過授權表實現(xiàn)了一個不同于SQL92標準的權限系統(tǒng),本節(jié)所述的授權表的結構和內容對于本章以后的理解十分重要,因為涉及到直接修改授權表的知識。盡管你可以使用GRANT和REVOKE語句完成大部分的授權,但是只有了解授權表的結構和內容,你才能更好的控制系統(tǒng),使你的系統(tǒng)更為安全。在很多時候,直接修改授權表是唯一的手段。另外一個重要的知識是授權表中的user和host字段。了解MySQL服務器用戶匹配的順序以及身份驗證的過程,有利于你配置一個安全的系統(tǒng)。7.2設置用戶與并授權你可以有2個不同的方法增加用戶:通過使用GRANT語句或通過直接操作MySQL授權表。比較好的方法是使用GRANT語句,因為他們是更簡明并且好像錯誤少些。7.2.1使用SHOWGRANTS語句顯示用戶的授權你可以直接查看授權表,也可以使用SHOWGRANTS語句查看某個用戶的授權,這種情況下使用SHOWGRANTS語句顯然要方便一些。語法:SHOWGRANTSFORuser_name為了容納對任意主機的用戶授予的權利,MySQL支持以user@host格式指定user_name值。例如,下面的語句顯示一個用戶admin的權限:mysql>SHOWGRANTSFORadmin@localhost;其結果為創(chuàng)建該用戶的GRNAT授權語句:GRANTRELOAD,SHUTDOWN,PROCESS密碼是加密后的形式。下小節(jié)會介紹如何使用GRANT語句授權。7.2.2使用grant語句創(chuàng)建用戶并授權GRANT語句的語法GRANTpriv_type(columns)ONwhatTOuserIDENTIFIEDBY“password”WITHGRANTOPTION要使用該語句,需要填寫以下部分:priv_type分配給用戶的權限。priv_type可以指定下列的任何一個:ALLPRIVILEGESFILERELOADALTERINDEXSELECTCREATEINSERTSHUTDOWNDELETEPROCESSUPDATEDROPREFERENCESUSAGEALL是ALLPRIVILEGES的一個同義詞,REFERENCES還沒被實現(xiàn),USAGE當前是“沒有權限”的一個同義詞。它能用在你想要創(chuàng)建一個沒有權限用戶的時候。對于表,你能指定的唯一priv_type值是SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、GRANT、INDEX和ALTER。對于列,你能指定的唯一priv_type值是(即,當你使用一個column_list子句時)是SELECT、INSERT和UPDATE。columns權限適用的列。這是可選的,只來設置列專有的權限。如果命名多于一個列,則用逗號分開。what權限應用的級別GRANT允許系統(tǒng)主管在4個權限級別上授權MySQL用戶的權利:全局級別全局權限作用于一個給定服務器上的所有數據庫。這些權限存儲在mysql.user表中。你能通過使用ON*.*語法設置全局權限數據庫級別數據庫權限作用于一個給定數據庫的所有表。這些權限存儲在mysql.db和mysql.host表中。你能通過使用ONdb_name.*語法設置數據庫權限。如果你指定ON*并且你有一個當前數據庫,你將為該數據庫設置權限。(警告:如果你指定ON*而你沒有一個當前數據庫,你將影響全局權限!)表級別表權限作用于一個給定表的所有列。這些權限存儲在mysql.tables_priv表中。你能透過ONtbl_name,為具體的表名設置權限。列級別列權限作用于在一個給定表的單個列。這些權限存儲在mysql.columns_priv表中。你可以通過指定一個columns子句將權限授予特定的列,同時要在ON子句中指定具體的表。對與一個表或列的權限是由4個權限級別的邏輯或形成的。例如,如果mysql.user表指定一個用戶有一個全局select權限,它不能被數據庫、表或列的一個條目否認。對于一個列的權限能如下計算:globalprivilegesOR(databaseprivilegesANDhostprivileges)ORtableprivilegesORcolumnprivileges在大多數情況下,你只授予用戶一個權限級別上的權限,因此現(xiàn)實通常不象上面所說的那樣復雜。user使用權限的用戶。為了容納對任意主機的用戶授予的權利,MySQL支持以user@host格式指定user_name值。如果你想要指定一個特殊字符的一個user字符串(例如“-”),或一個包含特殊字符或通配符的host字符串(例如“%”),你可以用括號括起能用戶或主機名字(例如,'test-user'@'test-hostname')。你能在主機名中指定通配符。例如,user@"%."適用于在域中任何主機的user,并且user@"144.155.166.%"適用于在144.155.166類C子網中任何主機的user。簡單形式的user是user@"%"的一個同義詞。注意:如果你允許匿名用戶連接MySQL服務器(它是缺省的),你也應該增加所有本地用戶如user@localhost,因為否則,當用戶試圖從本地機器上登錄到MySQL服務器時,對于mysql.user表中的本地主機的匿名用戶條目將被使用!匿名用戶通過插入有User=''的條目到mysql.user表中來定義。通過執(zhí)行這個查詢,你可以檢驗它是否作用于你:mysql>SELECTHost,UserFROMmysql.userWHEREUser='';password分配給該用戶的口令。這也是可選的。在MySQL3.22.12或以后,如果創(chuàng)建一個新用戶或如果你有全局授予權限,用戶的口令將被設置為由IDENTIFIEDBY子句指定的口令,如果給出一個。如果用戶已經有了一個口令,它被一個新的代替。警告:如果你創(chuàng)造一個新用戶但是不指定一個IDENTIFIEDBY子句,用戶沒有口令。這是不安全的。WITHGRANTOPTION子句是可選的。WITHGRANTOPTION子句給與用戶有授予其他用戶在指定的權限水平上的任何權限的能力。你應該謹慎對待你授予他grant權限的用戶,因為具有不同權限的兩個用戶也許能合并權限!創(chuàng)建用戶并授權的實例創(chuàng)建一個具有超級用戶權利的用戶:mysql>GRANTALLON*.*TOanyname@localhostIDENTIFIEDBY"passwd"->WITHGRANTOPTION該語句將在user表中為anyname@localhost創(chuàng)建一個記錄,打開所有權限。數據庫級權限用一個ONdb_name.*子句而不是ON*.*進行授權:mysql>GRANTALLONsample.*TOboris@localhostIDENTIFIEDBY"ruby"這些權限不是全局的,所以它們不存儲在user表中,我們仍然需要在user表中創(chuàng)建一條記錄(使得用戶能連接),但我們也需要創(chuàng)建一個db表記錄記錄數據庫集的權限。7.2.3直接修改授權表創(chuàng)建用戶并授權如果你還記得前面的介紹,你應該能即使不用GRANT語句也能做GRANT做的事情。記住在你直接修改授權表時,你將通知服務器重載授權表,否則他不知道你的改變。你可以執(zhí)行一個mysqladminflush-privileges或mysqladminreload命令和FLUSHPRIVILEGES語句強迫一個重載。如果你忘記做這個,你會疑惑為什么服務器不做你想做的事情。下列GRANT語句創(chuàng)建一個擁有所有權的超級用戶。包括授權給別人的能力:GRANTALLON*.*TOanyname@localhostIDENTIFIEDBY"passwd"WITHGRANTOPTION該語句將在user表中為anyname@localhost創(chuàng)建一個記錄,打開所有權限,因為這里是超級用戶(全局)權限存儲的地方,要用INSERT語句做同樣的事情,語句是:INSERTINTOuserVALUES("localhost","anyname",PASSWORD("passwd"),"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y")你可能發(fā)現(xiàn)它不工作,這要看你的MySQL版本。授權表的結構已經改變而且你在你的user表可能沒有14個權限列。用SHOWCOLUMNS找出你的授權表包含的每個權限列,相應地調整你的INSERT語句。下列GRANT語句也創(chuàng)建一個擁有超級用戶身份的用戶,但是只有一個單個的權限:GRANTRELOADON*.*TOflush@localhostIDENTIFIEDBY"flushpass"本例的INSERT語句比前一個簡單,它很容易列出列名并只指定一個權限列。所有其它列將設置為缺省的"N":INSERTINTOuser(Host,Password,Reload)VALUES("localhost","flush",PASSWORD("flushpass"),"Y")數據庫級權限用一個ONdb_name.*子句而不是ON*.*進行授權:GRANTALLONsample.*TOboris@localhostIDENTIFIEDBY"ruby"這些權限不是全局的,所以它們不存儲在user表中,我們仍然需要在user表中創(chuàng)建一條記錄(使得用戶能連接),但我們也需要創(chuàng)建一個db表記錄記錄數據庫集權限:mysql>INSERTINTOuser(Host,User,Password)->VALUES("localhost","boris",PASSWORD("ruby"));mysql>INSERTINTOdbVALUES->("localhost","sample_db","boris","Y","Y","Y","Y","Y","Y","N","Y","Y","Y");"N"列是為GRANT權限;對末尾的一個數據庫級具有WITHGRANTOPTION的GRANT語句,你要設置該列為"Y"。要設置表級或列級權限,你對tables_priv或columns_priv使用INSERT語句。當然,如果你沒有GRANT語句,你將沒有這些表,因為它們在MySQL中同時出現(xiàn)。如果你確實有這些表并且為了某些原因想要手工操作它們,要知道你不能用單獨的列啟用權限。你設置tables_priv.Table_priv或columns_priv.Column_priv列來設置包含你想啟用的權限值。例如,要對一個表啟用SELECT和INSERT權限,你要在相關的tables_priv的記錄中設置Table_priv為"Select,Insert"。7.2.4總結本屆介紹了如何建立用戶,如何為用戶分配權限。GRANT語句雖然能夠為用戶分配權限,使用比較方便,但是從安全角度,從增加對系統(tǒng)了解角度,你應該盡量使用直接修改授權表的方法。這樣可以更精確的控制授權,能夠對授權表完全了解,避免因為GRANT語句的錯誤,是MySQL服務器的安全性降低。7.3撤銷用戶與授權撤銷用戶和授權的有兩種方法,一是使用REVOKE語句,二是直接修改授權表。7.3.1使用revoke語句撤銷授權為了收回某個用戶的權限,可使用REVOKE語句。除了要用FROM替換TO并且沒有IDENTIFIEDBY或WITHGRANTOPTION子句外語法:REVOKEprivileges(columns)ONwhatFROMuser;user部分必須頁你想要取消其權限的用戶的原始GRANT語句的user部分相匹配。Privileges部分不需要匹配,你可用GRANT語句授權,然后用REVOKE語句取消啟動的一部分。REVOKE語句只刪除權限,不刪除用戶。用戶的項仍然保留在user表中,即使你去笑了改用戶的所有權限也是如此。這意味著該用戶仍然可以連接到服務其上。要刪除整個用戶,必須用DELETE語句將該用戶的記錄從user表中直接刪除。要想刪除整個用戶,必須直接將該用戶的記錄從user表中直接刪除。例如,如果你為一個數據庫授權,如果需要在mysql.db表中創(chuàng)建一個條目。mysql>GRANTALLONsample.*TOkite@localhostIDENTIFIEDBY"ruby";當所有為數據庫的授權用REVOKE刪除時,這個條目被刪除。mysql>REVOKEALLONsample.*FROMkite@localhost;但是,boris@localhost用戶的條目仍舊留在user表中,你可以查看:mysql>SELECT*FROMmysql.user;+-----------+-------+|Host|User|+-----------+-------+|localhost|root||localhost|kite||localhost|admin||%|root|+-----------+-------+7.3.2直接修改授權表撤銷用戶或授權顯而易見,可以直接在授權表中給用戶撤銷授權,有時,這是唯一的方法,如撤銷一個用戶。記住在你直接修改授權表時,你將通知服務器重載授權表,否則他不知道你的改變。你可以執(zhí)行一個mysqladminflush-privileges或mysqladminreload命令和FLUSHPRIVILEGES語句強迫一個重載。如果你忘記做這個,你會疑惑為什么服務器不做你想做的事情。在上節(jié)最后一個例子中,可以這樣撤銷用戶:mysql>DELETEFROMmysql.user->WHEREUser=”kite”ANDHost=”localhost”;mysql>FLUSHPRIVILEGES;mysql>SELECT*FROMmysql.user;+-----------+-------+|Host|User|+-----------+-------+|localhost|root||localhost|admin||%|root|+-----------+-------+DELETE語句刪除該用戶的項,F(xiàn)LUSH語句告訴服務器重新假造授權表(但是用GRANT或REVOKE語句,而不是直接修改授權表時,這些表將自動重新加載)。而REVOKEALLONsample.*FROMboris@localhost對應的,可以這樣直接修改授權表:mysql>DELETEFROMmysql.db->WHEREUser=”boris”ANDHost=”localhost”ANDdb=”sample”;mysql>FLUSHPRIVILEGES;7.3.3總結本節(jié)介紹了如何撤銷用戶和授權,使用REVOKE語句只能撤銷授權,不能撤銷用戶,而直接修改授權表既可以撤銷授權,也可以撤銷用戶。使用時,注意直接修改授權表一般需要多個步驟,操作多個表的內容。7.4設置密碼由MySQL使用用戶名和口令的方法與Unix或Windows使用的方式有很多不同之處:MySQL使用于認證目的的用戶名,與Unix用戶名(登錄名字)或Windows用戶名無關。缺省地,大多數MySQL客戶嘗試使用當前Unix用戶名作為MySQL用戶名登錄,但是這僅僅為了方便。客戶程序允許用-u或--user選項指定一個不同的名字,這意味著無論如何你不能使得一個數據庫更安全,除非所有的MySQL用戶名都有口令。任何人可以試圖用任何名字連接服務器,而且如果他們指定了沒有口令的任何名字,他們將成功。MySQL用戶名最長可以是16各字符;典型地,Unix用戶名限制為8個字符。MySQL口令與Unix口令沒關系。在你使用登錄到一臺Unix機器口令和你使用在那臺機器上存取一個數據庫的口令之間沒有必要有關聯(lián)。MySQL加密口令使用了一個Unix登錄期間所用的不同算法。本節(jié)將介紹如何為MySQL數據庫系統(tǒng)的用戶修改密碼。7.4.1使用myadmin實用程序使用mysqladmin實用程序修改密碼的命令行是:shell>mysqladmin-uuser-ppassword"newpassword"運行這個命令,在提示輸入密碼時,數據就密碼,則用戶user的密碼就被改為newpassword。如果,原來的用戶沒有密碼,則不比指定-p選項。例如,初始化授權表之后,root用戶的密碼就是空的,你可以這樣為root用戶設立密碼:shell>mysqladmin-urootpassword"newpassword"7.4.2使用語句SETPASSWORD使用mysqladmin為用戶修改密碼有一個明顯的缺點,就是必須知道用戶原來的密碼,如果是為了給遺忘了密碼的用戶重設密碼就無能為力了。一個專門用于修改密碼的SQL語句為SETPASSWORD:SETPASSWORD=PASSWORD('somepassword')設置當前用戶的口令。任何非匿名的用戶能改變他自己的口令!連接到服務器后,你可以這樣改變自己的密碼:mysql>SETPASSWORD=PASSWORD('anotherpass');SETPASSWORDFORuser=PASSWORD('somepassword')設置當前服務器主機上的一個特定用戶的口令。只有具備存取mysql數據庫的用戶可以這樣做。用戶應該以user@hostname格式給出,這里user和hostname完全與他們列在mysql.user表條目的User和Host列一樣。例如,如果你有一個條目其User和Host字段是'bob'和'%.',你將寫成:mysql>SETPASSWORDFORbob@"%."=PASSWORD("newpass");7.4.3直接修改授權表另一種修改,密碼的方法是直接修改授權表user。只有具備存取mysql數據庫的用戶可以這樣做。例如,如果你有一個條目其User和Host字段是'bob'和'%.',你將寫成:mysql>UPDATEmysql.userSETpassword=PASSWORD("newpass")whereuser="bob'ANDhost="%.";mysql>FLUSHPRIVILEGES;7.4.4重新設置一個遺忘的root口令如果你遺忘了root用戶的口令,那么將會是一件非常麻煩的事。除非你有其它有特權的用戶,否則很多操作都無法完成,例如,關閉數據庫等等。你應當選用--without-grant-tables選項啟動mysqld服務,你可以在這時更改授權表的相關內容,也可以用mysqlaccess檢查你的授權是否到位。例如,如果你忘記了你的MYSQL的root口令的話,你可以通過下面的過程恢復。1、關閉MySQL服務器向mysqldserver發(fā)送kill命令關掉mysqldserver(不是kill-9),存放進程ID的文件通常在MYSQL的數據庫所在的目錄中。kill`cat/mysql-data-directory/hostname.pid`你必須是UNIX的root用戶或者是你所運行的SERVER上的同等用戶,才能執(zhí)行這個操作。如果在windows平臺上,也可以停止進程。如果是NT還可以用netstopmysql命令關閉數據庫。2、使用'--skip-grant-tables'參數來啟動mysqld。Unix平臺: $sumysql $safe_mysqld--skip-grant-tables&Windows平臺: C:\mysql\bin>mysqld--skip-grant-tables以上語句,假定都位于正確的目錄。3、連接到服務器,修改口令使用'mysql-hhostnamemysql'命令登錄到mysqldserver,用grant命令改變口令:mysql>GRANTALLON*.*TOroot@localhostINDENTIFIEDBY'newpassword' ->WITHGRANTOPTION;mysql>GRANTALLON*.*TOroot@%INDENTIFIEDBY'newpassword' ->WITHGRANTOPTION;(如果存在一個能從任意地址登錄的root用戶,初始化授權表后,生成該用戶,為了安全,你可能已經刪除該用戶)。其實也可以直接修改授權表:mysql>usemysql;mysql>updateusersetpassword=password('yourpass')whereuser='root';你可能使用工具mysqladmin修改密碼:shell>mysqladmin-hhostname-urootpassword'newpassword但是它修改的密碼語服務器匹配的用戶有關。如果,你從服務器主機連接,那么服務器匹配的是root@localhost,修改該用戶密碼,否則一般修改root@%密碼,除非你有其它root用戶存在。4.載入權限表:shell>mysqladmin-hhostnameflush-privileges或者使用SQL命令`FLUSHPRIVILEGES'。當然,在這里,你也可以重啟mysqld。7.4.5總結本節(jié)介紹了如何修改一個用戶的密碼,你可以使用三種方法,GRANT語句、SETPASSWORD語句、直接修改授權表以及使用管理工具mysqladmin。一個重要的應用就是如何在遺忘root用戶密碼的時候修改密碼,使用的方法是啟動MySQL服務器時忽略加載授權表。7.5權限修改何時生效7.5.1服務器重新啟動的情況當mysqld啟動時,所有的授權表內容被讀進存儲器并且從那時開始生效。7.5.2被服務器立即應用的情況用GRANT、REVOKE或SETPASSWORD對授權表施行的修改會立即被服務器注意到。7.5.3直接修改授權表的情況如果你手工地修改授權表(使用INSERT、UPDATE等等),你應該執(zhí)行一個FLUSHPRIVILEGES語句或運行mysqladminflush-privileges告訴服務器再裝載授權表,否則你的改變將不生效,除非你重啟服務器。7.5.4對現(xiàn)有客戶連接的影響情況當服務器注意到授權表被改變了時,現(xiàn)存的客戶連接有如下影響:表和列權限在客戶的下一次請求時生效。數據庫權限改變在下一個USEdb_name命令生效。全局權限的改變和口令改變在下一次客戶連接時生效。7.5.5總結本小節(jié)總結了權限修改后以及服務器和客戶機的權限生效的幾種情況,讀者要十分留意這些情況,這對你管理數據庫系統(tǒng)有重要影響。當你為了權限疑惑時,不妨看一下本小節(jié)。7.6授權原則無論怎么小心都難免在給用戶授權時留有漏洞,希望下面的內容能給你一些幫助,你一般應該遵守這些規(guī)則。7.6.1只有root用戶擁有授權表的改寫權不要把授權表的改寫權授予除root用戶之外的其它用戶(當然,如果你可以用另一個用戶代替root用戶進行管理,以增加安全性)。因為這樣,用戶可以通過改寫授權表而推翻現(xiàn)有的權限。產生安全漏洞。一般情況下,你可能不會犯這個錯誤,但是在安裝新的分發(fā),初始授權表之后。這個漏洞是存在的,如果你不了解這時授權表的內容你可能會犯錯誤。在Unix(Linux)上,在按照手冊的指令安裝好MySQL后,你必須運行mysql_install_db腳本建立包含授權表的mysql數據庫和初始權限。在Windows上,運行分發(fā)中的Setup程序初始化數據目錄和mysql數據庫。假定服務器也在運行。當你第一次在機器上安裝MySQL時,mysql數據庫中的授權表是這樣初始化的:你可以從本地主機(localhost)上以root連接而不指定口令。root用戶擁有所有權限(包括管理權限)并可做任何事情。(順便說明,MySQL超級用戶與Unix超級用戶有相同的名字,他們彼此毫無關系。)匿名訪問被授予用戶可從本地連接名為test和任何名字以test_開始的數據庫。匿名用戶可對數據庫做任何事情,但無管理權限。一般地,建議你刪除匿名用戶記錄:mysql>DELETEFROMuserWHEREUser="";更進一步,同時刪除其他授權表中的任何匿名用戶,有User列的表有db、tables_priv和columns_priv。另外要給root用戶設置密碼。7.6.2關于用戶、口令及主機的設置對所有MySQL用戶使用口令。記住,如果other_user沒有口令,任何人能簡單地用mysql-uother_userdb_name作為任何其它的人登錄。對客戶機/服務器應用程序,客戶可以指定任何用戶名是常見的做法。在你運行它以前,你可以通過編輯mysql_install_db腳本改變所有用戶的口令,或僅僅MySQLroot的口令,象這樣:shell>mysql-urootmysqlmysql>UPDATEuserSETPassword=PASSWORD('new_password') ->WHEREuser='root';mysql>FLUSHPRIVILEGES;刪除匿名用戶匿名用戶的存在不僅不僅容易引起存取拒絕錯誤,更會產生嚴重的安全漏洞,安裝授權表后,自動安裝匿名用戶。缺省時你可以用任何用戶名連接,不需要密碼,并且具有修改授權表權限。你可以這樣刪除匿名用戶:shell>mysql–uroot–pmysqlmysql>deletefromuserwhereUser=””;留意使用通配符的主機名,盡量縮小主機名的范圍,適合用戶的主機就足夠了,不要讓用戶不使用的主機留在授權表里。如果你不信任你的DNS,你應該在授權表中使用IP數字而不是主機名。原則上講,--secure選項對mysqld應該使主機名更安全。在任何情況下,你應該非常小心地使用包含通配符的主機名!7.6.3授予用戶合適的權限授權用戶足夠使用的權限,不要賦予額外的權限。例如,對于用戶只需要檢索數據表的需求,賦予SELECT權限即可,不可賦予UPDATE、INSERT等寫權限,不要怕被說成時吝嗇鬼??赡軙a生安全漏洞的權限grant權限允許用戶放棄他們的權限給其他用戶。2個有不同的權限并有grant權限的用戶可以合并權限。alter權限可以用于通過重新命名表來推翻權限系統(tǒng)。因為ALTER權限可能以你沒有設想的任何方法被使用。例如,一個用戶user1能訪問table1,但不能訪問table2。但是如果用戶user1帶有ALTER權限可能通過使用ALTERTABLE將table2重命名為table1來打亂你的設想。shutdown權限通過終止服務器可以被濫用完全拒絕為其他用戶服務??赡軙a生嚴重安全漏洞的權限不要把PROCESS權限給所有用戶。mysqladminprocesslist的輸出顯示出當前執(zhí)行的查詢正文,如果另外的用戶發(fā)出一個UPDATEuserSETpassword=PASSWORD('not_secure')查詢,被允許執(zhí)行那個命令的任何用戶可能看得到。mysqld為有process權限的用戶保留一個額外的連接,以便一個MySQLroot用戶能登錄并檢查,即使所有的正常連接在使用。不要把FILE權限給所有的用戶。有這權限的任何用戶能在擁有mysqld守護進程權限的文件系統(tǒng)那里寫一個文件!為了使這更安全一些,用SELECT...INTOOUTFILE生成的所有文件對每個人是可讀的,并且你不能覆蓋已經存在的文件。FILE權限也可以被用來讀取任何作為運行服務器的Unix用戶可存取的文件。這可能被濫用,因為不僅有該服務器主機帳號的用戶可以讀取它們,而且有FILE權限的任何客戶機也可以通過網絡讀取它們。你的數據庫目錄和系統(tǒng)的各種文件可能成為全球范圍共享的文件!例如,通過使用LOADDATA裝載“/etc/passwd”進一個數據庫表,然后它能用SELECT被讀入。下面的過程說明如何進行此項操作:建具有LONGBLOB列的表:mysql>USEtest;mysql>CREATETABLEtemp(bLONGBLOB);2、用此表讀取你要竊取的文件的內容:mysql>LOADDATAINFILE“/etc/passwd”INTOTABLEtemp ->FIELDSESCAPEDBY“”LINESTERMINATEDBY“”;mysql>SELECT*FROMtemp;3、可以這樣竊取你的數據表data:mysql>LOADDATAINFILE“./other_db/data.frm”INTOTABLEtemp ->FIELDSESCAPEDBY“”LINESTERMINATEDBY“”;mysql>SELECT*FROMtempINTOOUTFILE“./another_db/data.frm” ->FIELDSESCAPEDBY“”LINESTERMINATEDBY“”;mysql>DELETEFROMtemp;mysql>LOADDATAINFILE“./other_db/data.MYD”INTOTABLEtemp ->FIELDSESCAPEDBY“”LINESTERMINATEDBY“”;mysql>SELECT*FROMtempINTOOUTFILE“./another_db/data.MYD” ->FIELDSESCAPEDBY“”LINESTERMINATEDBY“”;mysql>DELETEFROMtemp;mysql>LOADDATAINFILE“./other_db/data.MYI”INTOTABLEtemp ->FIELDSESCAPEDBY“”LINESTERMINATEDBY“”;mysql>SELECT*FROMtempINTOOUTFILE“./another_db/data.MYI” ->FIELDSESCAPEDBY“”LINESTERMINATEDBY“”;mysql>DELETEFROMtemp;然后用戶就擁有的一個新表another.data,可以對它進行完全訪問。7.6.4MySQL權限系統(tǒng)無法完成的任務有一些事情你不能用MySQL權限系統(tǒng)做到:你不能明顯地指定一個給定用戶應該被拒絕存取。即,你不能明顯地匹配一個用戶并且然后拒絕連接。你不能指定一個用戶有權創(chuàng)建立或拋棄一個數據庫中的表,也不能創(chuàng)建或拋棄數據庫本身7.6.5總結本節(jié)講述了如何為用戶分配合適的權限,幾個重要的原則就是給用戶分配僅夠使用的最小權限,盡量不在影響整個數據庫的user表中分配權限。有些權限是有危險的,例如FILE、GRANT、PROCESS,管理員要慎重使用。7.7MySQL的其它安全問題數據庫系統(tǒng)的安全性包括很多方面。由于很多情況下,數據庫服務器容許客戶機從網絡上連接,因此客戶機連接的安全對MySQL數據庫安全有很重要的影響。7.7.1不在客戶機的命令行上提供密碼使用mysql、mysqladmin等客戶機用一個用戶身份與MySQL服務器連接時,需要為連接提供密碼。1可以在命令行上提供密碼shell>mysql–uroot–pmypass注意,-p選項與密碼之間不可有空格,否則會提示你輸入密碼,并報錯。你也可以使用長格式shell>mysql–user=root–password=mypass現(xiàn)在你可以考察這樣做的后果:在Unix上,$ps–aux|grepmysql在win9x上,你可以按住Ctrl+Alt+Del鍵,NT上你可以打開任務管理器。你發(fā)現(xiàn)了什么,你發(fā)現(xiàn)密碼清清楚楚的顯示在你的面前。所以,你無論何時也不要這么做。所以你需要讓客戶機提示你的密碼:shell>mysql–uroot–p你也可以使用選項文件

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論