第三節:MySQL的授權和認證詳解(指令+客戶端)


一. 簡介

1. MySQL權限

 權限系統的作用是授予來自某個主機某個用戶可以查詢、插入、修改、刪除等數據庫操作的權限。

(1). 不能明確的指定拒絕某個用戶的連接。

(2). 權限控制(授權與回收)的執行語句包括create user, grant, revoke。

(3). 授權后的權限都會存放在MySQL的內部數據庫中(數據庫名叫mysql),並在數據庫啟動之后把權限信息復制到內存中

(4). MySQL用戶的認證信息不光包括用戶名,還要包含連接發起的主

以下兩個ypf被認為不是同一個用戶:

SHOW GRANTS FOR 'ypf'@'office.example.com’;
SHOW GRANTS FOR 'ypf'@'home.example.com';

2. 權限級別詳解

(1). MySQL權限級別:

 A. 全局性的管理權限,作用於整個MySQL實例級別.

 B. 數據庫級別的權限,作用於某個指定的數據庫上或者所有的數據庫上.

 C. 數據庫對象級別的權限,作用於指定的數據庫對象上(表、視圖等)或者 所有的數據庫對象上.

(2). 權限存儲在mysql庫的user, db, tables_priv, columns_priv, and procs_priv這幾個系統表中,待MySQL實例啟動后就加載到內存中。

(3). 查看root用戶的權限

 

對比root用戶在幾個權限系統表中的數據
• mysql> select * from user where user=‘root’ and host=‘localhost’; ##都是’Y’
• mysql> select * from db where user=‘root’ and host=‘localhost’; ##無記錄
• mysql> select * from tables_priv where host=‘localhost’ and user=‘root’; ##無記錄
• mysql> select * from columns_priv where user=‘root’ and host=‘localhost’; ##無記錄
• mysql> select * from procs_priv where user=‘root’ and host=‘localhost’; ##無記錄

查看 'mysql.sys'用戶的權限。

對比mysql.sys用戶在幾個權限系統表中的數據
• mysql> select * from user where user=‘mysql.sys’ and host=‘localhost’; ##都是’N’
• mysql> select * from db where user=‘mysql.sys’ and host=‘localhost’; ##一條記錄,在sys數據庫上的Trigger_priv字段為’Y’,
• mysql> select * from tables_priv where host=‘localhost’ and user=‘mysql.sys’; ##一條記錄,在sys數據庫的sys_config表上有select權限
• mysql> select * from columns_priv where user=‘mysql.sys’ and host=‘localhost’; ##無記錄
• mysql> select * from procs_priv where user=‘mysql.sys’ and host=‘localhost’; ##無記錄

3. 權限詳解

All/All Privileges權限代表全局或者全數據庫對象級別的所有權限
Alter:權限代表允許修改表結構的權限,但必須要求有create和insert權限配合。如果是rename表名,則要求有alter和drop原表, create和insert新表的權限
Alter routine:權限代表允許修改或者刪除存儲過程、函數的權限
Create:權限代表允許創建新的數據庫和表的權限
Create routine:權限代表允許創建存儲過程、函數的權限
Create tablespace:權限代表允許創建、修改、刪除表空間和日志組的權限
Create temporary tables:權限代表允許創建臨時表的權限
Create user:權限代表允許創建、修改、刪除、重命名user的權限
Create view:權限代表允許創建視圖的權限 
Delete:權限代表允許刪除行數據的權限
Drop:權限代表允許刪除數據庫、表、視圖的權限,包括truncate table命令
Event:權限代表允許查詢,創建,修改,刪除MySQL事件
Execute:權限代表允許執行存儲過程和函數的權限
File:權限代表允許在MySQL可以訪問的目錄進行讀寫磁盤文件操作,可使用的命令包括load data infile,selectinto outfile,load file()函數
Grant option:權限代表是否允許此用戶授權或者收回給其他用戶你給予的權限
Index:權限代表是否允許創建和刪除索引
Insert:權限代表是否允許在表里插入數據,同時在執行analyze table,optimizetable,repair table語句的時候也需要insert權限
Lock:權限代表允許對擁有select權限的表進行鎖定,以防止其他鏈接對此表的讀或寫
Process:權限代表允許查看MySQL中的進程信息,比如執行show processlist,mysqladmin processlist, show engine等命令
Reference:權限是在5.7.6版本之后引入,代表是否允許創建外鍵
Reload:權限代表允許執行flush命令,指明重新加載權限表到系統內存中,refresh命令代表關閉和重新開啟日志文件並刷新所有的表
Replication client:權限代表允許執行show master status,show slave status,showbinary logs命令
Replication slave:權限代表允許slave主機通過此用戶連接master以便建立主從復制關系
Select:權限代表允許從表中查看數據,某些不查詢表數據的select執行則不需要此權限,如Select 1+1Select PI()+2;而且select權限在執行update/delete語句中含有where條件的情況下也是需要的
Show databases:權限代表通過執行show databases命令查看所有的數據庫名
Show view:權限代表通過執行show create view命令查看視圖創建的語句
Shutdown:權限代表允許關閉數據庫實例,執行語句包括mysql admin shutdown Super:權限代表允許執行一系列數據庫管理命令,包括kill強制關閉某個連接命令, change master to創建復制關系命令,以及create/alter/drop server等命令
Trigger:權限代表允許創建,刪除,執行,顯示觸發器的權限
Update:權限代表允許修改表中的數據的權限
Usage:權限是創建一個用戶之后的默認權限,其本身代表連接登錄權限

 例子:創建一個用戶ypf,密碼為123456,並賦予增刪改查的權限。

