一、 MySQL訪問控制
MySQL的訪問分兩個階段:
1. 檢查用戶是否具有建立與MySQL的連接的權利,主要依靠檢查:用戶名、主機名和密碼;
2. 建立了連接後,服務器檢查客戶端發出的每個請求。看是否有足夠的權限實施它。例如執行select命令等。 1. MySQL訪問權限管理通過6個表:user、db、host、tables_priv、columns_priv和procs_priv來控制,6個表的作用如下表:表名 含義
user 控制“用戶名”(user)可以從哪一台“主機名”(host)訪問MySQL Db 規定哪個用戶可以訪問哪個數據庫
Host host表與db表結合使用在一個較好層次上控制特定主機對數據庫的訪問權限
Tables_priv 規定誰可以訪問數據庫的哪一個表
columns_priv 規定誰可以訪問表的哪一個列
procs_priv 規定誰可以執行哪個存儲過程 2. MySQL識別的權限如下表:
MySQL權限 對應權限列 含義 Select Select_priv 是否可以讀取表的數據
Insert Insert_priv 是否可以向表中插入新的記錄
delete Delete_priv 是否可以刪除表中現有記錄
Update Update_priv 是否可以更新表中現有記錄
Lock tables Lock_tables_priv 是否可以鎖定表 Create Create_priv 是否可以創建一個新的數據庫和數據表
Create temporary table Create_tmp_table_priv 是否可以創建臨時表
Alter Alter_priv 是否可以重命名並改變它的結構
Index Index_priv 是否可以添加或刪除表索引
References References_priv 暫不用
Drop Drop_priv 是否可以刪除現有的數據庫或表
Create view Create_vIEw_priv 是否可以創建視圖
Show view Show_vIEw_priv 是否是可以檢查視圖定義 Alter routine Alter_routine_priv 是否改變現有的存儲過程
Create routine Create_routine_priv 是否可以定義新的存儲過程
Execute Execute_priv 是否可以執行存儲過程 File File_priv 是否可以讀取和改變本地文件系統的文件
Create user Create_user_priv 是否可以創建新用戶
用於MySQL管理
Grant option Grant_priv 是否可以賦予其他用戶個人的權限
Show databases Show_db_priv 是否可以看到一份全體數據庫的清單
Process Process_priv 是否可以看淡到其他用戶的MySQL進程
Super Super_priv 是否可以終止其他用戶的MySQL進程(kill)
Reload Reload_priv 是否可以執行各種命令
Replication client Repl_clIEnt_priv 是否可以決定鏡像系統中參與者的信息
Replication slave Repl_slIEnt_priv 是否可以通過鏡像機制讀取msyql服務器數據
Shoutdown Shutdown_priv 是否可以關閉MySQL 3. 6個數據權限表的結構
user表 db表 host表 tables_priv表 columns_pirv表 proc_priv表 Host Host Host Host Host Host
User Db Db Db Db Db
PassWord User User User User Select_priv Select_priv Select_priv Table_name Table_name Routine_name
Insert_priv Insert_priv Insert_priv Grantor Column_name Routine_type
Update_priv Update_priv Update_priv Timestamp Timestamp Grantor
Delete_priv Delete_priv Delete_priv Table_priv Column_priv Proc_priv
Create_priv Create_priv Create_priv Column_priv Timestamp
Drop_priv Drop_priv Drop_priv
Reload_priv Grant_priv Grant_priv
Shutdown_priv References_priv References_priv
Process_priv Index_priv Index_priv
File_priv Alter_priv Alter_priv
Grant_priv Create_tmp_table_priv Create_tmp_table_priv
References_priv Lock_tables_priv Lock_tables_priv
Index_priv Create_view_priv Create_vIEw_priv
Alter_priv Show_view_priv Show_vIEw_priv
Show_db_priv Create_routine_priv Create_routine_priv
Super_priv Alter_routine_priv Alter_routine_priv
Create_tmp_table_priv Execute_priv Execute_priv
Lock_tables_priv
Execute_priv
Repl_slave_priv
Repl_clIEnt_priv
Create_vIEw_priv
Show_vIEw_priv
Create_routine_priv
Alter_routine_priv
Create_user_priv ssl_type
ssl_cipher
x509_issuer
x509_subject max_questions :規定每個小時之內可以允許執行多少次數據查詢
max_updates :規定每個小時之內可以允許執行多少次數據修改
max_connections :規定每個小時單個用戶可以連接到少此
max_user_connections :規定單個用戶同時連接多少數說明:1).user表中的字段列代表的全局的權限,即一個用戶如果在user表中設置允許某個操作,則該用戶對所有數據庫都可以操作,例如如果給一個用戶授予select,則該用戶對所有數據庫都讀的權限;
2).當user表的全局權限與其他表對象權限都有設置時,有下列關系:
Y(select為例) N(select為例)
Y Y Y
N Y N
3.數據訪問列的內容
3.1、 Host 字段
一個Host列值可以是一個主機名或一個IP地址。可以用通配符指定Host值。可以使用SQL的模式字符“%”和“_”並具有當你在一個查詢中使用LIKE算符同樣的含義(不允許regex算符)。(例如:192.168.3.%匹配任何在192.168.3 C類子網的主機。)
3.2、User 字段
用戶名必須是文字的或空白。一個空白值匹配任何用戶。%作為一個User值不意味著空白,而是匹配一個字面上的%名字,當一個到來的連接通過user表被驗證而匹配的記錄包含一個空白的User值,客戶被認為是一個匿名用戶。
3.3、PassWord字段 3.4、Db字段
在columns_priv和tables_priv表中,Db值必須是真正的數據庫名(照字面上),不允許模式和空白。在db和host中,Db值可以以字面意義指定或使用SQL模式字符'%'或'_'指定一個通配符。一個'%'或空白匹配任何數據庫。
3.5、Table_name,Column_name字段 3.6、MySQL匹配連接關系如下
三、權限分配管理:
1. 權限可分為以下層級:
全局層級:全局權限適用於一個給定服務器中的所有數據庫。這些權限存儲在MySQL.user表中。GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤銷全局權限。
數據庫層級 :數據庫權限適用於一個給定數據庫中的所有目標。這些權限存儲在mysql.db和MySQL.host表中。GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤銷數據庫權限。
表層級:表權限適用於一個給定表中的所有列。這些權限存儲在MySQL.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤銷表權限。
列層級:列權限適用於一個給定表中的單一列。這些權限存儲在MySQL.columns_priv表中。當使用REVOKE時,您必須指定與被授權列相同的列。
子程序層級:CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT權限適用於已存儲的子程序。這些權限可以被授予為全局層級和數據庫層級。而且,除了CREATE ROUTINE外,這些權限可以被授予為子程序層級,並存儲在MySQL.procs_priv表中。
2. 授權管理:根據操作人員的所在職責要求具體操作如下:
2.1:數據庫管理員: 操作:grant all privileges on *.*
by 'passWord' with grant option
2.2:數據庫操作者: 2.2.1授予某個用戶某個表的操作權限:
操作:grant select,update on dbname.tbl_name to
IDENTIFIED by 'passWord'
2.2.2授予某個用戶表的某個字段操作權限:
操作:grant update(column_name) on dbname.tbl_name to
IDENTIFIED by 'passWord'
2.3:數據訪問者: 操作:grant select on dbname.tbl_name
IDENTIFIED by 'passWord'
2.4:執行存儲過程的權限: 操作:grant Execute on dbname.*
IDENTIFIED by 'passWord'
說明:1.創建某個數據庫的某個存儲過程的執行權限操作為:
insert into `procs_priv` (`Host`, `Db`, `User`, `Routine_name`,
`Routine_type`, `Grantor`, `Proc_priv`, `Timestamp`)
values('host','dbname','username','proc_name','PROCEDURE',‘存
儲過程創建者的訪問帳號','Execute,Alter Routine','2007-08-14
17:33:39');
2.mysql的中,root用戶可以執行、修改任何用戶創建的存儲過程; 的存儲過程,則必須要授予MySQL.proc表的選擇權限。(如果某用戶 程的執行權限)
2.5:限制某個帳戶的資源使用: 操作:GRANT ALL ON dbname.*
IDENTIFIED BY 'frank' WITH MAX_QUERIES_PER_HOUR 20
MAX_UPDATES_PER_HOUR 10 MAX_CONNECTIONS_PER_HOUR 5
MAX_USER_CONNECTIONS 2;
說明:WITH MAX_QUERIES_PER_HOUR 20:平均每小時可以執行20次查詢;
MAX_UPDATES_PER_HOUR 10:平均每個小時可以執行20次更新;
MAX_CONNECTIONS_PER_HOUR 5:每小時最大連接用戶數;
MAX_USER_CONNECTIONS 2:單個用戶每小時可連接兩次; 權和資源控制權限一旦授權後存在風險,建議應該只有管理員擁有這些權限
3. MySQL連接匹配關系如下表:
編號 Host值 User值 匹配連接
1 Localhost Root Root用戶,從本地可以連接
2 192.168.1.% Root Root用戶,從192.168.1的子網可以連接
3 192.168.1.2 Root Root用戶,從192.168.1.2的主機可以連接
4 192.168.1.2 空值 任何用戶,從192.168.1.2的主機都可以連接
5 % Root Root用戶,從任何主機都可以連接
6 % 空值 任何用戶,任何主機都可以連接
7 空值 空值 任何用戶,任何主機都可以連接
8 Localhost 空值 任何用戶,從localhost都可以連接
說明: 在連接中如果沒有指定連接參數,MySQL客戶端程序使用默認值:
1. 默認主機名上localhost,默認用戶名在Windows中是odbc,在Linux中是
Linux的登陸名;
2. 如果在MySQL.user表中同時存在編號7、8兩個訪問連接,那麼在當客戶
端的連接參數都為空時,MySQL默認匹配編號為8的連接,如果只存在7,
那麼匹配編號7的連接;
4. 帳戶管理
4.1.給root帳戶和沒有設置密碼的帳戶設置一個強密碼:
操作:SET PASSWORD FOR 'root'= PASSWord('biscuit');
或者:GRANT USAGE ON *.* TO ‘usernmae’ IDENTIFIED BY 'biscuit'
4.2.刪除匿名用戶:
操作:delete from user where user=’’
4.3.刪除host中為%的訪問者:
操作:delete from user where host=’%’