Mysql 用戶權限管理

1. MySQL 權限介紹

mysql中存在4個控制權限的表,分別爲user表,db表,tables_priv表,columns_priv表,我當前的版本mysql 5.7.22 。html

mysql權限表的驗證過程爲:mysql

  1. 先從user表中的Host,User,Password這3個字段中判斷鏈接的ip、用戶名、密碼是否存在,存在則經過驗證。sql

  2. 經過身份認證後,進行權限分配,按照user,db,tables_priv,columns_priv的順序進行驗證。即先檢查全局權限表user,若是user中對應的權限爲Y,則此用戶對全部數據庫的權限都爲Y,將再也不檢查db, tables_priv,columns_priv;若是爲N,則到db表中檢查此用戶對應的具體數據庫,並獲得db中爲Y的權限;若是db中爲N,則檢查tables_priv中此數據庫對應的具體表,取得表中的權限Y,以此類推。shell

1.1 MySQL 權限級別

分爲: 
全局性的管理權限: 做用於整個MySQL實例級別 
數據庫級別的權限: 做用於某個指定的數據庫上或者全部的數據庫上 
數據庫對象級別的權限:做用於指定的數據庫對象上(表、視圖等)或者全部的數據庫對象上

數據庫

 

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

查看mysql 有哪些用戶:bash

mysql> select user,host from mysql.user;

  

來看root 用戶在權限系統表中的數據ide

mysql> use mysql;
mysql> select * from user where user='root' and host='localhost'\G;  #全部權限都是Y ,就是什麼權限都有
mysql> select * from db where user='root' and host='localhost'\G;  # 沒有此條記錄
mysql> select * from tables_priv where user='root' and host='localhost';  # 沒有此條記錄

mysql> select * from columns_priv where user='root' and host='localhost'; # 沒有此條記錄

mysql> select * from procs_priv where user='root' and host='localhost'; # 沒有此條記錄

  

上面說過:權限的驗證過程函數

 

查看root@’localhost’用戶的權限測試

mysql> show grants for root@localhost;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

  

2. MySQL 權限詳解

  • 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,select … into outfile,load file()函數

  • Grant option權限表明是否容許此用戶受權或者收回給其餘用戶你給予的權限,從新付給管理員的時候須要加上這個權限

  • Index權限表明是否容許建立和刪除索引

  • Insert權限表明是否容許在表裏插入數據,同時在執行analyze table,optimize table,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,show binary logs命令

  • Replication slave權限表明容許slave主機經過此用戶鏈接master以便創建主從複製關係

  • Select權限表明容許從表中查看數據,某些不查詢表數據的select執行則不須要此權限,如Select 1+1, Select PI()+2;並且select權限在執行update/delete語句中含有where條件的狀況下也是須要的

  • Show databases權限表明經過執行show databases命令查看全部的數據庫名

  • Show view權限表明經過執行show create view命令查看視圖建立的語句

  • Shutdown權限表明容許關閉數據庫實例,執行語句包括mysqladmin shutdown

  • Super權限表明容許執行一系列數據庫管理命令,包括kill強制關閉某個鏈接命令, change master to建立複製關係命令,以及create/alter/drop server等命令

  • Trigger權限表明容許建立,刪除,執行,顯示觸發器的權限

  • Update權限表明容許修改表中的數據的權限

  • Usage權限是建立一個用戶以後的默認權限,其自己表明鏈接登陸權限

 

2.1 系統權限表

User表:存放用戶帳戶信息以及全局級別(全部數據庫)權限,決定了來自哪些主機的哪些用戶能夠訪問數據庫實例,若是有全局權限則意味着對全部數據庫都有此權限 
Db表:存放數據庫級別的權限,決定了來自哪些主機的哪些用戶能夠訪問此數據庫 
Tables_priv表:存放表級別的權限,決定了來自哪些主機的哪些用戶能夠訪問數據庫的這個表 
Columns_priv表:存放列級別的權限,決定了來自哪些主機的哪些用戶能夠訪問數據庫表的這個字段 
Procs_priv表:存放存儲過程和函數級別的權限

最重要的仍是user表

 

2.1.1 User和 db 權限表的結構
表名 user db
範圍列 Host Host
  User Db
    User