CREATE USER `ypf`@`%` IDENTIFIED BY '123456';
GRANT Create, Delete, Insert, Update ON *.* TO `ypf`@`%`;

4. 系統權限表詳解

(1).  說明

 權限存儲在mysql庫的user,db, tables_priv, columns_priv, and procs_priv這幾個系統表中,待MySQL實例啟動后就加載到內存中.

 User表:存放用戶賬戶信息以及全局級別(所有數據庫)權限,決定了來自哪些主機的哪些用戶可以訪問數據庫實例,如果有全局權限則意味着對所有數據庫都有此權限。

 Db表:存放數據庫級別的權限,決定了來自哪些主機的哪些用戶可以訪問此數據庫。

 Tables_priv表:存放表級別的權限,決定了來自哪些主機的哪些用戶可以訪問數據庫的這個表。

 Columns_priv表:存放列級別權限,決定了來自哪些主機的哪些用戶可以訪問數據庫表的這個字段。

 Procs_priv表:存放存儲過程和函數級別的權限

(2). User表剖析

   User表和下面的DB表結構類似,都是有很多權限列,有這個權限則為Y,沒有這個權限則為N。另外User表中有幾個特殊的字段:

 A.  Host:可以是主機名或者ipv4/ipv6的地址。Localhost代表本機,127.0.0.1代表ipv4的本機地址,::1代表ipv6的本機地址;Host_name字段允許使用%和_兩個匹配字符,比如’%’代表所有主機,’%.mysql.com’代表來自mysql.com這個域名下的所有主機,‘192.168.1.%’代表所有來自192.168.1網段的主機, ‘’@‘localhost’代表匿名登錄的用戶。

注:這個字段決定了哪些地址可以使用對應的賬號可以訪問mysql服務器,%代表運行所有,通常運行遠程訪問測試期間就是把這個值改為 %。

 B. User: 代表用戶名

 C.  Plugin、password(5.6及之前版本存放密碼)、authentication_string(5.7及以后版本存放密碼)三個字段存放用戶認證信息

 D.  Password_expired:設置成’Y’則表明允許DBA將此用戶的密碼設置成過期而且過期后要求用戶的使用者重置密碼(alter user/set password重置密碼)

 E.  Password_last_changed:作為一個時間戳字段代表密碼上次修改時間,執行create user/alter user/set password/grant等命令創建用戶或修改用戶密碼時此數值自動更新

 F.  Password_lifetime:代表從password_last_changed時間開始此密碼過期的天

 G.   Account_locked:代表此用戶被鎖住,無法使用

如下圖:

 

(3). DB表剖析

  如下圖,表示ypf用戶具有對數據庫【workflow】的 select、insert、delete、create權限。

(4). Tables_priv表剖析

  如下圖,表示ypf用戶對於數據庫【testdb1】中的表【roleinfor】具有delete、create權限; 【userinfor】表具有delete、create權限。

