數據庫服務器通常包含着關鍵的數據,所以為了確保這些數據的安全和完整需要要利用訪問控制。
MySQL服務器的安全基礎是:用戶應該對他們需要的數據具有適當的訪問權,既不能多也不能少(即用戶不能對過多的數據具有訪問權)
訪問控制:需要給用戶提供他們所需的訪問權,且僅提供他們所需的訪問權。
管理訪問控制需要創建和管理用戶賬號
如:
1、多數用戶只需要對表進行讀和寫,但少數用戶甚至需要能創建和刪除表
2、某些用戶需要讀表,但可能不需要更新表
3、你可能想允許某些用戶添加數據,但不允許他們刪除數據
4、某些用戶(管理員)可能需要處理用戶賬號的權限,但多數用戶可能不需要
5、你可能想讓用戶通過存儲過程訪問數據,但不允許他們直接訪問數據
6、你可能根據用戶登錄的地點限制對某些功能的訪問
MySQL Administrator 提供了一個圖形用戶界面,用來管理用戶及賬號權限。本文使用語句進行操作
最開始安裝時為了操作數據庫,需要登陸MySQL,創建一個名為root用戶賬號,使它對整個MySQL 服務器具有完全的控制,之前的操作也是依賴於此賬號,你一個人怎么弄都行,但是要是實際使用的話,應該創建一系列的賬號,有的用於管理,有的用於用戶、開發等等
注意:
1、訪問控制的目的不僅僅是防止用戶的惡意企圖,更常見的是防止無意識的操作錯誤,通過保證用戶不能執行他們不應該執行的語句,有利於維護數據的安全,
2、要嚴肅對來root 登錄使用,僅在絕對需要的時候使用它
管理用戶
One、查看用戶
MySQL用戶賬號和信息存儲在名為mysql 的數據庫,一般不需要直接訪問mysql 數據庫和表,但有時需要直接訪問
需要直接訪問它的時機之一是在需要獲得所有用戶賬號列表時
-- 使用名為mysql 的數據庫 use mysql; -- 查看有哪些用戶 select user from user;
從中可以看出,mysql 數據庫中有一個名為user 的表,它包含所有的用戶賬號,
user表中有一個名為user 的列,它存儲用戶登錄名。新安裝的一般就一個root 用戶
試驗對用戶賬號和權限進行更改的最好方法就是打開多個數據庫客戶機(如mysql命令行實用程序的多個副本),作為一個管理登錄,其他作為被測試的用戶登陸
Two、創建用戶賬號(並指定密碼)
cretae user 創建一個新用戶賬號,在創建用戶賬號時不一定需要口令(即密碼),指定口令時使用 IDENTIFIED BY 進行指定
-- create user 用戶名 identified by 密碼 create user obge identified by 'password123';
這個表有 45行,有很多是一些其訪問權限的控制
驗證一下有沒有,創建成功
注意:
1、identified by 指定的口令為純文本,MySQL將在保存到user 表之前對其加密,為了作為散列值指定口令使用 IDENTIFIED BY PASSWORD
IDENTIFIED BY PASSWORD
2、GRANT 語句也可以用於創建用戶賬號,但一般使用CREATE USER ,因為create user 語句最為清楚和簡單,也可以使用insert語句進行增加不過一般不建議,因為MySQL用來存儲用戶賬號信息的表(以及表模式等)極為重要,對他們的任何毀壞都有可能嚴重的傷害到MySQL服務器,因此相對於直接處理來說,最好是用標記和函數來處理這些表。
Three、重命名用戶名 (RENAME)
-- RENAME USER 原來的名字 TO 現在的 rename user obge to boge;
注意:僅在MySQL 5 或之后的版本支持上述語句(rename user),之前是通過 update語句進行更新
Four、更改口令
使用 SET PASSWORD ,新的口令必須加密
主要分為兩種,一種是給指定的用戶設置密碼,另一種是自己設置自己的密碼
-- 給 obge 這個用戶更改密碼 set password for obge = password('pwdobge'); -- 更新當前登陸用戶的密碼,不需要指定用戶 set password = password('rootobge');
注意:SET PASSWORD 更新用戶口令時,新的口令必須傳遞到Password()函數中進行加密
Five、刪除用戶賬號(DROP)
為了刪除一個用戶賬號(以及相關的權限),使用 DROP USER 用戶名
-- 刪除名為 boge 的用戶 drop user boge;
注意:MySQL 5 或之后的版本可以通過 drop user 來刪除用戶賬號和所有相關的賬號權限,但是之前的版本,使用drop user 語句只能刪除用戶賬號,不能刪除賬號權限,還要先借助 REVOKE刪除與賬號相關的權限,然后在使用drop user 刪除賬號。
Six、設置訪問權限(GRANT)
在創建用戶賬號后必須接着分配訪問權限。因為新創建的用戶賬號沒有訪問權限,雖然可以登陸MySQL但不能看到數據,不能執行任何數據操作。
1、查看賦予用戶賬號的權限
-- SHOW GRANTS FOR 用戶賬號名 show grants for obge;
上述中, USAGE ON *.* 表示沒有權限,與之相對的是 ALL PRIVILEGES ON *.* 與所有權限。
而 GRANT USAGE ON *.* TO 'obge'@'%' 就可以理解為,在任意數據庫和任意表上對任何東西沒有權限。
MySQL 的權限使用: 用戶名和主機名結合定義(user@host),
如果不指定主機名,則使用默認的主機名%授予用戶訪問權限而不管主機名
2、使用 grant 語句進行設置權限
設置時需要至少提供:要授予的權限,被授予訪問權限的數據庫或表以及 用戶名
如:設置 obge 這個用戶只可以查詢 bookstu 這個數據庫的所有表
-- GRANT SELECT ON 數據庫名.* TO 用戶名 grant select on bookstu.* to obge;
上述 grank 允許 用戶在bookstu 數據庫的所有表(bookstu.*)上使用 select,通過只授予select 訪問權限,用戶 obge ,對bookstu 這個數據庫中的所有數據具有只讀權限。
登陸測試一下
3、撤銷特定的權限(REVOKE)
-- REVOKE 設置的權限 from 用戶名 revoke insert on bookstu.archive_orders from obge;
撤銷用戶obge 對 bookstu.archive_orders 的增加權限
注意: 被撤銷的訪問權限必須存在否則會報錯
4、GRANT 與 REVOKE
4.1、grant 與revoke 可在以下幾個層次進行控制訪問權限
a、整個服務器,使用GRANT ALL 和 REVOKE ALL
b、整個數據庫,使用 ON database.*
c、特定的表,使用ON databse.table
d、特定的列
e、特定的存儲過程
4.2、可以授予和撤銷的每個權限
使用 grant 和revoke 結合表中列出的權限,可以完全控制用戶對數據做什么事情和不能做什么事情。
注意‘:
1、在使用grant和 revoke時,用戶賬號必須存在,但對所涉及的對象沒有這個要求。這允許管理員在創建數據和表之前設計和實現安全措施,但是這樣做的副作用是當某個數據庫或表被刪除時,相關的訪問權限依然存在,而且將來重新創建該數據庫或表時,這些權限依然起作用,所以建議,在設置權限時對那些存在的數據庫和表進行設置表
2、可以通過列出各個權限並用逗號分隔,將多條grant 語句串在一起
-- 允許obge 對 bookstu 數據庫中的表執行 增加和查看操作 grant select、insert on bookstu.* to obge;