權限列 Select_priv Select_priv
  Insert_priv Insert_priv
  Update_priv Update_priv
  Delete_priv Delete_priv
  Index_priv Index_priv
  Alter_priv Alter_priv
  Create_priv Create_priv
  Drop_priv Drop_priv
  Grant_priv Grant_priv
  Create_view_priv Create_view_priv
  Show_view_priv Show_view_priv
  Create_routine_priv Create_routine_priv
  Alter_routine_priv Alter_routine_priv
  Execute_priv Execute_priv
  Trigger_priv Trigger_priv
  Event_priv Event_priv
  Create_tmp_table_priv Create_tmp_table_priv
  Lock_tables_priv Lock_tables_priv
  References_priv References_priv
  Reload_priv  
  Shutdown_priv  
  Process_priv  
  File_priv  
  Show_db_priv  
  Super_priv  
  Repl_slave_priv  
  Repl_client_priv  
  Create_user_priv  
  Create_tablespace_priv  
安全專欄 ssl_type  
  ssl_cipher  
  x509_issuer  
  x509_subject  
  plugin  
  authentication_string  
  password_expired  
  password_last_changed  
  password_lifetime  
  account_locked  
資源控制列 max_questions  
  max_updates  
  max_connections  
  max_user_connections  

User權限表結構中的特殊字段:

  • Plugin,authentication_string字段存放用戶認證信息

  • Password_expired設置成’Y’則代表容許DBA將此用戶的密碼設置成過時並且過時後要求用戶的使用者重置密碼(alter user/set password重置密碼)

  • Password_last_changed做爲一個時間戳字段表明密碼上次修改時間,執行create user/alter user/set password/grant等命令建立用戶或修改用戶密碼時此數值自動更新

  • Password_lifetime表明從password_last_changed時間開始此密碼過時的天數

  • Account_locked表明此用戶被鎖住,沒法使用

在mysql 5.7 之前在user表有password 這個字段。

2.1.2 Tables_priv和columns_priv權限表結構
表名 tables_priv columns_priv
範圍列 Host Host
  Db Db
  User User
  Table_name Table_name
    Column_name
權限列 Table_priv Column_priv
  Column_priv  
其餘列 Timestamp Timestamp
  Grantor  

Tables_priv和columns_priv權限值

Table Name Column Name Possible Set Elements
tables_priv Table_priv 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter', 'Create View', 'Show view', 'Trigger'
tables_priv Column_priv 'Select', 'Insert', 'Update', 'References'
columns_priv Column_priv 'Select', 'Insert', 'Update', 'References'
procs_priv Proc_priv 'Execute', 'Alter Routine', 'Grant'
2.1.3 procs_priv權限表結構
Table Name procs_priv
Scope columns Host
  Db
  User
  Routine_name
  Routine_type
Privilege columns Proc_priv
Other columns Timestamp
  Grantor
  • Routine_type是枚舉類型,表明是存儲過程仍是函數

  • Timestamp和grantor兩個字段暫時沒用

系統權限表字段長度限制表

Column Name Maximum Permitted Characters
Host, Proxied_host 60
User, Proxied_user 32
Password 41
Db 64
Table_name 64
Column_name 64
Routine_name 64

權限認證中的大小寫敏感問題

  • 字段user,password,authencation_string,db,table_name大小寫敏感

  • 字段host,column_name,routine_name大小寫不敏感

 

2.2 用戶權限信息管理

2.2.1 查看用戶權限信息

查看MYSQL有哪些用戶

mysql> select user,host from mysql.user;

  

查看已經受權給用戶的權限信息 
例如root

mysql> show grants for root@'localhost';

  

查看用戶的其餘非受權信息

mysql> show create user root@'localhost';

  

 

 

2.2.2 用戶組成

MySQL的受權用戶由兩部分組成: 用戶名和登陸主機名

    • 表達用戶的語法爲’user_name’@’host_name’

    • 單引號不是必須,但若是其中包含特殊字符則是必須的

    • 」@‘localhost’表明匿名登陸的用戶

    • Host_name可使主機名或者ipv4/ipv6的地址。 Localhost表明本機, 127.0.0.1表明ipv4本機地址, ::1表明ipv6的本機地址

    • Host_name字段容許使用%和_兩個匹配字符,好比’%’表明全部主機, ’%.mysql.com’表明 
      來自mysql.com這個域名下的全部主機, ‘192.168.1.%’表明全部來自192.168.1網段的主機

 

 