(5). Columns_priv表剖析

  如下圖:表示ypf用戶對於數據中【workflow】中表【f_children】中的列【F_Id】【F_input】具有insert,Update權限。

(6). Procs_priv表剖析

 Routine_type是枚舉類型,代表是存儲過程還是函數,

 Timestamp和grantor兩個字段暫時沒用

 

二. 指令實操

1. 查看用戶權限信息

--查看已經授權給用戶的信息
show grants for 'ypf'@'%';

--查看用戶的其他非授權信息
show create user 'ypf'@'%';

如圖:

 

2. 授權用戶(設置權限)

 使用的是grant指令,如果授權的用戶 xxx@xxx在服務器中不存在,當指令中帶着 identified by xxx 的時候,會先創建該用戶再授權,如果該用戶已經存在,則直接授權,格式如下

--通用格式
-- 權限: all privilege代表所有權限,或者其他權限,比如增刪改查:insert、delete、update、select
-- 目標: '.' 代表作用於整個mysql實例,也可以作用於數據級別、或者表級別等
-- 用戶名:這里需要和Host一塊寫,格式為 xxx@xxx,如果沒有特殊符號,可以不加單引號,但是如果有特殊服務,必須加單引號,比如: ypf@localhost 'ypf'@'%'
-- indentified by 設置密碼
-- with grant option 允許授權和回收
grant
權限 on 目標 to 用戶名 (identified by xxx) (with grant option)


grant
all privileges on *.* to 'root'@'192.168.137.202' identified by '123' with grant option;

以下所有指令都是建立在ypf這個用戶已經創建好的情況下執行的,如果沒有創建,grant指令中必須帶上 identified by xxx 才能創建

(1). 將所有權限授予ypf用戶,並且允許起授權和回收

grant all privileges on *.* to 'ypf'@'%'  with grant option;

(2). 將增刪改查權限賦予ypf用戶操控TestDB1數據庫

GRANT Delete, Insert, Select, Update ON TestDB1.* TO 'ypf'@'%';

(3). 將增刪改查權限賦予ypf用戶操控TestDB1數據庫的T_SysErrorLog表

GRANT Delete, Insert, Select, Update ON TABLE TestDB1.T_SysErrorLog TO ypf@'%';

(4). 其他可以參考:

  https://www.cnblogs.com/crxis/p/7044582.html

補充:mysql權限的生效規則。

 執行Grant,revoke,set password,rename user命令修改權限之后,MySQL會自動將修改后的權限信息同步加載到系統內存中

 如果執行insert/update/delete操作上述的系統權限表之后,則必須再執行刷新權限命令才能同步到系統內存中,刷新權限命令包括:flush privileges / mysqladmin flush-privileges / mysqladmin reload

 如果是修改tables和columns級別的權限,則客戶端的下次操作新權限就會生效

 如果是修改database級別的權限,則新權限在客戶端執行use database命令后生效

 如果是修改global級別的權限,則需要重新創建連接新權限才能生效

 --skip-grant-tables可以跳過所有系統權限表而允許所有用戶登錄,只在特殊情況下暫時使用

3. 創建用戶

(1). 執行create user/grant命令(推薦方式)

方案一: 先創建后授權(先執行create user,后執行 grant)

PS:最終在mysql庫中的user表里添加了一條新數據

-- 創建用戶lmr,密碼為123456
 create user 'lmr'@'%' identified by '123456';
-- 給用戶lmr賦予整個mysql實例級別的所有權限
-- all privilege代表所有權限  with grant option代表可回收
 GRANT ALL PRIVILEGES ON *.* TO 'lmr'@'%' WITH GRANT OPTION;

方案二:直接創建授權用戶(直接執行 grant)

ps:grant命令對應用戶名 xxx@xxx,User表中沒有,則該指令如果帶着indentified by xxx 會在user表里插入一條新數據,這就是為什么可以直接用grant命令創建並授權用戶的原因了。

grant all privileges on *.* to 'lmr2'@'%' identified by '123456' with grant option;

(2). 通過insert語句直接操作MySQL系統權限表.

    即通過insert向mysql庫中的user表中插入數據,麻煩,不推薦。

4. 允許遠程訪問

 允許某個已經存在的用戶可以遠程訪問mysql服務器,本質就是修改User表中的Host字段,比如改為 %,代表允許所有地址訪問即可。

