歡迎您光臨本站 註冊首頁

如何實現MySQL中的用戶管理

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  MySQL有一套先進的但非標準的安全/授權系統,掌握其授權機制是開始操作MySQL資料庫必須要走的第一步,對於一個熟悉SQL基本操作的人來說,也是MySQL所有的知識中比較難以理解的一個部分。本文通過揭開其授權系統的運作機制,希望大家能夠可以更好地操作和使用這個優秀的資料庫系統。

本文主要參考了MySQL安裝所附的使用手冊第六章中的部分內容。如果有任何疑問,請和我聯繫(lidong@wh.027.net)

1、授權機制的主要作用是什麼?
授權機制的基本作用是給某個主機上的用戶對某個資料庫以select,insert,update和detete的許可權。而其額外的功能還包括是否允許匿名使用資料庫,使用MysQL的一些特定函數,如:LOAD DATA INFILE之類。在這裡請注意,MySQL中的用戶名和Unix系統中的用戶名並沒有什麼關係。雖然許多客戶端程序允許你可以用當前的用戶名進行登錄,但是最標準的做法還是通過--user的選項。

 

2、授權機制是如何進行運作的?
在MySQL中主機和用戶的聯合視為唯一標誌。比如說,在主機1和主機2上的用戶lee實際上是不同的,他們對MySQL的使用許可權也可以是有差別的。而整個授權機制的核心問題就是要解決授予從某個主機上登錄的某個用戶對某個資料庫的使用許可權。你可以通過腳本mysqlaccess測試一個主機上用戶的對資料庫操作的許可權。而所有的授權信息都被存儲在資料庫mysql的user、host和db表中。我們可以通過mysql mysql的指令連接到這個資料庫中,並且通過select * from user(或者db,host)顯示每個數據表中的內容。

user表中所授予的許可權是整個授權機制的基本授權,也就是說,user中的定義對於任何一個用戶+主機來說都是適用的,除非在db表中另外有所定義,因此,對於用戶來說最好是就某個資料庫為基礎進行授權。而host表的主要目的是維護一個「安全」伺服器的列表。而在具體考慮某個用戶/主機對某個資料庫的許可權的的時候,我們還需要研究一下授權機制的的匹配搜索機制:

首先,我們需要介紹一下統配符的概念,統配符包括「%」,其意思為任意(的主機、用戶或者資料庫),而如果一條記錄為空的話,也表示任意的意思。

其次,在授權機制中可以對一個用戶的口令進行加密,而且是必須加密,加密的方法是password('口令'),如果直接填寫口令的話,會導致資料庫無法訪問。

user表中所授予的許可權是整個授權機制的基本授權,也就是說,user中的定義對於任何一個用戶+主機來說都是適用的,除非在db表中另外有所定義,因此,對於用戶來說最好是就某個資料庫為基礎進行授權。而host表的主要目的是維護一個「安全」伺服器的列表。而在具體考慮某個用戶/主機對某個資料庫的許可權的的時候,我們還需要研究一下授權機制的的匹配搜索機制:

首先,我們需要介紹一下統配符的概念,統配符包括「%」,其意思為任意(的主機、用戶或者資料庫),而如果一條記錄為空的話,也表示任意的意思。其次,在授權機制中可以對一個用戶的口令進行加密,而且是必須加密,加密的方法是password('口令'),如果直接填寫口令的話,會導致資料庫無法訪問。

從我們對這三個表的顯示我們可以看到,這三個表中的每一條記錄包含了對於某個用戶的授權情況的描述,MySQL資料庫中幾個相關的授權機制的數據表被搜索的順序為:user,db,host。也就是說,我們將首先首先檢索user數據表,找到第一個匹配的記錄,我們把在user數據表中首先匹配的記錄稱之為Priv;然後搜索db表,獲得相應的授權。如果在db數據表相應記錄中host欄位的為空,並且Priv記錄中主機也被包含在host表的host欄位之中,這樣的話,對於某個user來說,則可以在user表中加入在host表中的一些為「Y」的許可權設定。如果在db表中的host欄位不為空的話,那麼也就不會對該用戶/主機的授權產生什麼影響了。

了解了這一點之後,我們需要討論在各個數據表中的記錄的搜索的優先權的問題,也就是說,怎樣確定第一匹配的記錄,這並不是按照數據表中的記錄的自然先後順序來確定的。在各個數據表內的各條記錄的優先權排列如下:

(1)user表:根據先host后user的順序確定。搜索規則如下:不包含統配符的記錄,包含統配符的記錄,空記錄。而在同樣一個host裡面,繼續按照user來排列,規則和上述的一樣。

(2)db表:檢索的順序根據host欄位確定:不包含統配符的記錄,包含統配符的記錄,空記錄。

(3)host表:檢索的順序根據host欄位確定:不包含統配符的記錄,包含統配符的記錄,空記錄。我們用下面的例子來說明進行匹配搜索的規則:

請記住如果你更改了這些數據表,你必須使用mysqladmin reload使其生效。

下面是演示系統是如何進行搜索的:

+-----------+---------+-
| Host | User | ...
+-----------+---------+-
| % | root | ...
| % | jeffrey | ...
| localhost | root | ...
| localhost | | ...
+-----------+---------+-

搜索的順序應當是:

