MySQL權限詳解

筆者Q:972581034 交流羣:605799367。有任何疑問可與筆者或加羣交流

MySQL權限級別介紹

  • MySQL權限級別
  • 全局性的管理權限,做用於整個MySQL實例級別
  • 數據庫級別的權限,做用於某個指定的數據庫上或者全部的數據庫上
  • 數據庫對象級別的權限,做用於指定的數據庫對象上(表、視圖等)或 者全部的數據庫對象上
  • 權限存儲在mysql庫的user, db, tables_priv, columns_priv, and procs_priv這幾個系統表中,待MySQL實例啓動後就加載到內存中

MySQL權限級別介紹

對比root用戶在幾個權限系統表中的數據mysql

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權限詳解(1)

  • All/All Privileges權限表明全局或者全數據庫對象級別的全部權限
  • Alter權限表明容許修改表結構的權限,但必需要求有create和insert權 限配合。若是是rename表名,則要求有alter和drop原表,create和 insert新表的權限
  • Alter routine權限表明容許修改或者刪除存儲過程、函數的權限
  • Create權限表明容許建立新的數據庫和表的權限
  • Createroutine權限表明容許建立存儲過程、函數的權限
  • Createtablespace權限表明容許建立、修改、刪除表空間和日誌組的權 限
  • Create temporary tables權限表明容許建立臨時表的權限
  • Createuser權限表明容許建立、修改、刪除、重命名user的權限
  • Createview權限表明容許建立視圖的權限

MySQL權限詳解(2)

• Delete權限表明容許刪除行數據的權限
• Drop權限表明容許刪除數據庫、表、視圖的權限,包括truncatetable命令
• 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權限的表進行鎖定,以防止其餘連接對此表 的讀或寫sql

MySQL權限詳解(3)

• Process權限表明容許查看MySQL中的進程信息,好比執行showprocesslist,
• 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條件的狀況下也是須要的
• Showdatabases權限表明經過執行showdatabases命令查看全部的數據庫名
• Show view權限表明經過執行show create view命令查看視圖建立的語句mysqladmin processlist, show engine等命令shell

MySQL權限詳解(4)

• Shutdown權限表明容許關閉數據庫實例,執行語句包括mysqladmin shutdown
• Super權限表明容許執行一系列數據庫管理命令,包括kill強制關閉某個鏈接 命令,change master to建立複製關係命令,以及create/alter/drop server等命 令
• Trigger權限表明容許建立,刪除,執行,顯示觸發器的權限
• Update權限表明容許修改表中的數據的權限
• Usage權限是建立一個用戶以後的默認權限,其自己表明鏈接登陸權限數據庫

系統權限表

• 權限存儲在mysql庫的user,db, tables_priv, columns_priv, and procs_priv這幾個系統表中,待MySQL實例啓動後就加載到內存中
• User表:存放用戶帳戶信息以及全局級別(全部數據庫)權限,決定了 來自哪些主機的哪些用戶能夠訪問數據庫實例,若是有全局權限則意味
着對全部數據庫都有此權限
• Db表:存放數據庫級別的權限,決定了來自哪些主機的哪些用戶能夠訪 問此數據庫
• Tables_priv表:存放表級別的權限,決定了來自哪些主機的哪些用戶能夠 訪問數據庫的這個表
• Columns_priv表:存放列級別的權限,決定了來自哪些主機的哪些用戶可 以訪問數據庫表的這個字段
• Procs_priv表:存放存儲過程和函數級別的權限
• User和db權限表結構
• User權限表結構中的特殊字段
• Plugin,password,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表明此用戶被鎖住,沒法使用
• Tables_priv和columns_priv權限表結構
• Timestamp和grantor兩個字段暫時沒用
• Tables_priv和columns_priv權限值
• procs_priv權限表結構
• Routine_type是枚舉類型,表明是存儲過程仍是函數
• Timestamp和grantor兩個字段暫時沒用
• 系統權限表字段長度限制表
• 權限認證中的大小寫敏感問題
• 字段user,password,authencation_string,db,table_name大小寫敏感
• 字段host,column_name,routine_name大小寫不敏感
• User用戶大小寫敏感app

mysql> create user abc@localhost;
ERROR 1396 (HY000): Operation CREATE USER failed for 'abc'@'localhost' 
mysql> create user Abc@localhost;
Query OK, 0 rows affected (0.01 sec)

• Host主機名大小寫不敏感ide

mysql> create user abc@Localhost;
ERROR 1396 (HY000): Operation CREATE USER failed for 'abc'@'localhost'

MySQL受權用戶

• 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網段的主機函數

MySQL修改權限的生效

• 執行Grant,revoke,setpassword,renameuser命令修改權限以後,MySQL會自動
將修改後的權限信息同步加載到系統內存中
• 若是執行insert/update/delete操做上述的系統權限表以後,則必須再執行刷 新權限命令才能同步到系統內存中,刷新權限命令包括:flush privileges/mysqladmin flush-privileges/mysqladmin reload
• 若是是修改tables和columns級別的權限,則客戶端的下次操做新權限就會生 效
• 若是是修改database級別的權限,則新權限在客戶端執行use database命令後 生效
• 若是是修改global級別的權限,則須要從新建立鏈接新權限才能生效
• --skip-grant-tables能夠跳過全部系統權限表而容許全部用戶登陸,只在特殊 狀況下暫時使用this

MySQL用戶鏈接

mysql --user=finley --password db_name
mysql -u finley -p db_name
mysql --user=finley --password=password db_name 
shell> mysql -u finley -ppassword db_name

建立MySQL用戶

• 有兩種方式建立MySQL受權用戶
• 執行createuser/grant命令(推薦方式)
• 經過insert語句直接操做MySQL系統權限表spa

mysql> CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass'; 
mysql>GRANTALLPRIVILEGESON*.*TO'finley'@'localhost' WITH
GRANT OPTION;
mysql> CREATE USER 'finley'@'%' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'%‘ WITH GRANT OPTION;
mysql> CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin_pass';
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
mysql> grant select(id) on test.temp to cdq@localhost;

建立MySQL用戶日誌

mysql> CREATE USER 'custom'@'localhost' IDENTIFIED BY 'obscure'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON bankaccount.*
-> TO 'custom'@'localhost';

mysql> CREATE USER 'custom'@'host47.example.com' IDENTIFIED BY 'obscure'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON expenses.*
-> TO 'custom'@'host47.example.com';

mysql> CREATE USER 'custom'@'%.example.com' IDENTIFIED BY 'obscure'; 
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

回收MySQL用戶權限

• 經過revoke命令收回用戶權限

mysql> revoke select on `sys`.`sys_config` from 'mysql.sys'@localhost;

刪除MySQL用戶

• 經過執行drop user命令刪除MySQL用戶

mysql> DROP USER 'jeffrey'@'localhost';

設置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主機過來的鏈接

設置MySQL用戶資源限制

• 經過執行createuser/alteruser設置/修改用戶的資源限制

mysql> CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank'
-> -> -> ->
WITH MAX_QUERIES_PER_HOUR 20 MAX_UPDATES_PER_HOUR 10 MAX_CONNECTIONS_PER_HOUR 5 MAX_USER_CONNECTIONS 2;
mysql> ALTER USER 'francis'@'localhost' WITH MAX_QUERIES_PER_HOUR 100;

• 取消某項資源限制既是把原先的值修改爲0

mysql> ALTER USER 'francis'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0;

• 當針對某個用戶的max_user_connections非0時,則忽略全局系統參數 max_user_connections,反之則全局系統參數生效
設置MySQL用戶的密碼
• 執行create user建立用戶和密碼

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

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

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> ALTER USER USER() IDENTIFIED BY 'mypass'; 
mysql> SET PASSWORD = PASSWORD('mypass');

設置MySQL用戶密碼過時策略

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

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL90DAY;
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INEVER;密碼不過時
ALTER USER‘jeffrey’@‘localhost’ PASSWORD EXPIRE DEFAULT;默認過時策略

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

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;
mysql> SELECT 1;
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement 
mysql> ALTER USER USER() IDENTIFIED BY 'new_password';
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT 1;
|1|

MySQL用戶lock

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

mysql>create user abc2@localhost identified by 'mysql' account lock; 
QueryOK,0rowsaffected(0.01sec)
Alter user語句默認不會修改用戶的lock/unlock狀態 
mysql>alter user 'mysql.sys'@localhost account lock;
Query OK,0 row saffected(0.00sec)
mysql>alter user 'mysql.sys'@localhost account unlock;
Query OK,0 row saffected(0.00sec)
-- 當客戶端使用lock狀態的用戶登陸MySQL時,會收到如此報錯 Access denied for user 'user_name'@'host_name'.
Account is locked.

企業應用中的常規MySQL用戶

• 企業生產系統中MySQL用戶的建立一般由DBA統一協調建立,並且按需
建立
• DBA一般直接使用root用戶來管理數據庫
• 一般會建立指定業務數據庫上的增刪改查、臨時表、執行存儲過程的權限給應 用程序來鏈接數據庫

Create user app_full identified by ‘mysql’;
Grant select,update,insert,delete,create temporary tables,execute on esn.* to
app_full@’10.0.0.%’;
mysql>show grants for app_full@'10.0.0.%';
+------------------------------------------------------------------------------------------------------------+
|Grantsforapp_full@10.0.0.% |
+------------------------------------------------------------------------------------------------------------+
|GRANTUSAGEON*.*TO'app_full'@'10.0.0.%' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, EXECUTE ON `esn`.* TO 'app_full'@'10.0.0.%' |

• 一般也會建立指定業務數據庫上的只讀權限給特定應用程序或某些高級別人員 來查詢數據,防止數據被修改

Create user app_readonly identified by ‘mysql’;
Grant select on esn.* to app_readonly identified by ‘mysq’;
相關文章
相關標籤/搜索