摘要: 本篇博客僅做爲筆記,若有侵權,請聯繫,當即刪除(網上找博客學習,而後手記筆記,因紙質筆記不便保存,因此保存到網絡筆記)。mysql
數據庫服務器一般包含關鍵的數據,確保這些數據的安全和完整須要利用訪問控制。本博將學習MySQL的訪問控制和用戶管理。sql
1、訪問控制數據庫
MySQL服務器的安全基礎是:用戶應該對他們須要的數據具備適當的訪問權,既不能多也不能少。換句話說,用戶不能對過多的數據具備過多的訪問權。安全
考慮如下內容:服務器
(1)多數用戶只須要對錶進行讀和寫,但少數用戶甚至須要能建立和刪除表網絡
(2)某些用戶須要讀表,但可能不須要更新表;函數
(3)你可能想容許用戶添加數據,但不容許他們刪除數據;學習
(4)某些用戶(管理員)可能須要處理用戶帳號的權限,但多數用戶不須要;測試
(5)你可能想讓用戶經過存儲過程訪問數據,但不容許他們直接訪問數據;加密
(6)你可能想根據用戶登陸的地點限制對某些功能的訪問。
這些都只是例子,但有助於說明一個重要的事實,即你須要給用戶提供他們所需的訪問權,且僅提供他們所需的訪問權。這就是所謂的訪問控制,管理訪問控制須要建立和管理用戶帳號。
注意:使用MySQL Administrator MySQL Administrator提供了一個圖形用戶界面,可用來管理用戶及帳號權限。MySQL Administrator在內部利用本博介紹的語句,使你能交互地、方便地管理訪問控制。
回憶一下前面的博客內容,咱們知道,爲了執行數據庫操做,須要登陸MySQL。MySQL建立一個名爲root的用戶帳號,它對整個MySQL服務器具備徹底的控制。你可能已經在本書各章的學習中使用root進行過登陸,在對非現實的數據庫試驗MySQL時,這樣作很好。不過在現實世界的平常工做中,決不能使用root。應該建立一系列的帳號,有的用於管理,有的供用戶使用,有的供開發人員使用,等等。
注意:防止無心的錯誤 重要的是注意到。訪問控制的目的不只僅是防止用戶的惡意企圖。數據夢魘更爲常見的是無心識錯誤的結果,如打錯MySQL語句,在不適合的數據庫中操做或其餘一些用戶錯誤。經過保證用戶不能執行它們應該執行的語句,訪問控制有助於避免這些狀況的發生。
不要使用root 應該嚴肅對待root登陸的使用。僅在絕對須要時使用它(或許在你不能登陸其餘管理帳號時使用)。不該該在平常的MySQL操做中使用root。
2、管理用戶
MySQL用戶帳號和信息存儲在名爲mysql的MySQL數據庫中。通常不須要直接訪問mysql數據庫和表(你稍後會明白這一點),但有時須要直接訪問。須要直接訪問它的時機之一是在須要得到全部用戶帳號列表時。爲此,可以使用如下代碼:
USE mysql; SELECT user FROM user;
分析:mysql數據庫有一個名爲user的表,它包含全部用戶帳號。user表有一個名爲user的列,它存儲用戶登陸名。新安裝的服務器可能只有一個用戶(如這裏所示),過去創建的服務器可能具備不少用戶。
注意:用多個客戶機進行試驗 試驗對用戶帳號和權限進行更改的最好辦法是打開多個數據庫客戶機(如mysql命令行實用程序的多個副本),一個做爲管理登陸,其餘做爲被測試的用戶登陸。
一、建立用戶帳號
爲了建立一個新用戶帳號,使用CREATE USER語句,以下所示:
CREATE USER ben IDENTIFIED BY 'p@$$wOrd';
CREATE USER建立一個新用戶帳號。在建立用戶帳號時不必定須要口令,不過這個例子用IDENTIFIED BY 'p@$$wOrd'給出了一個口令。
若是你再次列出用戶帳號,將會在輸出中看到新帳號。
注意:指定散列口令 IDENTIFIED BY指定的口令爲純文本,MySQL將在保存到user表以前對其進行加密。爲了做爲散列值指定口令,使用IDENTIFIED BY PASSWORD。
使用GRANT或INSERT GRANT語句(稍後介紹)也能夠建立用戶帳號,但通常來講CREATE USER是最清楚和最簡單的句子。此外,也能夠經過直接插入行到user表來增長用戶,不過爲安全起見,通常不建議這樣作。MySQL用來存儲用戶帳號信息的表(以及表模式等)極爲重要,對它們的任何毀壞均可能嚴重地傷害到MySQL服務器。所以,相對於直接處理來講,最好是用標記和函數來處理這些表。
爲從新命名一個用戶帳號,使用RENAME USER語句,以下所示:
RENAME USER ben TO bforta;
注意:MySQL 5以前 僅MySQL 5或以後的版本支持RENAME USER。爲了在之前的MySQL中重命名一個用戶,可以使用UPDATE直接更新user表。
二、刪除用戶帳號
爲了刪除一個用戶帳號(以及相關權限),使用DROP USER語句,以下所示:
DROP USER bforta;
注意:MySQL 5以前 自MySQL 5以來,DROP USER刪除用戶帳號和全部相關的帳號權限。在MySQL 5之前,DROP USER只能用來刪除用戶帳號,不能刪除相關的權限。所以,若是使用舊版本的MySQL,須要先用REVOKE刪除與帳號相關的權限,而後再用DROP USER刪除帳號。
三、設置訪問權限
在建立用戶帳號後,必須接着分配訪問權限。新建立的用戶帳號沒有訪問權限。它們能登陸MySQL,但不能看到數據,不能執行任何數據庫操做。
爲看到賦予用戶帳號的權限,使用SHOW GRANTS FOR,以下所示:
SHOW GRANTS FOR bforta;
分析:輸出結果顯示用戶bforta有一個權限USAGE ON *.*。USAGE表示根本沒有任何權限,因此,此結果表示在任意數據庫和任意表上對任何東西沒有權限。
注意:用戶定義爲user@host MySQL的權限用用戶名和主機名結合定義。若是不指定主機名,則使用默認的主機名%(授予用戶訪問權限而無論主機名)。
爲設置權限,使用GRANT語句。GRANT要求你至少給出如下信息:
(1)要授予的權限;
(2)被授予訪問權限的數據庫或表;
(3)用戶名。
如下例子給出GRANT的用法:
GRANT SELECT ON crashcourse.* TO bforta;
分析:此GRANT容許用戶在crashcourse.*(crashcourse數據庫的全部表)上使用SELECT。經過只授予SELECT訪問權限,用戶bforta對crashcourse數據庫中的全部數據具備只讀訪問權限。
SHOW GRANTS反映這個更改:
SHOW GRANTS FOR bforta;
分析:每一個GRANT添加(或更新)用戶的一個權限。MySQL讀取全部受權,並根據它們肯定權限。
GRANT的反操做爲REVOKE,用它來撤銷特定的權限。下面舉一個例子:
REVOKE SELECT ON crashcourse.* FROM bforta;
分析:這條REVOKE語句取消剛賦予用戶bforta的SELECT訪問權限。被撤銷的訪問權限必須存在,不然會出錯。
GRANT和REVOKE可在幾個層次上控制訪問權限:
(1)整個服務器,使用GRANT ALL和REVOKE ALL;
(2)整個數據庫,使用ON database.*;
(3)特定的表,使用ON database.table;
(4)特定的列;
(5)特定的存儲過程。
下表列出能夠授予或撤銷的每一個權限。
ALL | 除GRANT OPTION外的全部權限 |
ALTER | 使用ALTER TABLE |
ALTER ROUTINE | 使用ALTER PROCEDURE和DROP PROCEDURE |
CREATE | 使用CREATE TABLE |
CREATE ROUTINE | 使用CREATE PROCEDURE |
CREATE TEMPORARY TABLES | 使用CREATE TEMPOTATY TABLE |
CREATE USER | 使用CREATE USER、DROP USER、RENAME USER和REVOKE ALL PRIVILEGES |
CREATE VIEW | 使用CREATE VIEW |
DELETE | 使用DELETE |
DROP | 使用DROP TABLE |
EXECUTE | 使用CALL和存儲過程 |
FILE | 使用SELECT INTO OUTFILE和LOAD DATA INFILE |
GRANT OPTION | 使用GRANT和REVOKE |
INDEX | 使用CREATE INDEX和DROP INDEX |
INSERT | 使用INSERT |
LOCK TABLES | 使用LOCK TABLES |
PROCESS | 使用SHOW FULL PROCESSLIST |
RELOAD | 使用FLUSH |
REPLICATION CLIENT | 服務器位置的訪問 |
REPLICATION SLAVE | 由複製從屬使用 |
SELECT | 使用SELECT |
SHOW DATABASES | 使用SHOW DATABASES |
SHOW VIEW | 使用SHOW CREATE VIEW |
SHUTDOWN | 使用mysqladmin shutdown(用來關閉MySQL) |
SUPER | 使用CHANGE MASTER、KILL、LOGS、PURGE、MASTER和SET GLOBAL。還容許mysqladmin調試登陸 |
UPDATE | 使用UPDATE |
USAGE | 無訪問權限 |
權限 | 說明 |
使用GRANT和REVOKE,再結合表中列出的權限,你能對用戶能夠就你的寶貴數據作什麼事情和不能作什麼事情具備徹底的控制。
注意:將來的受權 在使用GRANT和REVOKE時,用戶帳號必須存在,但對所涉及的對象沒有這個要求,這容許管理員在建立數據庫和表以前設計和實現安全措施。
這樣作的反作用是,當某個數據庫或表被刪除時(用DROP語句),相關的訪問權限仍然存在。並且,若是未來從新建立該數據庫或表,這些權限仍然起做用。
簡化屢次受權 可經過列出個權限並用逗號分隔,將多條GRANT語句串在一塊兒,以下所示:
GRANT SELECT,INSERT ON crashcourse.* TO bforta;
四、更改口令
爲了更改用戶口令,可以使用SET PASSWORD語句。新口令必須以下加密:
SET PASSWORD FOR bforta = Password('n3w p@&&word';)
分析:SET PASSWORD更新用戶口令。新口令必須傳遞到Password()函數進行加密。
SET PASSWORD還能夠用來設置你本身的口令:
SET PASSWORD = Password('n3w p@&&word');
分析:在不指定用戶名時,SET PASSWORD更新當前登陸用戶的口令。
3、小結
本博學習了經過賦予用戶特殊的權限進行訪問控制和保護MySQL服務器。