- 論壇徽章:
- 0
|
Mysql有一個高級的但不標準的存取權限系統(tǒng)。此部分即描述其如何工作。
1、權限系統(tǒng)做什么
Mysql的權限系統(tǒng)的主要功能是驗證從假定主機來的用戶連接。以及檢查用戶對數據庫的select,insert,update和delete操作權限。
其附加功能還包括匿名用戶驗證及賦予權限以使用Mysql特殊的功能,如從文件中裝入數據和管理操作。
2、Mysql的用戶名和口令
Mysql的用戶名和口令在Unix和Windows之間有一些差別: 用戶名,Mysql用于達到其驗證目的。與Unix和Windows的用戶名毫無干系(login names)。大多數的Mysql客戶端缺省的使用Uinx當前用戶名作為Mysql用戶名去登錄,但那只是為了方便而已。客戶端程序允許使用-u或--user參數指定一個不同的名字。這意味著你不可能使Mysql數據庫得到安全保護除非每一個Mysql用戶名都具有口令。任何人都可以用任何名字來企圖連接數據庫,如果他們指定的某一個名字恰好沒有口令,他們就會取得成功。
Mysql用戶名可以提高到十六位字符長,而典型的Unix用戶名都限制在八位。
Mysql的口令跟Unix口令毫無干系。不必把你登錄進Unix機器的口令和你用來在該機器上存取數據庫的口令聯系起來。
Mysql使用了與Unix登錄進程不同的加密算法。
3、連接上Mysql服務器
Mysql客戶端程序通常會讓你指定一些連接參數,但你想存取Mysql數據庫的時候:你想連接的主機,你的用戶名和口令。例如,Mysql客戶端可以象這樣開始(可選參數被加上了"["和"]" :
shell>; mysql [-h 主機名] [-u 用戶名] [-p口令]
也可以用--host=主機名,--user=用戶名和--password=口令來代替-h,-u和-p選項。注意,在-p或--password和口令之間沒有空格。
如果在命令行沒有指定連接參數,Mysql將使用缺省值:
缺省的主機名是localhost。
缺省的用戶名是你在Unix中的登錄名。
如果沒有-p參數則將不提供口令。
因而,對于Unix用戶Joe如下的命令是等價的
shell>; mysql -h localhost -u joe
shell>; mysql -h localhost
shell>; mysql -u joe
shell>; mysql
其它的客戶端的動作與此類似。
在Unix系統(tǒng)中,你不必在每一次調用客戶機程序進行連接的時候都在命令行敲入所有選項,可以為它們指定不同的缺省值。這可以用兩種方法來辦到:
你可以在你的home目錄中的".my.cnf"配置文件中的[client]一節(jié)指定連接參數。該文件的相關節(jié)看起來可能象這樣:
[client]host=host_name
user=user_name
password=your_pass
你也可以使用環(huán)境變量來指定連接參數。主機可以被指定使用MYSQL_HOST,Mysql用戶名可以被指定使用USER,LOGNAME或是LOGIN(盡管這些變量可能已經被設置成你的Unix登錄名,但它們可能被任意改變)。口令可以被指定為使用MYSQL_PWD。
如果通過多種不同的方法指定連接參數,那么在命令行中指定的值比在配置文件中和環(huán)境變量中指定的值具有更高的優(yōu)先權。而在配置文件中指定的值又比在環(huán)境變量中指定的值具有更高的優(yōu)先權。
4、使你的口令安全
在其它用戶可以發(fā)現的情況下將你的口令用一種方法暴露的指定出來是相當失策的。下面列出了當你使用客戶端程序時可以用來指定密碼的方法,比比較了每一種方法的優(yōu)劣:
在命令行使用一個 -p密碼 或 --password=密碼 參數。這確很方便,但極不安全,你密碼能被系統(tǒng)狀態(tài)檢測程序看見(如ps),所以可以被其他用戶調用出來顯示在命令行上。(MySQL客戶端特別在命令行參數初始化時用0覆蓋它們,但在該值顯得可見時仍有短暫的間隔)。
用一個-p或--password參數(不指定你的密碼)。這樣,客戶端程序會要求密碼從終端輸入:
shell>; mysql -u 用戶名 -p]
Enter password: ********
客戶端把你輸入的密碼以"*"字符顯示在終端上,以使旁觀者無法看見。如此輸入密碼比你在命令行上指定密碼更安全,因為它對其他用戶并不可見。但是,此輸入密碼的方法只在你使用交互式程序時才有效。如果你想非交互的從一個腳本中調用客戶端,則沒有機會從終端輸入密碼了。
把你的密碼保存在一個配置文件中。舉例來說,你可以把你的密碼列在你home目錄下的".my.cnf"文件的[client]節(jié):
[client]
password=your_pass
如果你把密碼存放在".my.cnf"中,那么同組用戶和其他用戶對該文件必須不能具有讀取和寫入的權限。確定文件的存取模式必須為400或600。
你也可以把你的密碼存放在MYSQL_PWD環(huán)境變量中,但該方法被認為極不安全而通常不被使用。某些版本的PS包括一個選項可以列出正在運行的進程的環(huán)境;你的密碼將被清楚的顯示出來,如果你設置了MYSQL_PWD環(huán)境變量的話。
總而言之,最安全的方法是在客戶端提示輸入密碼或將密碼保存在受到正確保護的".my.cnf"文件中。
5、MySQL提供的權限
權限信息存放在mysql數據庫(即數據庫的名字叫mysql)的user, db, host, tables_priv and columns_priv表中。
此手冊所提及的MySQL提供的權限的名字列在其下,各列列出了權限的名字,對應的操作和適用的范圍。
權限 列名 范圍
select select_priv 表
insert Insert_priv 表
update Update_priv 表
delete Delete_priv 表
index Index_priv 表
alter Alter_priv 表
create Create_priv 數據庫,表或索引
drop Drop_priv 數據庫或表
grant Grant_priv 數據庫或表
reload Reload_priv 服務器管理
shutdown Shutdown_priv 服務器管理
process Process_priv 服務器管理
file File_priv 服務器上文件存取
select, insert, update 和 delete 權限允許你在一個數據庫中存在的表的行上執(zhí)行操作。
僅當你真要從表中返回行時SELECT表達式才需要select權限。你可以執(zhí)行一個SELECT表達式,甚至當你在服務器上沒有存取任何數據庫的權限時也行。比如,你可以用mysql客戶端作一個簡單的計數:
mysql>; SELECT 1+1;
mysql>; SELECT PI()*2;
index權限允許你create或drop(刪除)索引。
alter權限允許你使用ALTER TABLE。
create和drop權限允許你create新數據庫和表,或drop(刪除)存在的數據庫和表。
注意,如果你允許一個用戶擁有對mysql數據庫的drop權限,那么該用戶可以drop掉MySQL用來存放存取權限的地方。
grant權限允許你授予其他用戶你所擁有的那些權限。
file權限允許你用LOAD DATA INFILE 和 SELECT ... INTO OUTFILE語句存取服務器上的文件。任何用戶如果具有了這個權限他就可以存取任何MySQL服務器可以存取的文件。
剩下的權限用于管理操作,在執(zhí)行mysqladmin程序時會用到。下表列出了mysqladmin命令允許你執(zhí)行的每一個管理權限:
權限 權限擁有者可以執(zhí)行的操作
reload reload, refresh, flush-privileges, flush-hosts, flush-logs, flush-tables,
shutdown shutdown
process processlist, kill
reload命令告訴服務器重新讀取認證表。refresh命令刷新所有的數據庫,打開和關閉日志文件。flush-privileges是reload的一個同義詞。其它flush-*執(zhí)行和refresh大致相同的功能,但是在更有限的范圍內,也許在某些場合效果更好。例如,如果你僅想刷新日志文件,flush-logs就是比refresh更好的選擇。
processlist命令列出有關服務器中所執(zhí)行的線程的信息。kill命令殺掉服務器的線程。你通常只能列出和殺掉你自己的線程,但如果你有process權限就可以列出或殺掉由其他用戶啟動的線程。
通常只授予相關用戶一些必須權限是一個好辦法,當你得學會小心謹慎的授出下列權限:
grant權限允許用戶把他們自己的權限授予另外一些用戶。如果兩個用戶有不同的權限,而又同時具有grant權限的話,那他們就共同具有了這所有的這些權限。
alter權限擁有者可以用給表重命名的方式破壞權限系統(tǒng)。
file權限些許會被濫用,以在數據庫表中讀取任何的全程文件,該項目可以使用SELECT進行存取。
shudown權限也可能被濫用。關閉服務器,對其他所有用戶拒絕服務。
process權限可以以純文本的方式顯示出當前正執(zhí)行的查詢,包含設置和修改密碼的查詢。
mysql數據庫上的權限可以用來改變密碼和其它存取權限信息。(密碼是加密存儲的,所以一個有惡意的用戶不能簡單的讀取它們。但是,如果有足夠的權限,他可以把它改成另一個不同的密碼。)
通過MySQL權限系統(tǒng)無法實現下面一些事情:
你不能明確的指定一個用戶將被拒絕存取。也就是說,你不能明確指定匹配一個用戶,拒絕它的連接。
你不能指定一個用戶能在一個數據庫中創(chuàng)建和刪除表,而不能創(chuàng)建和刪除該數據庫自身。 |
|