localhost/root
localhost/any
any/jeffrey
any/root
這樣,如果在localhost的用戶jeffrey要連接資料庫的話,那麼其授權應當根據localhost/「任意」 行所規定的許可權而非「任意」/jeffrey行所規定的許可權,請大家注意這一點,因為如果不合適的配置完全可能會使得你無法正常地使用這個資料庫系統。

我們現在來看一個添加一個用戶的例子:需要添加一名叫做「custom」用戶,他分別從主機'localhost', 'server.domain' 和 'whitehouse.gov'連接到資料庫中,他的口令為「stupid」,對於資料庫'bankaccount'他只想從「localhost」進行訪問,而「customer」資料庫則應當被上述3個主機所訪問。我們通過以下的sql語句來完成其操作。


shell> mysql mysql.
mysql> insert into user (host,user,password)
values('localhost','custom',password('stupid'));
mysql> insert into user (host,user,password)
values('server.domain','custom',password('stupid'));
mysql> insert into user (host,user,password)
values('whitehouse.gov','custom',password('stupid'));

mysql> insert into db
(host,db,user,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
values
('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> insert into db
(host,db,user,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
values
('%','customers','custom','Y','Y','Y','Y','Y','Y');

>3、授權數據表
授權數據表對錶的行操作包括select,insert,update和delete,對錶和資料庫的操作包括create和drop。其它的授權還包括如LOAD DATA INFILE和SELECT INTO OUTFILE和管理命令:shutdown, reload,refresh 和process.三個授權數據表的結構如下所示:

user表
欄位
類型

默認值

Host
char(60)
PRI
""

User
char(16)
PRI
""

Password
char(16)
-
""

Select_priv
enum('N','Y')
-
N

Insert_priv
enum('N','Y')
-
N

Update_priv
enum('N','Y')
-
N

Delete_priv
enum('N','Y')
-
N

Create_priv
enum('N','Y')
-
N

Drop_priv
enum('N','Y')
-
N

Reload_priv
enum('N','Y')
-
N

Shutdown_priv
enum('N','Y')
-
N

Process_priv
enum('N','Y')
-
N

File_priv
enum('N','Y')
-
N


db表
欄位
類型

默認值

Host
char(60)
PRI
""

Db
char(64)
PRI
""

User
char(16)
PRI
""

Select_priv
enum('N','Y')
-
N

Insert_priv
enum('N','Y')
-
N

Update_priv
enum('N','Y')
-
N

Delete_priv
enum('N','Y')
-
N

Create_priv
enum('N','Y')
-
N

Drop_priv
enum('N','Y')
-
N


host 表只有在db的數據項中出現host為空的情況下使用。
欄位
類型

默認值

Host
char(60)
PRI
""

Db
char(64)
PRI
""

Select_priv
enum('N','Y')
-
N

Insert_priv
enum('N','Y')
-
N

Update_priv
enum('N','Y')
-
N

Delete_priv
enum('N','Y')
-
N

Create_priv
enum('N','Y')
-
N

Drop_priv
enum('N','Y')
-
N


在數據表中可以使用統配符號。

4、最常見的Access denied出現錯誤的原因
(1)你是否通過mysql_install_db腳本建立mySQL的授權表,你可以通過mysql -u root進行測試,正確的情況下應該不會發生錯誤。或者,你是否有一個文件為:user.ISD,通常其位置在install_dir/var/mysql/user.ISD。

(2)最初使用的時候你應該使用mysql -u root mysql以存取資料庫,或者以root身份進行操作。

(3)更改了授權之後是否使用了mysqladmin reload進行了更新?

(4)在以測試為目的的時候,你應當選用--without-grant-tables選項啟動mysqld服務,你可以在這時更改授權表的相關內容,也可以用mysqlaccess檢查你的授權是否到位。

(5)沒有使用password("口令")設定了口令,結果也會出現錯誤,在使用-p的選項的時候,注意-ppassword之間沒有空格。

5、如何使得MySQL更加安全?
(1)為每個MySQL用戶使用口令。記住,如果你不加設口令的話,其他人可以通過mysql --user other_user database的方式訪問你的資料庫,在使用MySQL進行檢測的時候系統也會給你相應的警告信息。

(2)不要用root方式啟動MySQL服務。MySQL可以以任何用戶啟動。你可以通過添加一個新用戶的方式來啟動資料庫服務。這也不會對系統造成任何影響,因為MySQL的用戶和Unix的用戶根本來說就使不同的。

(3)不要把'Process_priv','File_priv'等許可權授予任何人。

(4)如果你不信任你的DNS,你應當使用IP來取代主機名。在任何情況下都要小心帶匹佩符的主機名。以下的一些選項可以影響到你的系統的安全:

--secure
顧名思義,可以使系統根加安全,因為它可以檢查IP地址的一致性。(實際連接IP地址和通過解析的IP地址),不過這使得mySQL在防火牆工作的時候很難被防火牆外的人所訪問。
--skip-grant-tables
一般情況下不要使用這個選項,這可以試的任何人不受限制地訪問你的系統。
--skip-name-resolve
不進行主機名的解析。在授權數據表中的所有主機名必須為ip地址或者'localhost'.
--skip-networking
不允許通過網路進行連接。所有的連接必須通過Unix Socket。


[火星人 ] 如何實現MySQL中的用戶管理已經有342次圍觀

http://coctec.com/docs/linux/show-post-74271.html