


下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、MySQL金典培訓教程10第七章數據庫安全本章要點:MySQL權限系統原理 如何授予撤銷用戶和授權 如何直截了當修改授權表 授予用戶權限的規范和注意事項My作為一個MySQL的系統治理員,你有責任愛護你的 MySQL數據庫 系統的數據安全性和完整性。本文要緊要緊介紹如何建立一個安全的 SQL系統,從系統內部和外部網絡兩個角度,為你提供一個指南。本章要緊考慮下列安全性有關的咨詢題:什么緣故安全性專門重要,你應該防范那些攻擊? 服務器面臨的風險(內部安全性),如何處理? 連接服務器的客戶端風險(外部安全性),如何處理?錄V數據庫系統的內部安全性和MySQL治理員有責任保證數據庫內容的安全性,使得這
2、些數據記 只能被那些正確授權的用戶訪咨詢,這涉及至 外部安全性。內部安全性關懷的是文件系統級的咨詢題,即,防止 MySQL 數據名 目( DATADIR )被在服務器主機有賬號的人(合法或竊取的)進行攻 擊。如果數據名目內 容的權限過分授予,使得每個人均能簡 單地替代對應于那些數據庫表的文件,那么確保控 制客戶通過網絡訪咨 詢的授權表設置正確,對此毫無意義。外部安全性關懷的是從外部通過網絡連接服務器的客戶的咨詢題, 即,愛護 MySQL 服務器免受來自通過網絡對服務器的連接的攻擊。你必 須設置MySQL授權表(grant table),使得他們不承諾訪咨詢服務器治 理的數據庫內容,除非提供有效
3、的用戶名和口令。下面就詳細介紹如何設置文件系統和授權表 mysql,實現MySQL的 兩級安全性。7.1 MySQL 的權限系統MySQL 有一套先進的但非標準的安全 /授權系統,把握其授權機制是 開始操作MySQL數據庫必須要走的第一步,關于一個熟悉 SQL差不多 操作的人來講,也是 MySQL 所有的知識中比較難以明白得的一個部分。 本節通過掀開其授權系統的運作機制,期望大伙兒能夠能夠更好地操作和 使用那個優秀的數據庫系統。MySQL 的安全系統是專門靈活的,它承諾你以多種不同方式設置用 戶權限。一樣地,你可使用標準的 SQL 語句 GRANT 和 REVOKE 語句 做,他們為你修改操縱
4、客戶訪咨詢的授權表,然而,你可能由一個不支持 這些語句的老版本的MySQL (在之前這些語句不起作用),或者 你發覺用戶權限看起來不是以你想要的方式工作。關于這種情形,了解 MySQL 授權表的結構和服務器如何利用它們決定訪咨詢權限是有關心 的,如此的了解承諾你通過直截了當修改授權表增加、刪除或修改用戶權 限,它也承諾你在檢查這些表時診斷權限咨詢題。7.1.1 授權表的結構通過網絡連接服務器的客戶對 MySQL數據庫的訪咨詢由授權表內容 來操縱。這些表位于mysql數據庫中,并在第一次安裝 MySQL的過程中 初始化(運行 mysql_install_db腳本)。授權表共有5個表:user、d
5、b、ho st、 tables_priv和 columns_priv。授權表use、db和host的結構和作用表7-1 授權表use、db和host的結構User 表Db表Host 表作用域列HostHostHostDbDbUserUserPassword數據庫/表的權限列Alter_privAlter_privAlter_privCreate_privCreate_privDelete_privDelete_privDrop_privDrop_privIn dex_privIn dex_privIn dex_privIn sert_privIn sert_privRefere nces_pr
6、ivRefere nces_privSelect_privSelect_privUpdate_privUpdate_privUpdate_privAlter_privAlter_privAlter_privFile_privGran t_privGran t_privGran t_privProcess_privReload_privShutdow n priv授權表的內容有如下用途:user 表user表列出能夠連接服務器的用戶及其口令,同時它指定他們有哪種 全局(超級用戶)權限。在user表啟用的任何權限均是全局權限,并適 用于所有數據庫。例如,如果你啟用了 DELETE權限,在那個地點列
7、出 的用戶能夠從任何表中刪除記錄,因此在你如此做之前要認真考慮。db表db表列出數據庫,而用戶有權限訪咨詢它們。在那個地點指定的權 限適用于一個數據庫中的所有表。host 表host表與db表結合使用在一個較好層次上操縱特定主機對數據庫的 訪咨詢權限,這可能比單獨使用 db好些。那個表不受GRANT和REVO KE語句的阻礙,因此,你可能發覺你全然不是用它。授權表tables_priv和columns_priv的結構和作用表 7-2 授權表 tables_priv和 columns_priv 的結構授權表 tables priv授權表 columns priv作用:域列HostHostDbDb
8、UserUserTable_ nameTable_ nameColumn name權限列Table privColumn priv其他例TimestampTimestampGran tor從MySQL沒有rows_priv表,因為它不提供記錄級權限,例如,你不 能限制用戶于表中包含特定列值的行。如果你確實需要這種能力,你必須 用應用編程來提供。如果你想執行建議的記錄級鎖定,你可用GET_LOCK()函數做到。授權表的內容有如下用途:tables_priv 表tables_priv表指定表級權限,在那個地點指定的一個權限適用于一個 表的所有列。colu mn s_priv 表colu mn s_
9、priv表指定列級權限。那個地點指定的權限適用于一個表的 特定列。心tables_priv和 columns_priv 表在 版引進(與 GRAN T語句同時)。如果你有較早版本的 MySQL,你的mysql數據庫將只有u ser、db和host表。如果你從老版本升級到或更新,而沒有tables_ priv 禾口 columns_priv表,運行 mysql_fix_privileges_tables腳本倉U建它們。用戶的權限權限信息用 user、db、host、tables_priv和 columns_priv 表被儲備在 mysql數據庫中(即在名為mysql的數據庫中)。在MySQL啟動
10、時和在7.5 權限修改何時生效所講的情形時,服務器讀入這些數據庫表內容。7.121數據庫和表的權限下列權限運用于數據庫和表上的操作。SELECT承諾你使用SELECT語句從表中檢索數據。SELECT語句只有在他們 真正從一個表中檢索行是才需要select權限,你能夠執行某個SELECT語 句,甚至沒有任何到服務器上的數據庫里的存取任何東西的許可。例如, 你可使用mysql客戶作為一個簡單的運算器:mysql> SELECT 1+1;mysql> SELECT Pl()*2;UPDATE承諾你修改表中的已有的記錄。INSERT承諾在表中插入記錄DELETE承諾你從表中刪除現有記錄。A
11、LTER承諾你使用ALTER TABLE語句,這事實上是一個簡單的第一級權 限,你必須由其他權限,這看你想對數據庫實施什么操作。CREATE承諾你創建數據庫和表,但不承諾創建索引。DROP承諾你刪除(拋棄)數據庫和表,但不承諾刪除索引。,注意:如果你將mysql數據庫的drop權限授予一個用戶,該用戶 能拋棄儲備了 MySQL存取權限的數據庫!INDEX承諾你創建并刪除索引。REFERENCES目前不用。治理權限 下列權限運用于控降服務器或用戶授權能力的操作的治理性操作。FILE 承諾你告訴服務器讀或寫服務器主機上的文件。該權限不應該隨便授 予,它專門危險,見“回避授權表風險”。服務器確實較慎
12、重地保持在一 定范疇內使用該權限。你只能讀任何人都能讀的文件。你正在寫的文件必 須不是現存的文件,這防止你迫使服務重視寫重要文件,如 /etc/passwd或 屬于不人的數據庫的數據名目。如果你授權FILE權限,確保你不以UNIX的root用戶運行服務器, 因為root可在文件系統的任何地點創建新文件。如果你以一個非特權用戶 運行服務器,服務器只能在給用戶能訪咨詢的名目中創建文件。GRANT 承諾你將你自己的權限授予不人,包括 GRANT 。PROCESS承諾你通過使用 SHOW PROCESS語句或mysqladmin process命令 查看服務器內正在運行的線程(進程)的信息。那個權限也
13、承諾你用 KIL L 語句或 mysqladmin kill 命令殺死線程。你總是能看到或殺死你自己的線程。PROCESS權限給予你對任何線 程做這些情況的能力。RELOAD承諾你執行大量的服務器治理操作。你能夠發出 FLUSH 語句,你也 能指性 mysqladmin 的 reload、refresh、flush-hosts、flush-logs、flush-privil eges禾口 flush-tables等命令。SHUTDOWN承諾你用mysqladmin shutdown關閉服務器。在user、db和host表中,每一個權限以一個單獨的列指定。這些列 全部聲明為一個ENUM(&quo
14、t;N","Y")類型,因此每個權的缺省值是“ N”。在 tables_priv和columns_priv中的權限以一個SET表示,它承諾權限用一個 單個列以任何組合指定。這兩個表比其他三個表更新,這確實是什么緣故 它們使用更有效的表示方式的緣故。(有可能在以后,user、db和host表也用一個SET類型表示。)授權表列的內容7.131作用域列內容一些范疇列要求文字值,但它們大多數承諾通配符或其他專門值。表7-3作用域列的類型字段名類型HostCHAR(60)UserCHAR(16)PasswordCHAR(16)DbCHAR(64) (tables_priv
15、和 columns_priv 表 為 CHAR(60)Host一個Host列值能夠是一個主機名或一個IP地址。值localhost意味著 本地主機,但它只在你用一個localhost主機名時才匹配,而不是你在使用 主機名時。如果你的本地主機名是 同時在user表中有對你的 兩條記錄,一個有一個 Host值或localhost,而另一個有 有l ocalhost的記錄將只當你連接localhost時匹配,其他在只在連接 pit.snake. net時才匹配。如果你想讓客戶能以兩種方式連接,你需要在user表中有兩條記錄。你也能夠用通配符指定Host值。能夠使用SQL的模式字符“ ”和 “并具有當
16、你在一個查詢中使用LIKE算符同樣的含義(不承諾regex 算符)。SQL模式字符都能用于主機名和IP地址。如匹配任 何域內的主機,而%.edu匹配任何教育學院的主機。類似地,19 2.168.%匹配任何在192.168 B類子網的主機,而192.1683%匹配任何在192.168.3 C類子網的主機。%值匹配所有主機,并可用于承諾一個用戶從任何地點連接。一個空 白的Host值等同于。(例外:在db表中,一個空白Host值含義是“進 一步檢查host表”,該過程在“查詢訪咨詢驗證”中介紹。)從 MySQL 3.23 起,你也能夠指定帶一個表明那些為用于網絡地址的
17、 網絡掩碼的 IP 地址,如 指定一個 17位網絡地址并匹配 其 IP 地址是 前 17位的任何主機。User 用戶名必須是文字的或空白。一個空白值匹配任何用戶。%作為一個User值不意味著空白,相反它匹配一個字面上的 名字,這可能不是你想 要的。當一個到來的連接通過user表被驗證而匹配的記錄包含一個空白的 User值,客戶被認為是一個匿名用戶。Password 口令值能夠是空或非空,不承諾用通配符。一個空口令不意味著匹配 任何口令,它意味著用戶必須不指定口令。口令以一個加密過的值儲備,不是一個字面上的文本。如果你在 Pass word 列中儲備一個照字面上的口令,用戶將不能連接! GRAN
18、T 語句和 m ysqladmi n password命令為你自動加密口令,然而如果你用諸如 INSER T、REPLACE、UPDATE 或 SET PASSWORD 等命令,一定要用 PASSW ORD(”new_password")而不是簡單的"new_password來指定口令。Db在columns_priv和tables_priv表中,Db值必須是真正的數據庫名(照字面上),不承諾模式和空白。在 db和host中,Db值能夠以字面 意義指定或使用 SQL 模式字符'%'或'_'指定一個通配符。一個 '%'或空白匹 配
19、任何數據庫。Table_name, Column_name這些列中的值必須是照字面意思的表或列名,不承諾模式和空白。 某些范疇列被服務器視為大小寫敏銳的,其余不是。這些原則總結在 下表中。專門注意Table_name值總是被看作大小寫敏銳的,即使在查詢中的表名的大小寫敏銳性對待視服務器運行的主機的文件系統而定(UNIX下是大小寫敏銳,而Windows不是)。某些作用域列被服務器視為大小寫敏銳的,其余不是。這些原則總結 在下表中。專門注意Table_name(直總是被看作大小寫敏銳的,即使在查 詢中的表名的大小寫敏銳性對待視服務器運行的主機的文件系統而定(UNIX下是大小寫敏銳,而 Window
20、s不是)。表7-4作用域列的大小寫敏銳性列大小寫敏銳性HostNoUserYesPasswordYesDbYesTable_nameYesColumn nameNo7.132授權表User、Db和Host的權限列的內容在user、db和host表中,所有權限字段被聲明為 ENUM('N','Y')-每 一個都可有值'N'或'Y',同時缺省值是'N'.7.133授權表tables_priv和columns_priv的權限列的內容 在tables_priv和columns_priv表中,權限字段被聲明為 SET字段:
21、表7-5 授權表tables_priv和columns_priv的權限列的類型表名字段名可能的集合成員tables_privTable_priv'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'tables_privColumn_priv'Select', 'Insert
22、', 'Update', 'References'columns privColumn priv'Select', 'Insert', 'Update', 'References'權限系統工作原理7.141權限系統工作的一樣過程MySQL權限系統保證所有的用戶能夠嚴格地做他們假定被承諾做的 情況。當你連接一個MySQL服務器時,你的身份由你從那連接的主機和你指定的用戶名來決定,系統按照你的身份和你想做什么來授予權限。MySQL 存取操縱包含 2 個時期:時期 1:服務器檢查你是否承諾連接。時
23、期 2:假定你能連接,服務器檢查你發出的每個要求。看你是否有 足夠的權限實施它。例如,如果你從數據庫中一個表精選 (select行或從數 據庫拋棄一個表,服務器確定你對表有 select權限或對數據庫有drop權 限。服務器在存取操縱的兩個時期使用在 mysql的數據庫中的user、db和 host 表對存取操縱的第二時期 (要求證實 ),如果要求涉及表,服務器能夠另 夕卜參考 tables_priv禾口 columns_priv 表。簡單地講,服務器使用如此的授權表:user表范疇字段決定是否承諾或拒絕到來的連接。關于承諾的連接, 權限字段指出用戶的全局 (超級用戶 )權限。db和host表
24、一起使用:db 表范疇字段決定用戶能從哪個主機存取哪個數據庫。權限字段決 定承諾哪個操作。當你想要一個給定的db條目應用于若干主機時,host表作為db表的 擴展被使用。例如,如果你想要一個用戶能在你的網絡從若干主機使用一 個數據庫,在用戶的db表的Host條目設為空值,然后將那些主機的每一 個移入host表。那個機制詳細描述在7.143存取操縱,時期2:要求證 實。tables_priv和columns_priv表類似于db表,然而更精巧:他們在表 和列級應用而非在數據庫級。注意治理權限(reload, shutdown,等等)僅在user表中被指定。這是因 為治理性操作是服務器本身的操作同
25、時不是特定數據庫,因此沒有理由在 其他授權表中列出如此的權限。事實上,只需要請教user表來決定你是否執行一個治理操作。file權限也僅在user表中指定。它不是治理性權限,但你讀或謝在服 務器主機上的文件的的能力獨立于你正在存取的數據庫。當 mysqld 服務器啟動時,讀取一次授權表內容。對授權表的更換生 效在 7.5 權限修改何時生效。一個有用的診斷工具是 mysqlaccess腳卩本,由Carlier Yves提供給My SQL分發。使用-help選項調用mysqlaccess查明它如何樣工作。注意:m ysqlaccess僅用user、db和host表僅檢查存取。它不檢查表或列級權限。
26、存取操縱, 時期 1:連接證實當你試圖聯接一個 MySQL 服務器時,服務器基于你的身份和你是否 能通過供應正確的口令驗證身份來同意或拒絕連接。如果不是,服務器完 全具結你的存取,否則,服務器同意連接,然后進入時期 2 同時等待要 求。你的身份基于 2 個信息: 你從那個主機連接 你的 MySQL 用戶名身份檢查使用3個user表(Host, User和Password范疇字段執行。服 務器只有在一個user表條目匹配你的主機名和用戶名同時你提供了正確 的口令時才同意連接。在user表范疇字段能夠如下被指定:一個Host值能夠是主機名或一個IP數字,或'localhost指出本地主 機
27、。你能夠在Host字段里使用通配符字符“ ”和“_”。一個Host值'%'匹配任何主機名,一個空白Host值等價于'%'。注意 這些值匹配能創建一個連接到你的服務器的任何主機!通配符字符在User字段中不承諾,然而你能指定空白的值,它匹配 任何名字。如果user表匹配到來的連接的條目有一個空白的用戶名,用 戶被認為是匿名用戶 (沒有名字的用戶 ),而非客戶實際指定的名字。這意味著一個空白的用戶名被用于在連接期間的進一步的存取檢查(即,在時期2期間)。Password字段能夠是空白的。這不意味著匹配任何口令,它意味著用 戶必須不指定一個口令進行連接。非空白Pass
28、word值代表加密的口令。MySQL不以任何人能夠看的純文本格式儲備口令,相反,正在試圖聯接的一個用戶提供的口令被加密 (使用PASSWORD。函數),同時與儲備了 user表中的差不多加密的版本比 較。如果他們匹配,口令是正確的。下面的例子顯示出各種user表中Host和User條目的值的組合如何應 用于到來的連接:表7-6 Host和User條目的值的組合Host 值User 值被條目匹配的連接'Gwen'II'%''Gwen'Gwen,從任何主機連接'%'II任何用戶,從任何主機連接'%.'
29、39;Gwen'Gwen,從在域的任何主機連接'x.y.%''Gwen''77''Gwen'Gwen,從有 77 IP 地址的主機連接'144.155.166.%''Gwen'Gwen,從144.155.166 C類子網的任何主機連接MySQL服務器按一種特定方式排序符授權表中的記錄,然后通過按 序掃瞄記錄匹配到來的連接。找到的第一個匹配決定了被使用的記錄。明 白得MySQL使用的排序順序專門重要,專門是對user表。當服務器
30、讀取user表內容時,它按照在Host和User列中的值排序記 錄,Host值起決定作用(相同的Host值排在一起,然后再按照User值排 序)。然而,排序不是典序(按詞排序),它只是部分是。要牢記的是字 面上的詞優先于模式。這意味著如果你正從 clie nt.your. net連接服務器而 Host有和%兩個值,則第一個先選。類似地,%.yo優先于.net,然后是。IP地址的匹配也是如此的。總之一句話,越具體越優先user表排序工作如下,假定user表看起來像如此:+-+-| Host| User| .+-+-| %| root| .| %| jerry| .| localhost | ro
31、ot | .| localhost | .+-當服務器在表中讀取時,它以最特定的 Host 值為先的次序排列 ('%'在 Host 列里意味著“任何主機”同時是最不特定的 )。有相同 Host 值的條目 以最特定的User值為先的次序排列(一個空白User值意味著“任何用戶” 同時是最不特定的)。最終排序的user表看起來像如此:+-| Host | User | .+-| localhost | root | .| localhost | .| %| jerry | .| %| root | .+-當一個連接被嘗試時,服務器掃瞄排序的條目并使用找到的第一個匹 配。關于由jef
32、frey從localhost的一個連接,在 Host列的'localhost條目第一匹配。那些有空白用戶名的條目匹配連接的主機名和用戶名。( '%'/'jeff rey'條目也將匹配,然而它不是在表中的第一匹配。)這是另外一個例子。假定user表看起來像如此:+-| Host| User | .+-| % | jerry | .+-排序后的表看起來像如此:+-| Host | User | .+-| % | jerry | .+-如果你有服務器連接的咨詢題,打印出 user 表同時手工排序它看看 第一個匹配在哪兒進行。 存取操縱,時期 2:
33、要求證實 一旦你建立了一個連接,服務器進入時期 2。對在此連接上進來的每 個要求,服務器檢查你是否有足夠的權限來執行它,它基于你期望執行的 操作類型。這正是在授權表中的權限字段發揮作用的地點。這些權限能夠 來子 use、db、host、tables_priv或 columns_priv 表的任何一個。授權表 用 GRANT 和 REVOKE 命令操作。(你能夠發覺參考第七章 權限系統如 何樣工作專門有關心,它列出了在每個權限表中出現的字段。)user表在一個全局基礎上授予給予你的權限,該權限不管當前的數據 庫是什么均適用。例如,如果user表授予你delete權限,你能夠刪除在 服務器主機上從
34、任何數據庫刪除行!換句話講,user表權限是超級用戶權 限。只把user表的權限授予超級用戶如服務器或數據庫主管是明智的。 對其他用戶,你應該把在user表中的權限設成N'同時僅在一個特定數據 庫的基礎上授權, 使用db和host表。db和host表授予數據庫特定的權限。在范疇字段的值能夠如下被指定:通配符字符“ ”和“ ”可被用于兩個表的Host和Db字段在db表的''Host值意味著“任何主機”,在db表中一個空白Host 值意味著“對進一步的信息咨詢host表”。在host表的一個''或空白Host值意味著“任何主機”。在兩個表中的一個'或
35、空白Db值意味著“任何數據庫”。在兩個表中的一個空白User值匹配匿名用戶。db和host表在服務器啟動時被讀取和排序(同時它讀user表)。db表 在Host、Db和User范疇字段上排序,同時host表在Host和Db范疇字 段上排序。關于user表,排序第一放置最特定的值然后最后最不特定的 值,同時當服務器查找匹配入條目時,它使用它找到的第一個匹配。tables_priv和columns_priv表授予表和列特定的權限。在范疇字段的 值能夠如下被指定:通配符“ %”和“_”可用在使用在兩個表的Host字段。在兩個表中的一個'或空白Host意味著“任何主機”。在兩個表中的Db、Ta
36、ble_name和Column_name字段不能包含通配符 或空白。tables_priv和 columns_priv 表在 Host、Db 和 User字段上被排序。這 類似于db表的排序,盡管因為只有Host字段能夠包含通配符,但排序更 簡單。要求證實進程在下面描述。(如果你熟悉存取檢查的源代碼,你會注 意到那個地點的描述與在代碼使用的算法略有不同。描述等價于代碼實際 做的東西;它只是不同于使講明更簡單。)對治理要求(shutdown reload等等),服務器僅檢查user表條目,因 為那是唯獨指定治理權限的表。如果條目許可要求的操作,存取被授權 了,否則拒絕。例如,如果你想要執行 my
37、sqladmin shutdown,然而你的 user表條目沒有為你授予shutdown權限,存取甚至不用檢查db或host表 就被拒絕。(因為他們不包含 Shutdown_priv行列,沒有如此做的必 要。)對數據庫有關的要求(insert、update等等),服務器第一通過查找user 表條目來檢查用戶的全局 (超級用戶)權限。如果條目承諾要求的操作,存取被授權。如果在user表中全局權限不夠,服務器通過檢查 db和host表 確定特定的用戶數據庫權限:服務器在db表的Host、Db和User字段上查找一個匹配。Host和User對應連接用戶的主機名和 MySQL用戶名。Db字段對應用戶想
38、要存取 的數據庫。如果沒有Host和User的條目,存取被拒絕。如果db表中的條目有一個匹配而且它的 Host字段不是空白的,該條 目定義用戶的數據庫特定的權限。如果匹配的db表的條目的Host字段是空白的,它表示host表列舉主 機應該被承諾存取數據庫的主機。在這種情形下,在host表中作進一步查找以發覺Host和Db字段上的匹配。如果沒有host表條目匹配,存取 被拒絕。如果有匹配,用戶數據庫特定的權限以在db和host表的條目的權限,即在兩個條目差不多上Y'的權限的交集(而不是并集!)運算。(如 此你能夠授予在db表條目中的一樣權限,然后用host表條目按一個主機 一個主機為基礎
39、地有選擇地限制它們。)在確定了由db和host表條目授予的數據庫特定的權限后,服務器把 他們加到由user表授予的全局權限中。如果結果承諾要求的操作,存取 被授權。否則,服務器檢查在tables_priv和columns_priv表中的用戶的表 和列權限并把它們加到用戶權限中。基于此結果承諾或拒絕存取。用布爾術語表示,前面關于一個用戶權限如何運算的描述能夠如此總 結:global privilegesOR (databaseprivileges AND host privileges)OR table privilegesOR column privileges它可能不明顯,什么緣故呢,如果全
40、局 user條目的權限最初發覺對 要求的操作不夠,服務器以后把這些權限加到數據庫、表和列的特定權 限。緣故是一個要求可能要求超過一種類型的權限。例如,如果你執行一 個INSERT . SELECT語句,你就都要insert和select權限。你的權限必 須如此以便user表條目授予一個權限而db表條目授予另一個。在這種情 形下,你有必要的權限執行要求,然而服務器不能自己把兩個表區不開 來;兩個條目授予的權限必須組合起來。host表能被用來愛護一個“安全”服務器列表。在 TcX, host表包含 一個在本地的網絡上所有的機器的表,這些被授予所有的權限。你也能夠使用host表指定不安全的主機。假定
41、你有一臺機器 public.y our.domain,它位于你不認為是安全的一個公共區域,你能夠用下列的 ho st表條目子承諾除了那臺機器外的網絡上所有主機的存取:+ +-| Host| Db | .+ +-| | % | . (所有權限設為 'N')| %.your.domain | % | . (所有權限設為 'Y')+-因此,你應該總是測試你在授權表中的條目 (例如,使用 mysqlaccess) 讓你確保你的存取權限實際上以你認為的方式被設置。總結本節詳細敘述了 MySQL 權限系統的原理,包括 MySQL 存取證實的 完整過程。 MySQL 通過授權
42、表實現了一個不同于 SQL92 標準的權限系 統,本節所述的授權表的結構和內容關于本章以后的明白得十分重要,因 為涉及到直截了當修改授權表的知識。盡管你能夠使用 GRANT 和 REVO KE 語句完成大部分的授權,然而只有了解授權表的結構和內容,你才能 更好的操縱系統,使你的系統更為安全。在專門多時候,直截了當修改授 權表是唯獨的手段。另外一個重要的知識是授權表中的user和host字段。了解MySQL 服務器用戶匹配的順序以及身份驗證的過程,有利于你配置一個安全的系 統。7.2 設置用戶與并授權你能夠有 2個不同的方法增加用戶:通過使用 GRANT 語句或通過直 截了當操作 MySQL 授
43、權表。比較好的方法是使用 GRANT 語句,因為他 們是更簡明同時看起來錯誤少些。使用 SHOW GRANTS 語句顯示用戶的授權 你能夠直截了當查看授權表,也能夠使用 SHOW GRANTS 語句查看 某個用戶的授權,這種情形下使用 SHOW GRANTS 語句明顯要方便一 些。語法: SHOW GRANTS FOR user_name 為了容納對任意主機的用戶授予的權益, MySQL 支持以 userhost 格式指定 user_name值。例如,下面的語句顯示一個用戶 admin 的權限: mysql>SHOW GRANTS FOR adminlocalhost; 其結果為創建該用
44、戶的 GRNAT 授權語句:GRANT RELOAD, SHUTDOWN, PROCESS ON *.* TO 'admin''l ocalhost' IDENTIFIED BY PASSWORD '28e89ebc62d6e19a'密碼是加密后的形式。下小節會介紹如何使用 GRANT 語句授權。7.2.2 使用 grant 語句創建用戶并授權 GRANT 語句的語法GRANT priv_type (columns)ON whatTO user IDENTIFIED BY “password”WITH GRANT OPTION 要使
45、用該語句,需要填寫以下部分: priv_type 分配給用戶的權限。priv_type 能夠指定下列的任何一個:ALL PRIVILEGESFILERELOADALTERINDEXSELECTCREATE INSERT SHUTDOWN DELETEPROCESSUPDATEDROPREFERENCESUSAGEALL 是 ALL PRIVILEGES 的一個同義詞, REFERENCES 還沒被實 現,USAGE當前是“沒有權限”的一個同義詞。它能用在你想要創建一 個沒有權限用戶的時候。關于表,你能指定的唯獨 priv_type 值是 SELECT、INSERT、UPDAT E、DELETE
46、、CREATE、DROP、GRANT、INDEX 和 ALTER。關于列,你能指定的唯獨 priv_type 值是(即,當你使用一個 column_li st 子句時)是 SELECT、INSERT禾口 UPDATE。columns 權限適用的列。 這是可選的,只來設置列專有的權限。如果命名多于一個列,則用逗 號分開。what 權限應用的級不GRANT 承諾系統主管在 4個權限級不上授權 MySQL 用戶的權益: 全局級不 全局權限作用于一個給定服務器上的所有數據庫。這些權限儲備在 m ysql.user表中。你能通過使用ON *語法設置全局權限數據庫級不 數據庫權限作用于一個給定數據庫的所有
47、表。這些權限儲備在 mysql.db和mysql.host表中。你能通過使用ON db_name.語法設置數據庫權 限。如果你指定 ON *同時你有一個當前數據庫,你將為該數據庫設置權 限。 (警告:如果你指定 ON *而你沒有一個當前數據庫,你將阻礙全局權 限!)表級不表權限作用于一個給定表的所有列。這些權限儲備在 mysql.tables_pri v表中。你能透過 ON tbl_name,為具體的表名設置權限。列級不列權限作用于在一個給定表的單個列。這些權限儲備在 mysql.column s_priv 表中。你能夠通過指定一個 columns 子句將權限授予特定的列,同 時要在 ON 子
48、句中指定具體的表。對與一個表或列的權限是由 4 個權限級不的邏輯或形成的。例如,如 果mysql.user表指定一個用戶有一個全局select權限,它不能被數據庫、 表或列的一個條目否認。關于一個列的權限能如下運算:global privilegesOR (databaseprivileges AND host privileges)OR table privilegesOR column privileges在大多數情形下,你只授予用戶一個權限級不上的權限,因此現實通 常不象上面所講的那樣復雜。user 使用權限的用戶。為了容納對任意主機的用戶授予的權益, MySQL 支持以 userhos
49、t 格式指定user_namef直。如果你想要指定一個專門字符的一個 user字符串 (例如“-”),或一個包含專門字符或通配符的host字符串(例如“ ”), 你能夠用括號括起能用戶或主機名字 (例如, 'test-user''test-hostname。')你能在主機名中指定通配符。例如,user"%."適用于在loc.g ov域中任何主機的user,同時適用于在6 類 C 子網中任何主機的 user。簡單形式的user是user"%'的一個同義詞。注意:如果你承諾匿名 用戶連接 MySQL 服務器 (它是
50、缺省的 ),你也應該增加所有本地用戶如 use rlocalhost,因為否則,當用戶試圖從本地機器上登錄到MySQL服務器時,關于mysql.user表中的本地主機的匿名用戶條目將被使用!匿名用戶 通過插入有User二”的條目到mysql.user表中來定義。通過執行那個查詢, 你能夠檢驗它是否作用于你:mysql> SELECT Host,User FROM mysql.user WHERE User=''password 分配給該用戶的口令。這也是可選的。在 MySQL 或以后,如果創建一個新用戶或如果你有全局授 予權限,用戶的口令將被設置為由 IDENTIFIED
51、 BY 子句指定的口令,如 果給出一個。如果用戶差不多有了一個口令,它被一個新的代替。警告:如果你制造一個新用戶然而不指定一個 IDENTIFIED BY 子 句,用戶沒有口令。這是不安全的。WITH GRANT OPTION 子句是可選的。WITH GRANT OPTION 子句給與用戶有授予其他用戶在指定的權限 水平上的任何權限的能力。你應該慎重對待你授予他grant 權限的用戶,因為具有不同權限的兩個用戶也許能合并權限!創建用戶并授權的實例 創建一個具有超級用戶權益的用戶: mysql>GRANT ALL ON *.* TO anynamelocalhostIDENTIFIED B
52、Y "passwd"->WITH GRANT OPTION該語句將在user表中為anynamelocalhos創建一個記錄,打開所有 權限。數據庫級權限用一個ON db_name.*子句而不是ON *.*進行授權:mysql>GRANT ALL ON sample.* TO borislocalhost IDENTIFIED BY "ruby"這些權限不是全局的,因此它們不儲備在 user表中,我們仍舊需要 在user表中創建一條記錄(使得用戶能連接),但我們也需要創建一個db 表記錄記錄數據庫集的權限。7.2.3 直截了當修改授權表創建用
53、戶并授權如果你還記得前面的介紹,你應該能即使不用 GRANT 語句也能做 G RANT 做的情況。記住在你直截了當修改授權表時,你將通知服務重視載 授權表,否則他不明白你的改變。你能夠執行一個 mysqladmin flush-privi leges或 mysqladmin reload命令和 FLUSH PRIVILEGES 語句強迫一個重 載。如果你不記得做那個,你會疑咨詢什么緣故服務器不做你想做的情 況。下列 GRANT 語句創建一個擁有所有權的超級用戶。包括授權給不人 的能力:GRANT ALL ON *.* TO anynamelocalhostIDENTIFIED BY "
54、;pa sswd"WITH GRANT OPTION該語句將在user表中為anynamelocalhos創建一個記錄,打開所有權限,因為那個地點是超級用戶(全局)權限儲備的地點,要用 INSERT 語句做同樣的情況,語句是:INSERT INTO user VALUES("localhost","anyname",PASSWORD("pa sswd"),"Y","Y","Y","Y","Y","Y",&q
55、uot;Y","Y","Y","Y","Y","Y","Y","Y")你可能發覺它不工作,這要看你的 MySQL 版本。授權表的結構差不 多改變而且你在你的user表可能沒有14個權限列。用SHOW COLUMNS找出你的授權表包含的每個權限列,相應地調整你的 INSERT語句。 下列 GRANT 語句也創建一個擁有超級用戶身份的用戶,然而只有一個單 個的權限:GRANT RELOAD ON *.* TO flushlocalhost IDENT
56、IFIED BY "fl ushpass"本例的INSERT語句比前一個簡單,它專門容易列出列名并只指定一 個權限列。所有其它列將設置為缺省的 "N" :INSERT INTO user (Host,Password,Reload)VALUES("localhost","flus h",PASSWORD("flushpass"),"Y")數據庫級權限用一個ON db_name.*子句而不是ON *.*進行授權:GRANT ALL ON sample.* TO borisloc
57、alhost IDENTIFIED BY "r uby"這些權限不是全局的,因此它們不儲備在 user 表中,我們仍舊需要 在 user 表中創建一條記錄(使得用戶能連接),但我們也需要創建一個db 表記錄記錄數據庫集權限:mysql> INSERT INTO user (Host,User,Password)-> VALUES("localhost","boris",PASSWORD("ruby") ;mysql> INSERT INTO db VALUES-> ("localh
58、ost","sample_db","boris","Y","Y","Y","Y","Y","Y","N","Y"," Y","Y");"N"列是為GRANT權限;對末尾的一個數據庫級具有 WITH GRAN T OPTION 的 GRANT 語句,你要設置該列為 "Y" 。要設置表級或列級權限,你對table
59、s_priv或columns_priv使用INSER T 語句。因此,如果你沒有 GRANT 語句,你將沒有這些表,因為它們在 MySQL 中同時顯現。如果你確實有這些表同時為了某些緣故想要手工操 作它們,要明白你不能用單獨的列啟用權限。你設置 tables_priv.Table_priv或 columns_priv.Column_priv歹U來設置包 含你想啟用的權限值。例如,要對一個表啟用SELECT和INSERT權限,你要在有關的tables_priv的記錄中設置Table_priv為"Selectnsert"。7.2.4 總結本屆介紹了如何建立用戶,如何為用戶分配權限。 GRANT 語句盡管 能夠為用戶分配權限,使用比較方便,然而從安全角度,從增加對系統了 解角度,你應該盡量使用直截了當修
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國3D打印軟件項目創業計劃書
- 樂理三級考試題及答案
- 生產安全事故應急處置預案管理實施計劃方案
- 供應鏈金融倉單質押擔保合同模板
- 財務會計人員保密與競業限制合同
- 跨界合作代駕泊車服務合同范例
- 茶山茶園觀光旅游項目租賃合同
- 2025沈陽市住宅用房屋租賃合同范本
- 2025化工原料類購銷合同
- 2025汽車貸款抵押的合同
- 2025年計算機Photoshop操作實務的試題及答案
- 2024-2030全球WiFi 6移動熱點行業調研及趨勢分析報告
- 2025年廣東省廣州市越秀區中考物理一模試卷(含答案)
- 中醫針灸治療腦梗塞后遺癥的應用實踐
- 2025年高等數學期末考試試題及答案
- 2024中國國新基金管理有限公司相關崗位招聘7人筆試參考題庫附帶答案詳解
- 光伏組件清洗合同
- 作風建設學習教育心得體會:在深入學習中校準思想坐標持續轉變工作作風(3篇)
- 人體解剖學題庫(含答案)
- 2025年浙江省新能源投資集團股份有限公司招聘筆試參考題庫附帶答案詳解
- 傳統加油站行業痛點分析與數字化解決方案
評論
0/150
提交評論