MySQL安全性指南 (1)(轉(zhuǎn))
更新時(shí)間:2007年03月06日 00:00:00 作者:
正在看的ORACLE教程是:MySQL安全性指南 (1)(轉(zhuǎn))。 MySQL安全性指南
作 者: 晏子
作為一個(gè)MySQL的系統(tǒng)管理員,你有責(zé)任維護(hù)你的MySQL數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)安全性和完整性。本文主要主要介紹如何建立一個(gè)安全的MySQL系統(tǒng),從系統(tǒng)內(nèi)部和外部網(wǎng)絡(luò)兩個(gè)角度,為你提供一個(gè)指南。
本文主要考慮下列安全性有關(guān)的問(wèn)題:
為什么安全性很重要,你應(yīng)該防范那些攻擊?
服務(wù)器面臨的風(fēng)險(xiǎn)(內(nèi)部安全性),如何處理?
連接服務(wù)器的客戶(hù)端風(fēng)險(xiǎn)(外部安全性),如何處理?
MySQL管理員有責(zé)任保證數(shù)據(jù)庫(kù)內(nèi)容的安全性,使得這些數(shù)據(jù)記錄只能被那些正確授權(quán)的用戶(hù)訪(fǎng)問(wèn),這涉及到數(shù)據(jù)庫(kù)系統(tǒng)的內(nèi)部安全性和外部安全性。
內(nèi)部安全性關(guān)心的是文件系統(tǒng)級(jí)的問(wèn)題,即,防止MySQL數(shù)據(jù)目錄(DATADIR)被在服務(wù)器主機(jī)有賬號(hào)的人(合法或竊取的)進(jìn)行攻擊。如果數(shù)據(jù)目錄內(nèi)容的權(quán)限過(guò)分授予,使得每個(gè)人均能簡(jiǎn)單地替代對(duì)應(yīng)于那些數(shù)據(jù)庫(kù)表的文件,那么確??刂瓶蛻?hù)通過(guò)網(wǎng)絡(luò)訪(fǎng)問(wèn)的授權(quán)表設(shè)置正確,對(duì)此毫無(wú)意義。
外部安全性關(guān)心的是從外部通過(guò)網(wǎng)絡(luò)連接服務(wù)器的客戶(hù)的問(wèn)題,即,保護(hù)MySQL服務(wù)器免受來(lái)自通過(guò)網(wǎng)絡(luò)對(duì)服務(wù)器的連接的攻擊。你必須設(shè)置MySQL授權(quán)表(grant table),使得他們不允許訪(fǎng)問(wèn)服務(wù)器管理的數(shù)據(jù)庫(kù)內(nèi)容,除非提供有效的用戶(hù)名和口令。
下面就詳細(xì)介紹如何設(shè)置文件系統(tǒng)和授權(quán)表mysql,實(shí)現(xiàn)MySQL的兩級(jí)安全性。
一、內(nèi)部安全性-保證數(shù)據(jù)目錄訪(fǎng)問(wèn)的安全
MySQL服務(wù)器通過(guò)在MySQL數(shù)據(jù)庫(kù)中的授權(quán)表提供了一個(gè)靈活的權(quán)限系統(tǒng)。你可以設(shè)置這些表的內(nèi)容,允許或拒絕客戶(hù)對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn),這提供了你防止未授權(quán)的網(wǎng)絡(luò)訪(fǎng)問(wèn)對(duì)你數(shù)據(jù)庫(kù)攻擊的安全手段,然而如果主機(jī)上其他用戶(hù)能直接訪(fǎng)問(wèn)數(shù)據(jù)目錄內(nèi)容,建立對(duì)通過(guò)網(wǎng)絡(luò)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的良好安全性對(duì)你毫無(wú)幫助,除非你知道你是登錄MySQL服務(wù)器運(yùn)行主機(jī)的唯一用戶(hù),否則你需要關(guān)心在這臺(tái)機(jī)器上的其他用戶(hù)獲得對(duì)數(shù)據(jù)目錄的訪(fǎng)問(wèn)的可能性。
以下是你應(yīng)該保護(hù)的內(nèi)容:
數(shù)據(jù)庫(kù)文件。很明顯,你要維護(hù)服務(wù)器管理的數(shù)據(jù)庫(kù)的私用性。數(shù)據(jù)庫(kù)擁有者通常并且應(yīng)該考慮數(shù)據(jù)庫(kù)內(nèi)容的安全性,即使他們不想,也應(yīng)該考慮時(shí)數(shù)據(jù)庫(kù)內(nèi)容公開(kāi)化,而不是通過(guò)糟糕的數(shù)據(jù)目錄的安全性來(lái)暴露這些內(nèi)容。
日志文件。一般和更新日志必須保證安全,因?yàn)樗麄儼樵?xún)文本。對(duì)日志文件有訪(fǎng)問(wèn)權(quán)限的任何人可以監(jiān)視數(shù)據(jù)庫(kù)進(jìn)行過(guò)的操作。
更要重點(diǎn)考慮的日志文件安全性是諸如GRANT和SET PASSWORD等的查詢(xún)也被記載了,一般和更新日志包含有敏感查詢(xún)的文本,包括口令(MySQL使用口令加密,但它在已經(jīng)完成設(shè)置后才運(yùn)用于以后的連接建立。設(shè)置一個(gè)口令的過(guò)程設(shè)計(jì)象GRANT或SET PASSWORD等查詢(xún),并且這些查詢(xún)以普通文本形式記載在日志文件中)。如果一個(gè)攻擊者猶如日文件的讀權(quán)限,只需在日志文件上運(yùn)行g(shù)rep尋找諸如GRANT和PASSWORD等詞來(lái)發(fā)現(xiàn)敏感信息。
顯然,你不想讓服務(wù)器主機(jī)上的其他用戶(hù)有數(shù)據(jù)庫(kù)目錄文件的寫(xiě)權(quán)限,因?yàn)樗麄兛梢灾貙?xiě)你的狀態(tài)文件或數(shù)據(jù)庫(kù)表文件,但是讀權(quán)限也很危險(xiǎn)。如果一個(gè)數(shù)據(jù)庫(kù)表文件能被讀取,偷取文件并得到MySQL本身,以普通文本顯示表的內(nèi)容也很麻煩,為什么?因?yàn)槟阋鱿铝惺虑椋?br>
在服務(wù)器主機(jī)上安裝你自己“特制”的MySQL服務(wù)器,但是有一個(gè)不同于官方服務(wù)器版本的端口、套接字和數(shù)據(jù)目錄。
運(yùn)行mysql_install_db初始化你的數(shù)據(jù)目錄,這賦予你作為MySQL root用戶(hù)訪(fǎng)問(wèn)你的服務(wù)器的權(quán)限,所以你有對(duì)服務(wù)器訪(fǎng)問(wèn)機(jī)制的完全控制,它也建立一個(gè)test數(shù)據(jù)庫(kù)。
將對(duì)應(yīng)于你想偷取得表文件拷貝到你服務(wù)器的數(shù)據(jù)庫(kù)目錄下的test目錄。
啟動(dòng)你的服務(wù)器。你可以隨意訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)表,SHOW TABLES FROM test顯示你有一個(gè)偷來(lái)的表的拷貝,SELECT *顯示它們?nèi)魏我粋€(gè)的全部?jī)?nèi)容。
如果你確實(shí)很惡毒,將權(quán)限公開(kāi)給你服務(wù)器的任何匿名用戶(hù),這樣任何人能從任何地方連接服務(wù)器訪(fǎng)問(wèn)你的test數(shù)據(jù)庫(kù)。你現(xiàn)在將偷來(lái)的數(shù)據(jù)庫(kù)表公布于眾了。
在考慮一下,從相反的角度,你想讓別人對(duì)你這樣嗎?當(dāng)然不!你可以通過(guò)在數(shù)據(jù)庫(kù)錄下執(zhí)行l(wèi)s -l命令確定你的數(shù)據(jù)庫(kù)是否包含不安全的文件和目錄。查找有“組”和“其他用戶(hù)”權(quán)限設(shè)置的文件和目錄。下面是一個(gè)不安全數(shù)據(jù)目錄的一部分列出:
% ls -l
total 10148
drwxrwxr-x 11 mysqladm wheel 1024 May 8 12:20 .
drwxr-xr-x 22 root wheel 512 May 8 13:31 ..
drwx------ 2 mysqladm mysqlgrp 512 Apr 16 15:57 menagerie
drwxrwxr-x 2 mysqladm wheel 512 Jan 25 20:40 mysql
drwxrwxr-x 7 mysqladm wheel 512 Aug 31 1998 sql-bench
drwxrwxr-x 2 mysqladm wheel 1536 May 6 06:11 test
drwx------ 2 mysqladm mysqlgrp 1024 May 8 18:43 tmp
....
正如你看到的,有些數(shù)據(jù)庫(kù)有正確的權(quán)限,而其他不是。本例的情形是經(jīng)過(guò)一段時(shí)間后的結(jié)果。較少限制的權(quán)限由在權(quán)限設(shè)置方面比更新版本更不嚴(yán)格的較早版本服務(wù)器設(shè)置的(注意更具限制的目錄menageria和tmp都有較近日期)。MySQL當(dāng)前版本確保這些文件只能由運(yùn)行服務(wù)器的用戶(hù)讀取。
讓我們來(lái)修正這些權(quán)限,使得只用服務(wù)器用戶(hù)可訪(fǎng)問(wèn)它們。你的主要保護(hù)工具來(lái)自于由UNIX文件系統(tǒng)本身提供的設(shè)置文件和目錄屬主和模式的工具。下面是我們要做的:
進(jìn)入該目錄
% cd DATADIR
設(shè)置所有在數(shù)據(jù)目錄下的文件屬主為由用于運(yùn)行服務(wù)器的賬號(hào)擁有(你必須以root執(zhí)行這步)。在本文使用mysqladm和mysqlgrp作為該賬號(hào)的用戶(hù)名和組名。你可以使用下列命令之一改變屬主:
# chown mysqladm.mysqlgrp .
# find . -follow -type d -print | xargs chown mysqladm.mysqlgrp
設(shè)置你的數(shù)據(jù)目錄和數(shù)據(jù)庫(kù)目錄的模式使得他們只能由mysqladm讀取,這阻止其他用戶(hù)訪(fǎng)問(wèn)你數(shù)據(jù)庫(kù)目錄的內(nèi)容。你可以用下列命令之一以root或mysqladm身份運(yùn)行。
% chmod -R go-rwx .
% find . -follow -type d -print | xargs chmod go-rwx
數(shù)據(jù)目錄內(nèi)容的屬主和模式為mysqladm設(shè)置。現(xiàn)在你應(yīng)該保證你總是以mysqladm用戶(hù)運(yùn)行服務(wù)器,因?yàn)楝F(xiàn)在這是唯一由訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)目錄權(quán)限的用戶(hù)(除root)。
在完成這些設(shè)置后,你最終應(yīng)該得到下面的數(shù)據(jù)目錄權(quán)限:
% ls -l
total 10148
drwxrwx--- 11 mysqladm mysqlgrp 1024 May 8 12:20 .
drwxr-xr-x 22 root wheel 512 May 8 13:31 ..
drwx------ 2 mysqladm mysqlgrp 512 Apr 16 15:57 menagerie
drwx------ 2 mysqladm正在看的ORACLE教程是:MySQL安全性指南 (1)(轉(zhuǎn))。 mysqlgrp 512 Jan 25 20:40 mysql
drwx------ 7 mysqladm mysqlgrp 512 Aug 31 1998 sql-bench
drwx------ 2 mysqladm mysqlgrp 1536 May 6 06:11 test
drwx------ 2 mysqladm mysqlgrp 1024 May 8 18:43 tmp
....
二、外部安全性-保證網(wǎng)絡(luò)訪(fǎng)問(wèn)的安全
MySQL的安全系統(tǒng)是很靈活的,它允許你以多種不同方式設(shè)置用戶(hù)權(quán)限。一般地,你可使用標(biāo)準(zhǔn)的SQL語(yǔ)句GRANT和REVOKE語(yǔ)句做,他們?yōu)槟阈薷目刂瓶蛻?hù)訪(fǎng)問(wèn)的授權(quán)表,然而,你可能由一個(gè)不支持這些語(yǔ)句的老版本的MySQL(在3.22.11之前這些語(yǔ)句不起作用),或者你發(fā)覺(jué)用戶(hù)權(quán)限看起來(lái)不是以你想要的方式工作。對(duì)于這種情況,了解MySQL授權(quán)表的結(jié)構(gòu)和服務(wù)器如何利用它們決定訪(fǎng)問(wèn)權(quán)限是有幫助的,這樣的了解允許你通過(guò)直接修改授權(quán)表增加、刪除或修改用戶(hù)權(quán)限,它也允許你在檢查這些表時(shí)診斷權(quán)限問(wèn)題。
關(guān)于如何管理用戶(hù)賬號(hào),見(jiàn)《MySQL的用戶(hù)管理》。而對(duì)GRANT和REVOKE語(yǔ)句詳細(xì)描述,見(jiàn)《MySQL參考手冊(cè)》。
2.1 MySQL授權(quán)表的結(jié)構(gòu)和內(nèi)容
通過(guò)網(wǎng)絡(luò)連接服務(wù)器的客戶(hù)對(duì)MySQL數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)由授權(quán)表內(nèi)容來(lái)控制。這些表位于mysql數(shù)據(jù)庫(kù)中,并在第一次安裝MySQL的過(guò)程中初始化(運(yùn)行mysql_install_db腳本)。授權(quán)表共有5個(gè)表:user、db、host、tables_priv和columns_priv。
表1 user、db和host授權(quán)表結(jié)構(gòu)
訪(fǎng)問(wèn)范圍列
user db host
Host Host Host
User Db Db
Password User
數(shù)據(jù)庫(kù)/表權(quán)限列
Alter_priv Alter_priv Alter_priv
Create_priv Create_priv Create_priv
Delete_priv Delete_priv Delete_priv
Drop_priv Drop_priv Drop_priv
Index_priv Index_priv Index_priv
Insert_priv Insert_priv Insert_priv
References_priv References_priv References_priv
Select_priv Select_priv Select_priv
Update_priv Update_priv Update_priv
File_priv Grant_priv Grant_priv
Grant_priv
Process_priv
Reload_priv
Shutdown_priv
表2 tables_priv和columns_priv屬權(quán)表結(jié)構(gòu)
訪(fǎng)問(wèn)范圍列
tables_priv columns_priv
Host Host
Db Db
User User
Table_name Table_name
Column_name
權(quán)限列
Table_priv Column_priv
授權(quán)表的內(nèi)容有如下用途:
user表
user表列出可以連接服務(wù)器的用戶(hù)及其口令,并且它指定他們有哪種全局(超級(jí)用戶(hù))權(quán)限。在user表啟用的任何權(quán)限均是全局權(quán)限,并適用于所有數(shù)據(jù)庫(kù)。例如,如果你啟用了DELETE權(quán)限,在這里列出的用戶(hù)可以從任何表中刪除記錄,所以在你這樣做之前要認(rèn)真考慮。
db表
db表列出數(shù)據(jù)庫(kù),而用戶(hù)有權(quán)限訪(fǎng)問(wèn)它們。在這里指定的權(quán)限適用于一個(gè)數(shù)據(jù)庫(kù)中的所有表。
host表
host表與db表結(jié)合使用在一個(gè)較好層次上控制特定主機(jī)對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)權(quán)限,這可能比單獨(dú)使用db好些。這個(gè)表不受GRANT和REVOKE語(yǔ)句的影響,所以,你可能發(fā)覺(jué)你根本不是用它。
tables_priv表
tables_priv表指定表級(jí)權(quán)限,在這里指定的一個(gè)權(quán)限適用于一個(gè)表的所有列。
columns_priv表
columns_priv表指定列級(jí)權(quán)限。這里指定的權(quán)限適用于一個(gè)表的特定列。
在“不用GRANT設(shè)置用戶(hù)”一節(jié)里,我們?cè)儆懻揋RANT語(yǔ)句如何對(duì)修改這些表起作用,和你怎樣能通過(guò)直接修改授權(quán)表達(dá)到同樣的效果。
tables_priv和columns_priv表在MySQL 3.22.11版引進(jìn)(與GRANT語(yǔ)句同時(shí))。如果你有較早版本的MySQL,你的mysql數(shù)據(jù)庫(kù)將只有user、db和host表。如果你從老版本升級(jí)到3.22.11或更新,而沒(méi)有tables_priv和columns_priv表,運(yùn)行mysql_fix_privileges_tables腳本創(chuàng)建它們。
MySQL沒(méi)有rows_priv表,因?yàn)樗惶峁┯涗浖?jí)權(quán)限,例如,你不能限制用戶(hù)于表中包含特定列值的行。如果你確實(shí)需要這種能力,你必須用應(yīng)用編程來(lái)提供。如果你想執(zhí)行建議的記錄級(jí)鎖定,你可用GET_LOCK()函數(shù)做到。
授權(quán)表包含兩種列:決定一個(gè)權(quán)限何時(shí)運(yùn)用的范圍列和決定授予哪種權(quán)限的權(quán)限列。
2.1.1 授權(quán)表范圍列
授權(quán)表范圍列指定表中的權(quán)限何時(shí)運(yùn)用。每個(gè)授權(quán)表?xiàng)l目包含User和Host列來(lái)指定權(quán)限何時(shí)運(yùn)用于一個(gè)給定用戶(hù)從給定主機(jī)的連接。其他表包含附加的范圍列,如db表包含一個(gè)Db列指出權(quán)限運(yùn)用于哪個(gè)數(shù)據(jù)庫(kù)。類(lèi)似地,tables_priv和columns_priv表包含范圍字段,縮小范圍到一個(gè)數(shù)據(jù)庫(kù)中的特定表或一個(gè)表的特定列。
2.1.2 授權(quán)表權(quán)限列
授權(quán)表還包含權(quán)限列,他們指出在范圍列中指定的用戶(hù)擁有何種權(quán)限。由MySQL支持的權(quán)限如下表所示。該表使用GRANT語(yǔ)句的權(quán)限名稱(chēng)。對(duì)于絕大多數(shù)在user、db和host表中的權(quán)限列的名稱(chēng)與GRANT語(yǔ)句中有明顯的聯(lián)系。如Select_priv對(duì)應(yīng)于SELECT權(quán)限。
作 者: 晏子
作為一個(gè)MySQL的系統(tǒng)管理員,你有責(zé)任維護(hù)你的MySQL數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)安全性和完整性。本文主要主要介紹如何建立一個(gè)安全的MySQL系統(tǒng),從系統(tǒng)內(nèi)部和外部網(wǎng)絡(luò)兩個(gè)角度,為你提供一個(gè)指南。
本文主要考慮下列安全性有關(guān)的問(wèn)題:
為什么安全性很重要,你應(yīng)該防范那些攻擊?
服務(wù)器面臨的風(fēng)險(xiǎn)(內(nèi)部安全性),如何處理?
連接服務(wù)器的客戶(hù)端風(fēng)險(xiǎn)(外部安全性),如何處理?
MySQL管理員有責(zé)任保證數(shù)據(jù)庫(kù)內(nèi)容的安全性,使得這些數(shù)據(jù)記錄只能被那些正確授權(quán)的用戶(hù)訪(fǎng)問(wèn),這涉及到數(shù)據(jù)庫(kù)系統(tǒng)的內(nèi)部安全性和外部安全性。
內(nèi)部安全性關(guān)心的是文件系統(tǒng)級(jí)的問(wèn)題,即,防止MySQL數(shù)據(jù)目錄(DATADIR)被在服務(wù)器主機(jī)有賬號(hào)的人(合法或竊取的)進(jìn)行攻擊。如果數(shù)據(jù)目錄內(nèi)容的權(quán)限過(guò)分授予,使得每個(gè)人均能簡(jiǎn)單地替代對(duì)應(yīng)于那些數(shù)據(jù)庫(kù)表的文件,那么確??刂瓶蛻?hù)通過(guò)網(wǎng)絡(luò)訪(fǎng)問(wèn)的授權(quán)表設(shè)置正確,對(duì)此毫無(wú)意義。
外部安全性關(guān)心的是從外部通過(guò)網(wǎng)絡(luò)連接服務(wù)器的客戶(hù)的問(wèn)題,即,保護(hù)MySQL服務(wù)器免受來(lái)自通過(guò)網(wǎng)絡(luò)對(duì)服務(wù)器的連接的攻擊。你必須設(shè)置MySQL授權(quán)表(grant table),使得他們不允許訪(fǎng)問(wèn)服務(wù)器管理的數(shù)據(jù)庫(kù)內(nèi)容,除非提供有效的用戶(hù)名和口令。
下面就詳細(xì)介紹如何設(shè)置文件系統(tǒng)和授權(quán)表mysql,實(shí)現(xiàn)MySQL的兩級(jí)安全性。
一、內(nèi)部安全性-保證數(shù)據(jù)目錄訪(fǎng)問(wèn)的安全
MySQL服務(wù)器通過(guò)在MySQL數(shù)據(jù)庫(kù)中的授權(quán)表提供了一個(gè)靈活的權(quán)限系統(tǒng)。你可以設(shè)置這些表的內(nèi)容,允許或拒絕客戶(hù)對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn),這提供了你防止未授權(quán)的網(wǎng)絡(luò)訪(fǎng)問(wèn)對(duì)你數(shù)據(jù)庫(kù)攻擊的安全手段,然而如果主機(jī)上其他用戶(hù)能直接訪(fǎng)問(wèn)數(shù)據(jù)目錄內(nèi)容,建立對(duì)通過(guò)網(wǎng)絡(luò)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的良好安全性對(duì)你毫無(wú)幫助,除非你知道你是登錄MySQL服務(wù)器運(yùn)行主機(jī)的唯一用戶(hù),否則你需要關(guān)心在這臺(tái)機(jī)器上的其他用戶(hù)獲得對(duì)數(shù)據(jù)目錄的訪(fǎng)問(wèn)的可能性。
以下是你應(yīng)該保護(hù)的內(nèi)容:
數(shù)據(jù)庫(kù)文件。很明顯,你要維護(hù)服務(wù)器管理的數(shù)據(jù)庫(kù)的私用性。數(shù)據(jù)庫(kù)擁有者通常并且應(yīng)該考慮數(shù)據(jù)庫(kù)內(nèi)容的安全性,即使他們不想,也應(yīng)該考慮時(shí)數(shù)據(jù)庫(kù)內(nèi)容公開(kāi)化,而不是通過(guò)糟糕的數(shù)據(jù)目錄的安全性來(lái)暴露這些內(nèi)容。
日志文件。一般和更新日志必須保證安全,因?yàn)樗麄儼樵?xún)文本。對(duì)日志文件有訪(fǎng)問(wèn)權(quán)限的任何人可以監(jiān)視數(shù)據(jù)庫(kù)進(jìn)行過(guò)的操作。
更要重點(diǎn)考慮的日志文件安全性是諸如GRANT和SET PASSWORD等的查詢(xún)也被記載了,一般和更新日志包含有敏感查詢(xún)的文本,包括口令(MySQL使用口令加密,但它在已經(jīng)完成設(shè)置后才運(yùn)用于以后的連接建立。設(shè)置一個(gè)口令的過(guò)程設(shè)計(jì)象GRANT或SET PASSWORD等查詢(xún),并且這些查詢(xún)以普通文本形式記載在日志文件中)。如果一個(gè)攻擊者猶如日文件的讀權(quán)限,只需在日志文件上運(yùn)行g(shù)rep尋找諸如GRANT和PASSWORD等詞來(lái)發(fā)現(xiàn)敏感信息。
顯然,你不想讓服務(wù)器主機(jī)上的其他用戶(hù)有數(shù)據(jù)庫(kù)目錄文件的寫(xiě)權(quán)限,因?yàn)樗麄兛梢灾貙?xiě)你的狀態(tài)文件或數(shù)據(jù)庫(kù)表文件,但是讀權(quán)限也很危險(xiǎn)。如果一個(gè)數(shù)據(jù)庫(kù)表文件能被讀取,偷取文件并得到MySQL本身,以普通文本顯示表的內(nèi)容也很麻煩,為什么?因?yàn)槟阋鱿铝惺虑椋?br>
在服務(wù)器主機(jī)上安裝你自己“特制”的MySQL服務(wù)器,但是有一個(gè)不同于官方服務(wù)器版本的端口、套接字和數(shù)據(jù)目錄。
運(yùn)行mysql_install_db初始化你的數(shù)據(jù)目錄,這賦予你作為MySQL root用戶(hù)訪(fǎng)問(wèn)你的服務(wù)器的權(quán)限,所以你有對(duì)服務(wù)器訪(fǎng)問(wèn)機(jī)制的完全控制,它也建立一個(gè)test數(shù)據(jù)庫(kù)。
將對(duì)應(yīng)于你想偷取得表文件拷貝到你服務(wù)器的數(shù)據(jù)庫(kù)目錄下的test目錄。
啟動(dòng)你的服務(wù)器。你可以隨意訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)表,SHOW TABLES FROM test顯示你有一個(gè)偷來(lái)的表的拷貝,SELECT *顯示它們?nèi)魏我粋€(gè)的全部?jī)?nèi)容。
如果你確實(shí)很惡毒,將權(quán)限公開(kāi)給你服務(wù)器的任何匿名用戶(hù),這樣任何人能從任何地方連接服務(wù)器訪(fǎng)問(wèn)你的test數(shù)據(jù)庫(kù)。你現(xiàn)在將偷來(lái)的數(shù)據(jù)庫(kù)表公布于眾了。
在考慮一下,從相反的角度,你想讓別人對(duì)你這樣嗎?當(dāng)然不!你可以通過(guò)在數(shù)據(jù)庫(kù)錄下執(zhí)行l(wèi)s -l命令確定你的數(shù)據(jù)庫(kù)是否包含不安全的文件和目錄。查找有“組”和“其他用戶(hù)”權(quán)限設(shè)置的文件和目錄。下面是一個(gè)不安全數(shù)據(jù)目錄的一部分列出:
% ls -l
total 10148
drwxrwxr-x 11 mysqladm wheel 1024 May 8 12:20 .
drwxr-xr-x 22 root wheel 512 May 8 13:31 ..
drwx------ 2 mysqladm mysqlgrp 512 Apr 16 15:57 menagerie
drwxrwxr-x 2 mysqladm wheel 512 Jan 25 20:40 mysql
drwxrwxr-x 7 mysqladm wheel 512 Aug 31 1998 sql-bench
drwxrwxr-x 2 mysqladm wheel 1536 May 6 06:11 test
drwx------ 2 mysqladm mysqlgrp 1024 May 8 18:43 tmp
....
正如你看到的,有些數(shù)據(jù)庫(kù)有正確的權(quán)限,而其他不是。本例的情形是經(jīng)過(guò)一段時(shí)間后的結(jié)果。較少限制的權(quán)限由在權(quán)限設(shè)置方面比更新版本更不嚴(yán)格的較早版本服務(wù)器設(shè)置的(注意更具限制的目錄menageria和tmp都有較近日期)。MySQL當(dāng)前版本確保這些文件只能由運(yùn)行服務(wù)器的用戶(hù)讀取。
讓我們來(lái)修正這些權(quán)限,使得只用服務(wù)器用戶(hù)可訪(fǎng)問(wèn)它們。你的主要保護(hù)工具來(lái)自于由UNIX文件系統(tǒng)本身提供的設(shè)置文件和目錄屬主和模式的工具。下面是我們要做的:
進(jìn)入該目錄
% cd DATADIR
設(shè)置所有在數(shù)據(jù)目錄下的文件屬主為由用于運(yùn)行服務(wù)器的賬號(hào)擁有(你必須以root執(zhí)行這步)。在本文使用mysqladm和mysqlgrp作為該賬號(hào)的用戶(hù)名和組名。你可以使用下列命令之一改變屬主:
# chown mysqladm.mysqlgrp .
# find . -follow -type d -print | xargs chown mysqladm.mysqlgrp
設(shè)置你的數(shù)據(jù)目錄和數(shù)據(jù)庫(kù)目錄的模式使得他們只能由mysqladm讀取,這阻止其他用戶(hù)訪(fǎng)問(wèn)你數(shù)據(jù)庫(kù)目錄的內(nèi)容。你可以用下列命令之一以root或mysqladm身份運(yùn)行。
% chmod -R go-rwx .
% find . -follow -type d -print | xargs chmod go-rwx
數(shù)據(jù)目錄內(nèi)容的屬主和模式為mysqladm設(shè)置。現(xiàn)在你應(yīng)該保證你總是以mysqladm用戶(hù)運(yùn)行服務(wù)器,因?yàn)楝F(xiàn)在這是唯一由訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)目錄權(quán)限的用戶(hù)(除root)。
在完成這些設(shè)置后,你最終應(yīng)該得到下面的數(shù)據(jù)目錄權(quán)限:
% ls -l
total 10148
drwxrwx--- 11 mysqladm mysqlgrp 1024 May 8 12:20 .
drwxr-xr-x 22 root wheel 512 May 8 13:31 ..
drwx------ 2 mysqladm mysqlgrp 512 Apr 16 15:57 menagerie
drwx------ 2 mysqladm正在看的ORACLE教程是:MySQL安全性指南 (1)(轉(zhuǎn))。 mysqlgrp 512 Jan 25 20:40 mysql
drwx------ 7 mysqladm mysqlgrp 512 Aug 31 1998 sql-bench
drwx------ 2 mysqladm mysqlgrp 1536 May 6 06:11 test
drwx------ 2 mysqladm mysqlgrp 1024 May 8 18:43 tmp
....
二、外部安全性-保證網(wǎng)絡(luò)訪(fǎng)問(wèn)的安全
MySQL的安全系統(tǒng)是很靈活的,它允許你以多種不同方式設(shè)置用戶(hù)權(quán)限。一般地,你可使用標(biāo)準(zhǔn)的SQL語(yǔ)句GRANT和REVOKE語(yǔ)句做,他們?yōu)槟阈薷目刂瓶蛻?hù)訪(fǎng)問(wèn)的授權(quán)表,然而,你可能由一個(gè)不支持這些語(yǔ)句的老版本的MySQL(在3.22.11之前這些語(yǔ)句不起作用),或者你發(fā)覺(jué)用戶(hù)權(quán)限看起來(lái)不是以你想要的方式工作。對(duì)于這種情況,了解MySQL授權(quán)表的結(jié)構(gòu)和服務(wù)器如何利用它們決定訪(fǎng)問(wèn)權(quán)限是有幫助的,這樣的了解允許你通過(guò)直接修改授權(quán)表增加、刪除或修改用戶(hù)權(quán)限,它也允許你在檢查這些表時(shí)診斷權(quán)限問(wèn)題。
關(guān)于如何管理用戶(hù)賬號(hào),見(jiàn)《MySQL的用戶(hù)管理》。而對(duì)GRANT和REVOKE語(yǔ)句詳細(xì)描述,見(jiàn)《MySQL參考手冊(cè)》。
2.1 MySQL授權(quán)表的結(jié)構(gòu)和內(nèi)容
通過(guò)網(wǎng)絡(luò)連接服務(wù)器的客戶(hù)對(duì)MySQL數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)由授權(quán)表內(nèi)容來(lái)控制。這些表位于mysql數(shù)據(jù)庫(kù)中,并在第一次安裝MySQL的過(guò)程中初始化(運(yùn)行mysql_install_db腳本)。授權(quán)表共有5個(gè)表:user、db、host、tables_priv和columns_priv。
表1 user、db和host授權(quán)表結(jié)構(gòu)
訪(fǎng)問(wèn)范圍列
user db host
Host Host Host
User Db Db
Password User
數(shù)據(jù)庫(kù)/表權(quán)限列
Alter_priv Alter_priv Alter_priv
Create_priv Create_priv Create_priv
Delete_priv Delete_priv Delete_priv
Drop_priv Drop_priv Drop_priv
Index_priv Index_priv Index_priv
Insert_priv Insert_priv Insert_priv
References_priv References_priv References_priv
Select_priv Select_priv Select_priv
Update_priv Update_priv Update_priv
File_priv Grant_priv Grant_priv
Grant_priv
Process_priv
Reload_priv
Shutdown_priv
表2 tables_priv和columns_priv屬權(quán)表結(jié)構(gòu)
訪(fǎng)問(wèn)范圍列
tables_priv columns_priv
Host Host
Db Db
User User
Table_name Table_name
Column_name
權(quán)限列
Table_priv Column_priv
授權(quán)表的內(nèi)容有如下用途:
user表
user表列出可以連接服務(wù)器的用戶(hù)及其口令,并且它指定他們有哪種全局(超級(jí)用戶(hù))權(quán)限。在user表啟用的任何權(quán)限均是全局權(quán)限,并適用于所有數(shù)據(jù)庫(kù)。例如,如果你啟用了DELETE權(quán)限,在這里列出的用戶(hù)可以從任何表中刪除記錄,所以在你這樣做之前要認(rèn)真考慮。
db表
db表列出數(shù)據(jù)庫(kù),而用戶(hù)有權(quán)限訪(fǎng)問(wèn)它們。在這里指定的權(quán)限適用于一個(gè)數(shù)據(jù)庫(kù)中的所有表。
host表
host表與db表結(jié)合使用在一個(gè)較好層次上控制特定主機(jī)對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)權(quán)限,這可能比單獨(dú)使用db好些。這個(gè)表不受GRANT和REVOKE語(yǔ)句的影響,所以,你可能發(fā)覺(jué)你根本不是用它。
tables_priv表
tables_priv表指定表級(jí)權(quán)限,在這里指定的一個(gè)權(quán)限適用于一個(gè)表的所有列。
columns_priv表
columns_priv表指定列級(jí)權(quán)限。這里指定的權(quán)限適用于一個(gè)表的特定列。
在“不用GRANT設(shè)置用戶(hù)”一節(jié)里,我們?cè)儆懻揋RANT語(yǔ)句如何對(duì)修改這些表起作用,和你怎樣能通過(guò)直接修改授權(quán)表達(dá)到同樣的效果。
tables_priv和columns_priv表在MySQL 3.22.11版引進(jìn)(與GRANT語(yǔ)句同時(shí))。如果你有較早版本的MySQL,你的mysql數(shù)據(jù)庫(kù)將只有user、db和host表。如果你從老版本升級(jí)到3.22.11或更新,而沒(méi)有tables_priv和columns_priv表,運(yùn)行mysql_fix_privileges_tables腳本創(chuàng)建它們。
MySQL沒(méi)有rows_priv表,因?yàn)樗惶峁┯涗浖?jí)權(quán)限,例如,你不能限制用戶(hù)于表中包含特定列值的行。如果你確實(shí)需要這種能力,你必須用應(yīng)用編程來(lái)提供。如果你想執(zhí)行建議的記錄級(jí)鎖定,你可用GET_LOCK()函數(shù)做到。
授權(quán)表包含兩種列:決定一個(gè)權(quán)限何時(shí)運(yùn)用的范圍列和決定授予哪種權(quán)限的權(quán)限列。
2.1.1 授權(quán)表范圍列
授權(quán)表范圍列指定表中的權(quán)限何時(shí)運(yùn)用。每個(gè)授權(quán)表?xiàng)l目包含User和Host列來(lái)指定權(quán)限何時(shí)運(yùn)用于一個(gè)給定用戶(hù)從給定主機(jī)的連接。其他表包含附加的范圍列,如db表包含一個(gè)Db列指出權(quán)限運(yùn)用于哪個(gè)數(shù)據(jù)庫(kù)。類(lèi)似地,tables_priv和columns_priv表包含范圍字段,縮小范圍到一個(gè)數(shù)據(jù)庫(kù)中的特定表或一個(gè)表的特定列。
2.1.2 授權(quán)表權(quán)限列
授權(quán)表還包含權(quán)限列,他們指出在范圍列中指定的用戶(hù)擁有何種權(quán)限。由MySQL支持的權(quán)限如下表所示。該表使用GRANT語(yǔ)句的權(quán)限名稱(chēng)。對(duì)于絕大多數(shù)在user、db和host表中的權(quán)限列的名稱(chēng)與GRANT語(yǔ)句中有明顯的聯(lián)系。如Select_priv對(duì)應(yīng)于SELECT權(quán)限。
相關(guān)文章
ORACLE分區(qū)表轉(zhuǎn)換在線(xiàn)重定義DBMS_REDEFINITION
這篇文章主要為大家介紹了ORACLE分區(qū)表轉(zhuǎn)換在線(xiàn)重定義DBMS_REDEFINITION表,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Oracle date 和 timestamp 區(qū)別詳解
這篇文章主要介紹了Oracle date 和 timestamp 區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03oracle數(shù)據(jù)匹配merge into的實(shí)例詳解
這篇文章主要介紹了oracle數(shù)據(jù)匹配merge into的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10Oracle?Database?23c新特性之關(guān)聯(lián)更新和刪除示例詳解
這篇文章主要介紹了Oracle?Database?23c新特性之關(guān)聯(lián)更新和刪除的相關(guān)資料,Oracle database 23c開(kāi)始支持在UPDATE和DELETE語(yǔ)句中使用JOIN連接,獲取更新和刪除的數(shù)據(jù)源,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06解決Oracle刪除重復(fù)數(shù)據(jù)只留一條的方法詳解
本篇文章是對(duì)Oracle刪除重復(fù)數(shù)據(jù)只留一條的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Oracle客戶(hù)端 NLS_LANG 的設(shè)置方法
Oracle客戶(hù)端 NLS_LANG 的設(shè)置方法,如果服務(wù)器端與客戶(hù)端不一樣會(huì)提示錯(cuò)誤,windows下通過(guò)注冊(cè)表下可以解決2012-06-06