mysql有一個高級的但不標准的存取權限系統.此部分即描述其如何工作.
權限系統做什麼
Mysql的權限系統的主要功能是驗證從假定主機來的用戶連接.以及檢查用
戶對數據庫的select,insert,update和delete操作權限.
其附加功能還包括匿名用戶驗證及賦予權限以使用Mysql特殊的功能,如從
文件中裝入數據和管理操作.
Mysql的用戶名和口令
Mysql的用戶名和口令在Unix和Windows之間有一些差別:
·用戶名,Mysql用於達到其驗證目的.與Unix和Windows的用戶名毫無干系
(login names).大多數的Mysql客戶端缺省的使用Uinx當前用戶名作為
Mysql用戶名去登錄,但那只是為了方便而已.客戶端程序允許使用-u或--
user參數指定一個不同的名字.這意味著你不可能使Mysql數據庫得到安全
保護除非每一個Mysql用戶名都具有口令.任何人都可以用任何名字來企圖
連接數據庫,如果他們指定的某一個名字恰好沒有口令,他們就會取得成功
.
·Mysql用戶名可以提高到十六位字符長,而典型的Unix用戶名都限制在八位
.
·Mysql的口令跟Unix口令毫無干系.不必把你登錄進Unix機器的口令和你用
來在該機器上存取數據庫的口令聯系起來.
·Mysql使用了與Unix登錄進程不同的加密算法.請參見7.3.11節各種函數中
對PASSWord()和ENCRYPT()函數的描述.
6.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系統中,你不必在每一次調用客戶機程序進行連接的時候都在命令行敲入
所有選項,可以為它們指定不同的缺省值.這可以用兩種方法來辦到:
·你可以在你的home目錄中的".my.cnf"配置文件中的[client]一節指定連接參
數.該文件的相關節看起來可能象這樣:
[client]host=host_name
user=user_name
password=your_pass
請參見4.15.4選項文件一節
·你也可以使用環境變量來指定連接參數.主機可以被指定使用MYSQL_HOST,Mysql
用戶名可以被指定使用USER,LOGNAME或是LOGIN(盡管這些變量可能已經被設置
成你的Unix登錄名,但它們可能被任意改變).口令可以被指定為使用MYSQL_PWD(
但這是不安全的;參見下節)
如果通過多種不同的方法指定連接參數,那麼在命令行中指定的值比在配置文件中
和環境變量中指定的值具有更高的優先權.而在配置文件中指定的值又比在環境變
量中指定的值具有更高的優先權.
使你的口令安全
在其它用戶可以發現的情況下將你的口令用一種方法暴露的指定出來是相當失策的
.下面列出了當你使用客戶端程序時可以用來指定密碼的方法,比比較了每一種方法
的優劣:
·在命令行使用一個 -p密碼 或 --password=密碼 參數.這確很方便,但極不安全,
你密碼能被系統狀態檢測程序看見(如ps),所以可以被其他用戶調用出來顯示在
命令行上.(MySQL客戶端特別在命令行參數初始化時用0覆蓋它們,但在該值顯得
可見時仍有短暫的間隔).
·用一個-p或--password參數(不指定你的密碼).這樣,客戶端程序會要求密碼從終
端輸入:
shell> mysql -u 用戶名 -p]
Enter password: ********
客戶端把你輸入的密碼以*"字符顯示在終端上,以使旁觀者無法看見.如此輸入
密碼比你在命令行上指定密碼更安全,因為它對其他用戶並不可見.但是,此輸入
密碼的方法只在你使用交互式程序時才有效.如果你想非交互的從一個腳本中調
用客戶端,則沒有機會從終端輸入密碼了.
·把你的密碼保存在一個配置文件中.舉例來說,你可以把你的密碼列在你home目錄
下的.my.cnf文件的[client]節:
[client]
password=your_pass
如果你把密碼存放在.my.cnf中,那麼同組用戶和其他用戶對該文件必須不能具
有讀取和寫入的權限.確定文件的存取模式必須為400或600.參見4.15.4節選項文
件.
·你也可以把你的密碼存放在MYSQL_PWD環境變量中,但該方法被認為極不安全而通
常不被使用.某些版本的PS包括一個選項可以列出正在運行的進程的環境;你的密
碼將被清楚的顯示出來,如果你設置了MYSQL_PWD環境變量的話.
總而言之,最安全的方法是在客戶端提示輸入密碼或將密碼保存在受到正確保護的
.my.cnf文件中.
MySQL提供的權限
權限信息存放在mysql數據庫(即數據庫的名字叫mysql)的user, db, host, tables
_priv and columns_priv表中.當MySQL服務器在啟動時或在6.9節"改變的權限何時
生效"指出的情況下讀取這些表中的項目.
此手冊所提及的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 權限允許你在一個數據庫中存在的表的行上執
行操作.
僅當你真要從表中返回行時SELECT表達式才需要select權限.你可以執行一個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服務器可以存取的文件.
剩下的權限用於管理操作,在執行mysqladmin程序時會用到.下表列出了mysqladmin命
令允許你執行的每一個管理權限:
權限 權限擁有者可以執行的操作
reload reload, refresh, flush-privileges, flush-hosts, flush-logs, flush-tables
shutdown shutdown
process processlist, kill
reload命令告訴服務器重新讀取認證表.refresh命令刷新所有的數據庫,打開和關閉日
志文件.flush-privileges是reload的一個同義詞.其它flush-*執行和refresh大致相
同的功能,但是在更有限的范圍內,也許在某些場合效果更好.例如,如果你僅想刷新日
志文件,flush-logs就是比refresh更好的選擇.
shutdown命令關閉服務器.
processlist命令列出有關服務器中所執行的線程的信息.kill命令殺掉服務器的線程
.你通常只能列出和殺掉你自己的線程,但如果你有process權限就可以列出或殺掉由其
他用戶啟動的線程.
通常只授予相關用戶一些必須權限是一個好辦法,當你得學會小心謹慎的授出下列權限:
·grant權限允許用戶把他們自己的權限授予另外一些用戶.如果兩個用戶有不同的權
限,而又同時具有grant權限的話,那他們就共同具有了這所有的這些權限.
·alter權限擁有者可以用給表重命名的方式破壞權限系統.
·file權限些許會被濫用,以在數據庫表中讀取任何的全程文件,該項目可以使用SELECT
進行存取.
·shudown權限也可能被濫用.關閉服務器,對其他所有用戶拒絕服務.
·process權限可以以純文本的方式顯示出當前正執行的查詢,包含設置和修改密碼的查
詢.
·mysql數據庫上的權限可以用來改變密碼和其它存取權限信息.(
·grant權限允許用戶把他們自己的權限授予另外一些用戶.如果兩個用戶有不同的權
限,而又同時具有grant權限的話,那他們就共同具有了這所有的這些權限.
·alter權限擁有者可以用給表重命名的方式破壞權限系統.
·file權限些許會被濫用,以在數據庫表中讀取任何的全程文件,該項目可以使用SELECT
進行存取.
·shudown權限也可能被濫用.關閉服務器,對其他所有用戶拒絕服務.
·process權限可以以純文本的方式顯示出當前正執行的查詢,包含設置和修改密碼的查
詢.
·mysql數據庫上的權限可以用來改變密碼和其它存取權限信息.(