一個MySQL系統可能有許多用戶。爲了安全起見,root用戶一般只用管理目的。對於每一個須要使用該系統的用戶,應該爲他們建立一個帳號和密碼。這些用戶名和密碼沒必要與MySQL以外的用戶名稱和密碼(例如,Linux或NT用戶名和密碼)相同。一樣的原則也適合於root用戶。對於系統用戶和MySQL用戶最好使用不一樣的密碼,這一點對root用戶尤爲應該這樣。
爲用戶設置密碼不是必須的,可是強烈建議爲全部建立的用戶設定密碼。要創建一個Web數據庫,最好爲每一個網站應用程序創建一個用戶。你可能會問,「爲何要這麼作呢?」----答案在於權限。sql
咱們的MySQL的用戶,都被記錄在了mysql數據庫的user表中,以下圖:數據庫
在MySQL數據庫中,一個完整的用戶帳號應該包含用戶名和登陸主機,也就是說 用戶名@主機名
纔是一個完整的用戶帳號。安全
建立用戶基本語法:服務器
CREATE USER 用戶名@主機名 IDENTIFIED BY '密碼';
刪除用戶基本語法:ide
DROP USER 用戶名@主機名;
修改用戶密碼:性能
- 修改本身的密碼 set password = password('新密碼'); - 修改別人的密碼(須要有該權限) set password for 用戶名@主機名 = password('新密碼');
MySQL的最好特性之一是支持複雜的權限系統。權限
是對特定對象執行特定操做的權力,它與特定用戶相關。其概念很是相似於文件的權限。擋在MySQL中建立一個用戶時,就賦予了該用戶必定的權限,這些權限指定了用戶在本系統中能夠作什麼和不能夠作什麼。網站
最少權限原則能夠用來提升任何計算機系統的安全性。它是一個基本的、但又是很是重要的並且容易爲咱們忽略的原則。該原則包含以下內容:加密
一個用戶(或一個進程)應該擁有可以執行分配給他的任務的最低級別的權限。線程
該原則一樣適用於MySQL,就像它應用於其餘地方同樣。例如,要在網站上運行查詢,用戶並不須要root用戶所擁有的全部權限。所以,咱們應該建立另外一個用戶,這個用戶只有訪問咱們剛剛創建的數據庫的必要權限。
GRANT和REVOKE命令分別用來授予和取消MySQL用戶的權限,這些權限分4個級別。它們分別是:
GRANT命令用來建立用戶並賦予他們權限。GRANT命令的常見形式是:
GRANT privileges [columns] ON item TO user_name [IDENTIFIED BY 'password'] [REQUIRE ssl_options] [WITH [GRANT OPTION | limit_options]]
普通寫法能夠簡略以下:
GRANT 權限列表 ON 數據庫.表 TO 用戶名@主機名 [IDENTIFIED BY '密碼'];
identified by能夠省略,也能夠寫出
(1)若是寫了,用戶存在,就是修改用戶的密碼
(2)若是寫了,該用戶不存在,就是建立用戶,同時指定密碼
方括號內的子句是可選的。在本語法中,出現了許多佔位符。第一個佔位符是 privileges
,應該是由逗號分開的一組權限。MySQL已經有一組已定義的權限。它們在下一節詳細介紹。
佔位符 columns
是可選的。能夠用它對每個列指定權限。也可使用單列的名稱或者逗號分開的一組列的名稱。
佔位符 item
是新權限的所應用於的數據庫或表。能夠將項目指定爲「.」,而將權限應用於全部數據庫。這叫作賦予全局權限。若是沒有使用在特定的數據庫,也能夠經過只指定*完成賦予全局權限。更常見的是,以dbname.*的形式指定數據庫中全部的表,以dbname.tablename的形式指定單個表,或者經過指定tablename來指定特定的列。這些分別表示其餘3個能夠利用的權限:數據庫、表、列。若是在輸入命令的時候正在使用一個數據庫,tablename自己將被解釋成當前數據庫中的一個表。
user_name
應該是用戶登陸MySQL所使用的用戶名。請注意,它沒必要與登陸系統時所使用的用戶名相同。MySQL中的user_name也能夠包含一個主機名。能夠用它來區分如itbsl(解釋成itbsl@localhost)和itbsl@somewhere.com。這是很是有用的一項能力,由於來自不一樣域的用戶常常可能使用同一個名字。這也提升了安全性能,由於能夠指定用戶從什麼地方鏈接到本機,甚至能夠指定它們在特定的地方能夠訪問那些表和數據庫。
password
應該是用戶登陸時使用的密碼。常見的密碼選擇規則在這裏都適用。咱們後面將更詳細地講述安全問題,可是密碼應該不容易被猜出來。這意味着,密碼不該該是一個字段單詞或與用戶名相同。理想的密碼應該是大、小寫字母和非字母的組合。
REQUIRE
子句容許指定用戶是否必須經過加密套接字鏈接,或者指定其它的SSL選項,關於SSL到MySQL鏈接的更多信息,請參閱MySQL手冊。
WITH GRANT OPTION
選項,若是指定,表示容許指定的用戶向別人授予本身所擁有的權限。
咱們也能夠指定以下所示的WITH子句:
MAX_QUERIES_PER_HOUR n
或者
MAX_UPDATES_PER_HOUR n
或者
MAX_CONNECTIONS_PER_HOUR n
這些子句能夠指定每一個用戶每小時執行的查詢、更新和連接的數量。在共享的系統上限制單個用戶的負載時,這些子句是很是有用的。
權限存儲在名爲mysql的數據庫中的5個系統中。這些表分別是mysql.user、mysql.db、mysql.host、mysql.tables_priv和mysql.columns_priv。做爲GRANT命令的替代,能夠直接修改這些表。
MySQL中存在3個基本類型的權限:適用於賦予通常用戶的權限、適用於賦予管理員的權限和幾個特定的權限。任何用戶均可以被賦予這3類權限,可是根據最少權限原則,最好嚴格限定只將管理員類型的權限賦予管理員。
咱們應該只賦予用戶訪問他們必須使用的數據庫和表的權限。而不該該將訪問mysql的權限賦予不是管理員的人。mysql數據庫是全部用戶名、密碼等信息存儲的地方。
常規用戶的權限直接與特定的SQL命令類型以及用戶是否被容許運行它們相關。下表所示的是基本用戶權限。「應用於」列下面的對象給出了該類型權限能夠授予的對象。
用戶的權限
權限 | 應用於 | 描述 |
---|---|---|
SELECT |
表、列 | 容許用戶從表中查詢行(記錄) |
INSERT |
表、列 | 容許用戶在表中插入新行 |
UPDATE |
表、列 | 容許用戶修改現存表裏行中的值 |
DELETE |
表 | 容許用戶刪除現存表的行 |
INDEX |
表 | 容許用戶建立和拖動特定表索引 |
ALTER |
表 | 容許用戶改變現存表的結構,例如,可添加列、重命名列或表、修改列的數據類型 |
CREATE |
數據庫、表 | 容許用戶建立新數據庫或表。若是在GRANT中指定了一個特定的數據庫或表,它們只可以建立該數據庫或表,即它們必須首先刪除(drop)它 |
DROP |
數據庫、表 | 容許用戶拖動(刪除)數據庫或表 |
從系統的安全性方面考慮,適於常規用戶的權限大多數是相對無害的。ALTER權限經過重命名錶可能會影響權限系統,可是大多數用戶須要它。安全性經常是可用性與保險性的折中。遇到ALTER的時候,應當作出本身的選擇,可是一般仍是會將這個權限授予用戶。
下面的表給出了適用於管理員用戶使用的權限。
能夠將這些權限授予非管理員用戶,這樣作的時候要很是當心。
FILE權限有些不一樣,它對普通用戶很是有用,由於它能夠將數據從文件載入數據庫,從而能夠節省許多時間,不然,每次將數據輸入數據庫都須要從新輸入,這很浪費時間。
然而,文件載入能夠用來載入MySQL可識別的任何文件,包括屬於其餘用戶的數據庫和潛在的密碼文件。授予該權限的時候須要當心,或者本身爲用戶載入數據。
管理員權限
權限 | 描述 |
---|---|
CREATE TEMPORARY TABLES |
容許管理員在CREATE TABLE語句中使用TEMPORARY關鍵字 |
FILE |
容許將數據從文件讀入表,或從表讀入文件 |
LOCK TABLES |
容許使用LOCK TABLES語句 |
PROCESS |
容許管理員查看屬於全部用戶的服務器進程 |
RELOAD |
容許管理員從新載入受權表、清空受權、主機、日誌和表 |
REPLICATION CLIENT |
容許管理員從新載入受權表、和從機(Slave)上使用SHOW STATUS |
REPLICATION SLAVE |
容許複製從服務器鏈接到主服務器 |
SHOW DATABASES |
容許使用SHOW DATABASES語句查看全部數據庫列表。沒有這個權限,用戶只能看到他們可以看到的數據庫 |
SHUTDOWN |
容許管理員關閉MySQL服務器 |
SUPER |
容許管理員關閉屬於任何用戶的的線程 |
特別的權限
權限 | 描述 |
---|---|
ALL |
授予上面兩個表列表的全部權限。也能夠將ALL寫成ALL PRIVILEGES |
USAGE |
不授予權限。這建立一個用戶並容許他登陸,可是不容許進行任何操做。一般會在之後授予該用戶更多的權限 |
與GRANT相反的命令是REVOKE。它用來從一個用戶收回權限。在語法上與GRANT很是類似:
REVOKE privileges [(columns)] ON item FROM user_name
中文翻譯:
REVOKE 權限列表 ON 數據庫.對象 FROM 用戶名@主機名;
若是已經給出了WITH GRANT OPTION子句,能夠按以下方式撤銷它(以及全部其餘權限):
REVOKE ALL PRIVILEGES, GRANT FROM user_name
當咱們修改用戶權限以後,若是想不重啓當即生效,須要執行如下flush privileges
,這樣能快速刷新權限
FULSH PRIVILEGES;
要建立一個管理員,能夠輸入以下所示的命令:
grant all on * to fred identified by 'mnb123' with grant option;
以上命令授予了用戶名爲fred、密碼爲mnb123的用戶使用全部數據庫的全部權限,並容許他向其餘人授予這些權限。
若是不但願用戶在系統中存在,能夠按以下方式撤銷:
revoke all privileges, grant from red;
如今,咱們能夠按以下方式建立一個沒有任何權限的常規用戶:
grant usage on books.* to sally identified by 'magic123';
在與sally交談後,咱們對她須要進行的操做有了必定的瞭解,所以按以下方式能夠授予她適當的權限:
grant select, insert, update, delete, index, alter, create, drop on books.* to sally;
請注意,要完成這些,並不須要指定sally密碼。
若是咱們認爲sally權限太高,可能會決定按以下方式減小一些權限:
revoke alter, create, drop on books.* from sally;
後來,當她再也不須要使用數據庫時,能夠按以下方式撤銷全部的權限:
revoke all on books.* from sally;
參考資料:
TN DATA
PHP和MySQL Web開發(第四版)