User值 Host 值 容許的鏈接
'fred' 'h1.example.net' fred,鏈接 h1.example.net
'' 'h1.example.net' 任何用戶,從中鏈接 h1.example.net
'fred' '%' fred,從任何主機鏈接
'' '%' 任何用戶,從任何主機鏈接
'fred' '%.example.net' fred,從example.net域中的任何主機鏈接
'fred' 'x.example.%' fred,從鏈接 x.example.netx.example.com x.example.edu,等; 這可能沒用
'fred' '198.51.100.177' fred,從主機與IP地址鏈接 198.51.100.177
'fred' '198.51.100.%' fred,從198.51.100C類子網中的任何主機鏈接
'fred' '198.51.100.0/255.255.255.0' 與前面的示例相同
2.2.3 修改用戶權限
  • 執行Grant,revoke,set password,rename user命令修改權限以後, MySQL會自動將修改後的權限信息同步加載到系統內存中

  • 若是執行insert/update/delete操做上述的系統權限表以後,則必須再執行刷新權限命令才能同步到系統內存中,刷新權限命令包括: flush privileges/mysqladmin flush-privileges / mysqladmin reload

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

  • 若是是修改database級別的權限,則新權限在客戶端執行use database命令後生效

  • 若是是修改global級別的權限,則須要從新建立鏈接新權限才能生效

  • 若是是修改global級別的權限,則須要從新建立鏈接新權限才能生效 (例如修改密碼)

 

2.2.4 建立 mysql 用戶

有兩種方式建立MySQL受權用戶

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

  2. 經過insert語句直接操做MySQL系統權限表

# 建立finley 這只是建立用戶並無權限
mysql> CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass';
# 把finley 變成管理員用戶
mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'localhost' WITH
GRANT OPTION;
#建立用戶並賦予RELOAD,PROCESS權限 ,在全部的庫和表上
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost' identified by '123456';

# 建立keme用戶,在test庫,temp表, 上的id列只有select 權限
mysql> grant select(id) on test.temp to keme@'localhost' identified by '123456';

  

2.2.4 回收 mysql 權限

經過revoke命令收回用戶權限,回收的時候看一下這個用戶有哪些權限而後回收 
我對admin 用戶作測試

mysql> show grants for admin@'localhost';
mysql> select user,host from mysql.user;
mysql> revoke PROCESS ON *.* FROM admin@'localhost';

 

 

 2.2.5 刪除 mysql 用戶

經過執行drop user命令刪除MySQL用戶 
還能夠經過系統權限表刪除(不建議)

mysql> drop user admin@'localhost';

  

2.2.6 設置MySQL用戶資源限制
  • 經過設置全局變量max_user_connections能夠限制全部用戶在同一時間鏈接MySQL實例的數量,但此參數沒法對每一個用戶區別對待,因此MySQL提供了對每一個用戶的資源限制管理

  • MAX_QUERIES_PER_HOUR:一個用戶在一個小時內能夠執行查詢的次數(基本包含全部語句)

  • MAX_UPDATES_PER_HOUR:一個用戶在一個小時內能夠執行修改的次數(僅包含修改數據庫或表的語句)

  • MAX_CONNECTIONS_PER_HOUR:一個用戶在一個小時內能夠鏈接MySQL的時間

  • MAX_USER_CONNECTIONS:一個用戶能夠在同一時間鏈接MySQL實例的數量

  • 從5.0.3版本開始,對用戶‘user’@‘%.example.com’的資源限制是指全部經過example.com域名主機鏈接user用戶的鏈接,而不是分別指從host1.example.com和host2.example.com主機過來的鏈接

2.2.7 修改 mysql 用戶密碼

修改用戶密碼的方式包括:

mysql> ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
mysql> SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('mypass');
mysql> GRANT USAGE ON *.* TO 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
shell> mysqladmin -u user_name -h host_name password "new_password"

  

建立用戶時指定密碼

mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';

  

 

 修改當前會話自己用戶密碼的方式包括:

mysql> ALTER USER USER() IDENTIFIED BY 'mypass';
mysql> SET PASSWORD = PASSWORD('mypass');

  

2.2.8 設置MySQL用戶密碼過時策略

設置系統參數default_password_lifetime做用於全部的用戶帳戶

    • default_password_lifetime=180 設置180天過時

    • default_password_lifetime=0 設置密碼不過時 
      若是爲每一個用戶設置了密碼過時策略,則會覆蓋上述系統參數

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER; 密碼不過時
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT; 默認過時策略

  

手動強制某個用戶密碼過時

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;
2.2.9 mysql 用戶 lock

經過執行create user/alter user命令中帶account lock/unlock子句設置用戶的lock狀態

Create user語句默認的用戶是unlock狀態

# 建立的時候給用戶鎖定
mysql> create user abc2@localhost identified by 'mysql' account lock;

  

Alter user語句默認不會修改用戶的lock/unlock狀態

# 修改用戶爲unlock
mysql> alter user abc2@'localhost' account unlock;

  

當客戶端使用lock狀態的用戶登陸MySQL時,會收到如此報錯 
Access denied for user ‘user_name’@’host_name’. 
Account is locked.

  

官方文檔:https://dev.mysql.com/doc/refman/5.7/en/privilege-system.html

相關文章
相關標籤/搜索