MySQL權限管理

設置用戶與權限

一個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中建立一個用戶時,就賦予了該用戶必定的權限,這些權限指定了用戶在本系統中能夠作什麼和不能夠作什麼。網站

最少權限原則

最少權限原則能夠用來提升任何計算機系統的安全性。它是一個基本的、但又是很是重要的並且容易爲咱們忽略的原則。該原則包含以下內容:加密

一個用戶(或一個進程)應該擁有可以執行分配給他的任務的最低級別的權限。線程

該原則一樣適用於MySQL,就像它應用於其餘地方同樣。例如,要在網站上運行查詢,用戶並不須要root用戶所擁有的全部權限。所以,咱們應該建立另外一個用戶,這個用戶只有訪問咱們剛剛創建的數據庫的必要權限。

建立用戶:GRANT命令

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 不授予權限。這建立一個用戶並容許他登陸,可是不容許進行任何操做。一般會在之後授予該用戶更多的權限

REVOKE命令

與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和REVOKE的例子

要建立一個管理員,能夠輸入以下所示的命令:

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開發(第四版)

相關文章
相關標籤/搜索