Mysql存取許可權系統(轉)

subid發表於2007-08-12
Mysql存取許可權系統[@more@]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資料庫上的許可權可以用來改變密碼和其它存取許可權資訊.(密碼是加密儲存的,所
以一個有惡意的使用者不能簡單的讀取它們.但是,如果有足夠的許可權,他可以把它改成另
一個不同的密碼.)

透過MySQL許可權系統無法實現下面一些事情:

·你不能明確的指定一個使用者將被拒絕存取.也就是說,你不能明確指定匹配一個使用者,拒
絕它的連線.
·你不能指定一個使用者能在一個資料庫中建立和刪除表,而不能建立和刪除該資料庫自身.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10796304/viewspace-952528/,如需轉載,請註明出處,否則將追究法律責任。

相關文章