MySQL應(yīng)用技巧之存取權(quán)限
MySQL使用于認(rèn)證目的的用戶名,與Unix用戶名(登錄名字)或Windows用戶名無關(guān)。缺省地,大多數(shù)MySQL客戶嘗試使用當(dāng)前Unix用戶名作為MySQL用戶名登錄,但是這僅僅為了方便,客戶程序允許用-u或--user選項指定一個不同的名字。及與安全的考慮,所有的MySQL用戶名都應(yīng)該有口令。
1. MySQL 用戶名和口令
* MySQL使用于認(rèn)證目的的用戶名,與Unix用戶名(登錄名字)或Windows用戶名無關(guān)。缺省地,大多數(shù)MySQL客戶嘗試使用當(dāng)前Unix用戶名作為MySQL用戶名登錄,但是這僅僅為了方便,客戶程序允許用-u或--user選項指定一個不同的名字。及與安全的考慮,所有的MySQL用戶名都應(yīng)該有口令。
* MySQL用戶名最長可以是16各字符;典型地,Unix用戶名限制為8個字符。
* MySQL口令與Unix口令沒關(guān)系。
* MySQL加密口令使用了一個Unix登錄期間所用的不同算法,PASSWORD()和ENCRYPT()
函數(shù)PASSWORD(str)
從純文本口令str計算一個口令字符串。該函數(shù)被用于為了在user授權(quán)表的Password列中存儲口令而加密MySQL口令。
mysql> select PASSWORD('badpwd');
-> '7f84554057dd964b'
PASSWORD()加密是非可逆的。PASSWORD()不以與Unix口令加密的相同的方法執(zhí)行口令加密。你不應(yīng)該假定如果你的Unix 口令和你的MySQL口令是一樣的,PASSWORD()將導(dǎo)致與在Unix口令文件存儲的相同的加密值。見ENCRYPT()。
ENCRYPT(str[,salt])
使用Unix crypt()系統(tǒng)調(diào)用加密str。salt參數(shù)應(yīng)該是一個有2個字符的字符串。(MySQL 3.22.16中,salt可以長于2個字符。)
mysql> select ENCRYPT("hello");
-> 'VxuFAJXVARROc'
如果crypt()在你的系統(tǒng)上不可用,ENCRYPT()總是返回NULL。ENCRYPT()只保留str起始8個字符而忽略所有其他,至少在某些系統(tǒng)上是這樣。這將由底層的crypt()系統(tǒng)調(diào)用的行為決定。
1. 與MySQL服務(wù)器連接
語法格式:
shell> mysql [-h host_name][-u user_name][-pyour_pass ]
-h, -u和-p選項的另一種形式是--host=host_name、--user=user_name和--password=your_pass。
注意:在-p或--password=與跟隨它后面的口令之間沒有空格。(在命令行上指定一個口令是不安全的!)
對于命令行沒有的聯(lián)接參數(shù),mysql使用缺省值:
* 缺省主機(jī)名是localhost。
* 缺省用戶名是你的Unix登錄名。
* 如果沒有-p,則沒有提供口令。
缺省值參數(shù)的指定:
在你的主目錄下“.my.cnf”的配置文件的[client]小節(jié)里指定連接參數(shù):
[client]
host=host_name
user=user_name
password=your_pass
注:命令行上被指定的值優(yōu)先于在配置文件和環(huán)境變量中指定的值
最安全的方法是讓客戶程序提示口令或在一個適當(dāng)保護(hù)的“.my.cnf”文件中指定口令。
1. MySQL提供的權(quán)限
權(quán)限 列 上下文
select Select_priv 表
insert Insert_priv 表
update Update_priv 表
delete Delete_priv 表
index Index_priv 表
alter Alter_priv 表
create Create_priv 數(shù)據(jù)庫、表或索引
drop Drop_priv 數(shù)據(jù)庫或表
grant Grant_priv 數(shù)據(jù)庫或表
references References_priv 數(shù)據(jù)庫或表
reload Reload_priv 服務(wù)器管理
shutdown Shutdown_priv 服務(wù)器管理
process Process_priv 服務(wù)器管理
file File_priv 在服務(wù)器上的文件存取
注:grant權(quán)限允許你把你自己擁有的那些權(quán)限授給其他的用戶。
file權(quán)限給予你用LOAD DATA INFILE和SELECT ... INTO OUTFILE語句讀和寫服務(wù)器上的文件,任何被授予這個權(quán)限的用戶都能讀或?qū)慚ySQL服務(wù)器能讀或?qū)懙娜魏挝募?/p>
2. 存取控制:連接證實
身份檢查使用user表3個(Host, User和Password)范圍字段。服務(wù)器只有在一個user表條目匹配你的主機(jī)名和用戶名并且你提供了正確的口令時才接受連接。
注:一個Host值可以是主機(jī)名或一個IP數(shù)字,或'localhost'指出本地主機(jī)。 可以在Host字段里使用通配符字符“%”和“_”。 Host值'%'匹配任何主機(jī)名。當(dāng)一個連接被嘗試時,服務(wù)器瀏覽排序的條目并使用找到的第一個匹配。
普遍的誤解是認(rèn)為,對一個給定的用戶名,當(dāng)服務(wù)器試圖對連接尋找匹配時,明確命名那個用戶的所有條目將首先被使用。這明顯不是事實。
3. 存取控制:請求證實
一旦你建立了一個連接,服務(wù)器進(jìn)入階段2。對在此連接上進(jìn)來的每個請求,服務(wù)器檢查你是否有足夠的權(quán)限來執(zhí)行它,授權(quán)表用GRANT和REVOKE命令操作。
GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]
ON {tbl_name * *.* db_name.*}
TO user_name [IDENTIFIED BY 'password']
[, user_name [IDENTIFIED BY 'password'] ...]
[WITH GRANT OPTION]
REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]
ON {tbl_name * *.* db_name.*}
FROM user_name [, user_name ...]
GRANT在MySQL 3.22.11或以后版本中實現(xiàn)。對于更早MySQL版本,GRANT語句不做任何事情。
GRANT和REVOKE命令允許系統(tǒng)主管在4個權(quán)限級別上授權(quán)和撤回賦予MySQL用戶的權(quán)利:
全局級別
全局權(quán)限作用于一個給定服務(wù)器上的所有數(shù)據(jù)庫。這些權(quán)限存儲在mysql.user表中。
數(shù)據(jù)庫級別
數(shù)據(jù)庫權(quán)限作用于一個給定數(shù)據(jù)庫的所有表。這些權(quán)限存儲在mysql.db和mysql.host表中。
表級別
表權(quán)限作用于一個給定表的所有列。這些權(quán)限存儲在mysql.tables_priv表中。
列級別
列權(quán)限作用于在一個給定表的單個列。這些權(quán)限存儲在mysql.columns_priv表中。
user表權(quán)限是超級用戶權(quán)限。只把user表的權(quán)限授予超級用戶如服務(wù)器或數(shù)據(jù)庫主管是明智的。對其他用戶,你應(yīng)該把在user表中的權(quán)限設(shè)成'N'并且僅在一個特定數(shù)據(jù)庫的基礎(chǔ)上授權(quán), 使用db和host表。
4. 權(quán)限更改何時生效
當(dāng)mysqld啟動時,所有的授權(quán)表內(nèi)容被讀進(jìn)存儲器并且從那點生效。
用GRANT、REVOKE或SET PASSWORD對授權(quán)表施行的修改會立即被服務(wù)器注意到。
如果你手工地修改授權(quán)表(使用INSERT、UPDATE等等),你應(yīng)該執(zhí)行一個FLUSH PRIVILEGES語句或運行mysqladmin flush-privileges告訴服務(wù)器再裝載授權(quán)表,否則你的改變將不生效,除非你重啟服務(wù)器。
5. 建立初始的MySQL權(quán)限
在安裝MySQL后,你通過運行s/mysql_install_db安裝初始的存取權(quán)限。包含下列權(quán)限集合:
* MySQL root用戶作為可做任何事情的一個超級用戶。連接必須由本地主機(jī)發(fā)出。注意:出世的root口令是空的,因此任何人能以root而沒有一個口令進(jìn)行連接并且被授予所有權(quán)限。
* 一個匿名用戶,他可對有一個'test'或以'test_'開始的名字的數(shù)據(jù)庫做任何時期事情,連接必須由本地主機(jī)發(fā)出。這意味著任何本地用戶能連接并且視為匿名用戶。
* 其他權(quán)限被拒絕。例如,一般用戶不能使用mysqladmin shutdown或mysqladmin processlist。
為MySQL root用戶指定一個口令(注意,你使用PASSWORD()函數(shù)指定口令):
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
WHERE user='root';
mysql> FLUSH PRIVILEGES;
在MySQL 3.22和以上版本中,你可以使用SET PASSWORD語句:
shell> mysql -u root mysql
mysql> SET PASSWORD FOR root=PASSWORD('new_password');
設(shè)置口令的另一種方法是使用mysqladmin命令:
shell> mysqladmin -u root password new_password
看看s/mysql_install_db腳本,看它如何安裝缺省的權(quán)限。你可用它作為一個研究如何增加其他用戶的基礎(chǔ)
為了完全重建權(quán)限表,刪除在包含mysql數(shù)據(jù)庫的目錄下所有“*.frm”,“*.MYI”和“*.MYD”文件。(這是在數(shù)據(jù)庫目錄下面命名為“mysql”的目錄,當(dāng)你運行mysqld --help時,它被列出。)然后運行mysql_install_db腳本,可能在首先編輯它擁有你想要的權(quán)限之后。
1. 向MySQL增加新用戶權(quán)限
增加用戶2個不同的方法:
通過使用GRANT語句或通過直接操作MySQL授權(quán)表。
比較好的方法是使用GRANT語句,因為他們是更簡明并且好像錯誤少些。
shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost
IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"
IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;
monty
可以從任何地方連接服務(wù)器的一個完全的超級用戶,但是必須使用一個口令('something'做這個。注意,我們必須對monty@localhost和monty@"%"發(fā)出GRANT語句。如果我們增加localhost條目,對localhost的匿名用戶條目在我們從本地主機(jī)連接接時由mysql_install_db創(chuàng)建的條目將優(yōu)先考慮,因為它有更特定的Host字段值,所以以user表排列順序看更早到來。
admin
可以從localhost沒有一個口令進(jìn)行連接并且被授予reload和process管理權(quán)限的用戶。這允許用戶執(zhí)行mysqladmin reload、mysqladmin refresh和mysqladmin flush-*命令,還有mysqladmin processlist。沒有授予數(shù)據(jù)庫有關(guān)的權(quán)限。他們能在以后通過發(fā)出另一個GRANT語句授權(quán)。
dummy
可以不用一個口令連接的一個用戶,但是只能從本地主機(jī)。全局權(quán)限被設(shè)置為'N'--USAGE權(quán)限類型允許你無需權(quán)限就可設(shè)置一個用戶。它假定你將在以后授予數(shù)據(jù)庫相關(guān)的權(quán)限。
也可以直接通過發(fā)出INSERT語句增加同樣的用戶存取信息,然后告訴服務(wù)器再次裝入授權(quán)表:
shell> mysql --user=root mysql
mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('something'),
'Y','Y','Y
關(guān)鍵字:MySQL、主機(jī)、數(shù)據(jù)庫
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解