(1). 可以通過grant指令插入一個同名的新用戶

--允許所有ip訪問
grant all privileges on *.* to 'lmr'@'%' identified by '123456' with grant option;

flush privileges; 

(2). 執行update語句

--所有ip
update user set host = '%' where user = 'ypf'; 

--也可以直接插入一條新紀錄 
--刷新生效
flush privileges; 

5. 修改密碼

 本質是修改user表中的authentication字段(或 password字段)。

-- 方案1:通過指令修改root的密碼  (通用)
set password for 'ypf'@'%' = password('123456');

--方案2:通過指令修改root的密碼 (通用)
ALTER USER 'ypf'@'%' IDENTIFIED BY '123456';

--方案3: grant指令 (通用)
GRANT USAGE ON *.* TO 'ypf'@'%' IDENTIFIED BY '123456';

--方案4:直接修改對應表 (mysql5.7 及以上)
update mysql.user set authentication_string = password('123456') where user='root';

-- 直接修改表(mysql5.6 及以下)
update mysql.user set password= password('123456') where user='root';

6. 回收用戶權限 

 主要使用的是revoke指令。

-- 回收ypf用戶在整個mysql實例上的Delete權限
REVOKE Delete ON *.* FROM ypf@'%';

-- 回收ypf用戶對testdb1庫中的t_syserrorlog表的insert權限
REVOKE Insert ON TABLE testdb1.t_syserrorlog FROM ypf@'%';

7. 刪除用戶

 使用drop user指令。

--刪除用戶lmr 
drop user lmr@'%';

7. 設置密碼過期策略

(1). 全局配置,作用於所有密碼,在mysql配置文件中做如下配置。

default_password_lifetime=180  設置180天過期
default_password_lifetime=0  設置密碼不過期

(2). 為每個用戶設置過期策略,會覆蓋上面的全局配置

-- 設置密碼過期時間為90天
ALTER USER 'ypf'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
-- 設置密碼永不過期
ALTER USER 'ypf'@'%' PASSWORD EXPIRE NEVER; 
-- 設置密碼為默認過期策略
ALTER USER 'ypf'@'%' PASSWORD EXPIRE DEFAULT; 
-- 設置密碼馬上過期
ALTER USER 'ypf'@'%' PASSWORD EXPIRE;

8. 設置用戶資源限制

-- 每小時最大查詢數為10,每小時最大更新數為20,每小時最大連接數為30,最大用戶連接數為40
ALTER USER lmr2@'%' WITH
MAX_QUERIES_PER_HOUR 10
MAX_UPDATES_PER_HOUR 20
MAX_CONNECTIONS_PER_HOUR 30
MAX_USER_CONNECTIONS 40;

 注意:如果要取消限制,將對應參數的值改為0即可。

9. 鎖定用戶

 用戶鎖定后,則不能登錄mysql

--默認創建用戶名是不帶鎖的(下面兩句指令等價)
create user abc2@localhost identified by '123456';
create user abc2@localhost identified by '123456' account lock;
--創建用戶名的時候加鎖
create user abc2@localhost identified by '123456' account lock;
--加鎖
alter user 'mysql.sys'@localhost account lock;
--解鎖
alter user 'mysql.sys'@localhost account unlock;

 

 

三. 客戶端實操

  這里主要介紹通過 Navicat Premium 15來操作

1. 新建用戶

2. 配置基礎信息

 用戶名、哪些地址可以訪問、密碼、密碼過期策略。

 

 3. 配置訪問次數

  這里一般不做特殊配置,保持默認即可,也就是不限制。

4. 配置服務器權限

 這里配置的權限是針對整個MySQL實例而言的。比如配置 增刪改查 權限。

 

 4. 配置詳細的權限

 這里指配置 數據庫級別、表級別、列級別、存儲過程級別等的權限,比如配置 表級別的權限。

PS:通常配置DB級別的權限,配置Alter、Create、Insert、Delete、Update、Select權限。

5. 查看對應的語句,保持即可。 

 PS:修改密碼或權限的時候同樣打開上述的可視化界面修改即可。

 

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鵬飛)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 聲     明1 : 如有錯誤,歡迎討論,請勿謾罵^_^。
  • 聲     明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM