MySQL中文參考手冊7(MySQL 存取權限系統)-F5ofz
轉載 譯者:晏子
〖返回〗〖轉發〗
譯者:晏子 ([email protected])主頁:http://linuxdb.yeah.net
6 MySQL 存取權限系統
MySQL有一個先進但非標准的安全/權限系統。本節描述它的工作原理。
6.1 權限系統做什麼
MySQL權限系統的主要功能是證實連接到一台給定主機的一個用戶,並且賦予該用戶在一個數據庫上select、 insert、update和delete的權限。
附加的功能包括有一個匿名的用戶和對於MySQL特定的功能例如LOAD DATA INFILE進行授權及管理操作的能力。
6.2 MySQL 用戶名和口令
由MySQL使用用戶名和口令的方法與Unix或Windows使用的方式有很多不同之處:
- MySQL使用於認證目的的用戶名,與Unix用戶名(登錄名字)或Windows用戶名無關。缺省地,大多數MySQL客戶嘗試使用當前Unix用戶名作為MySQL用戶名登錄,但是這僅僅為了方便。客戶程序允許用-u或--user選項指定一個不同的名字,這意味著無論如何你不能使得一個數據庫更安全,除非所有的MySQL用戶名都有口令。任何人可以試圖用任何名字連接服務器,而且如果他們指定了沒有口令的任何名字,他們將成功。
- MySQL用戶名最長可以是16各字符;典型地,Unix用戶名限制為8個字符。
- MySQL口令與Unix口令沒關系。在你使用登錄到一台Unix機器口令和你使用在那台機器上存取一個數據庫的口令之間沒有必要有關聯。
- MySQL加密口令使用了一個Unix登錄期間所用的不同算法,見7.4.12 雜項函數一節中描述PASSword()和ENCRYPT()函數部分。
6.3 與MySQL服務器連接當你想要存取一個MySQL服務器時,MySQL客戶程序一般要求你指定連接參數:你想要聯接的主機、你的用戶名和你的口令。例如,mysql客戶可以象這樣啟動(可選的參數被包括在“[”和“]”之間):
shell> mysql [-h host_name][-u user_name][-pyour_pass ]
-h, -u和-p選項的另一種形式是--host=host_name、--user=user_name和--password=your_pass。注意在-p或--password=與跟隨它後面的口令之間沒有空格。
注意:在命令行上指定一個口令是不安全的!隨後在你系統上的任何用戶可以通過打類似這樣的命令發現你的口令:ps auxww。見4.15.4 選項文件。
對於命令行沒有的聯接參數,mysql使用缺省值:
- 缺省主機名是localhost。
- 缺省用戶名是你的Unix登錄名。
- 如果沒有-p,則沒有提供口令。
這樣, 對一個Unix用戶joe,下列命令是等價的:
shell>mysql -h localhost -u joe
shell>mysql -h localhost
shell>mysql -u joe
shell>mysql
其它MySQL客戶程序有同樣表現。
在Unix系統上,當你進行一個連接時,你可以指定要使用的不同的缺省值,這樣你不必每次在你調用一個客戶程序是在命令行上輸入他們。這可以有很多方法做到:
你能在你的主目錄下“.my.cnf”的配置文件的[client]小節裡指定連接參數。文件的相關小節看上去可能像這樣:
[client]
host=host_name
user=user_name
password=your_pass
見4.15.4 選項文件。
你可以用環境變量指定連接參數。主機可用MYSQL_HOST指定,MySQL用戶名字可用USER指定(僅對 Windows),口令可用MYSQL_PWD指定(但是這不安全,見下一節) 。
如果連接參數以多種方法被指定,在命令行上被指定的值優先於在配置文件和環境變量中指定的值,而在配置文件指定的值優先於在環境變量指定的值。
6.4 使你的口令安全以一種暴露的可被其他用戶發現的方式指定你的口令是不妥當的。當你運行客戶程序時,你可以使用下列方法指定你的口令,還有每個方法的風險評估:
- 使用一個在命令行上-pyour_pass或--password=your_pass的選項。這很方便但是不安全,因為你的口令對系統狀態程序(例如ps)變得可見,它可以被其他的用戶調用來顯示命令行。(一般MySQL客戶在他們的初始化順序期間用零覆蓋命令行參數,但是仍然有一個短暫間隔時間內參數值可見的。)
- 使用一個-p或--password選項(沒有指定your_pass值)。在這種情況下,客戶程序請求來自終端的口令:
shell>mysql - u user_name - p
Enter password: ********
客戶回應“*”字符到作為輸入你的口令的終端使得旁觀者不能看見它。因為它對其他用戶不可見,與在命令行上指定它相比,這樣進入你的口令更安全。然而,這個輸入一個口令的方法僅僅為你交互式運行程序是合適的。如果你想要從非交互式運行的一個腳本調用一個客戶,就沒有從終端輸入入口令的機會。
在一個配置文件中存儲你的口令。例如,你可你的主目錄的“.my.cnf”文件中的[client]節列出你的口令:
[client]
password=your_pass
如果你在“.my.cnf”裡面存儲口令,文件應該不是組或世界可讀或可寫的。保證文件的存取模式是400或600。見4.15.4 選項文件。
你可在MYSQL_PWD環境變量中存儲口令,但是這個方法必須想到是極不安全的且應該不使用。ps的某些版本包括顯示運行進程的環境的選項;如果你設定MYSQL_PWD,你的口令將對所有人是顯而易見的,甚至在沒有這樣一個版本的ps系統上,假設沒有其他方法觀察到進程環境是不明智的。
總之,最安全的方法是讓客戶程序提示口令或在一個適當保護的“.my.cnf”文件中指定口令。
6.5 MySQL提供的權限權限信息用user、db、host、tables_priv和columns_priv表被存儲在mysql數據庫中(即在名為mysql的數據庫中)。在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 數據庫或表
references References_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權限允許你創建或拋棄(刪除)索引。
alter權限允許你使用ALTER TABLE。