DBA-mysql-受權

權限系統介紹

  1. 權限系統的做用是授予來自某個主機的某個用戶能夠查詢、插入、修改、刪除等數據庫操做的權限。
  2. 不能明確的指定拒絕某個用戶的鏈接。
  3. 權限控制(受權與回收)的執行語句包括create user, grant, revoke
  4. 受權後的權限都會存放在Mysql的內部數據庫中(數據庫名叫mysql),並在數據庫啓動以後把權限信息複製到內存中,這就是爲何受權完之後須要運行 flush Privileges
  5. mysql用戶認證信息不光包括用戶,還要包含鏈接發起的主機,好比如下兩個就是不一樣的用戶
    5.1. 'ljf'@'example1.node.com'
    5.2. 'ljf'@'example2.node.com'

權限級別介紹

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

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

Mysql權限級別介紹

查看mysql實例默認root用戶的權限(來自localhost)mysql

mysql> show grants for root@localhost\G;
too many records ............

mysql> select * from db where user='root' and host='localhost';
Empty set (0.00 sec)

mysql> select * from tables_priv where user='root' and host='localhost';
Empty set (0.00 sec)

mysql> select * from columns_priv where user='root' and host='localhost';
Empty set (0.00 sec)

mysql> select * from procs_pr
Mysql權限詳解
  • All/All Privileges 權限表明全局或者全數據庫對象級別的全部權限。
  • Alter權限表明容許修改表結構的權限,但必需要求有create和insert權限配合。若是是rename表名,則要求有alter和drop原表,create和insert新表的權限。
  • Alter routine權限表明容許修改或者刪除存儲過程、函數的權限。
  • Create權限表明容許建立新的數據庫和表權限。
  • Create routine權限表明容許建立存儲過程、函數的權限。
  • Create table 權限表明容許建立、修改、刪除表空間和日誌組的權限。
  • Create temporary table權限表明容許建立臨時表的權限。
  • 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執行則不須要此權限,如Select1+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權限是建立一個用戶以後的默認權限,其自己表明鏈接登陸的權限。
mysql> create user abc@localhost identified by '123456';
Query OK, 0 rows affected (0.07 sec)

mysql> show grants for abc@localhost;
+-----------------------------------------+
| Grants for abc@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO `abc`@`localhost` |
+-----------------------------------------+
1 row in set (0.00 sec)

系統權限表

權限存儲在mysql庫的user,db,tables_priv,columns_priv, procs_priv這幾個系統表中,待mysql啓動後加載到內存中。linux

  • user表,存放用戶帳戶信息以及全局級別(全部數據)權限,決定了來自哪些主機的那些用戶能夠訪問數據庫實例,若是有全局權限則意味着對全部的數據都有此權限。
  • DB表:存放數據庫級別的權限,決定了來自哪些主機的哪些用戶能夠訪問此數據庫。
  • Tables_priv表,存放表級別的權限,決定了來自哪些主機的哪些用戶能夠訪問這數據庫的表。
  • Columns_priv表:存放列級別的權限,決定了來自哪些主機的哪些用戶能夠訪問數據庫的這個字段。
  • procs_priv表:存放存儲過程和函數級別的權限。
User表重要字段解釋
  1. Plugin,password,authentication_string三個字段存放用戶認證信息
  2. password_expired設置爲Y則代表容許DBA將此用戶的密碼設置爲過時並且過時後要求用戶的使用者重置密碼(alter user/set password 來重置)
  3. password_last_changed做爲一個時間戳字段表明密碼上次修改時間,執行create user/alter user /set password / grant等命令建立用戶或者修改用戶密碼時此數值更新。
  4. password_lifetime表明從password_last_changed時間開始此密碼過時的天數。
  5. account_locked表明此用戶被鎖定,沒法使用。
procs_priv權限表結構

routine_type是表明存儲過程仍是函數的類型sql

系統權限表
  1. user,password,authencation_string,db,table_name大小寫敏感
  2. host,column_name,routine_name大小寫不敏感。
    舉個例子:
create user ABC@localhost identified by '123456';
create user abc@localhost identified by '123456';

上面是建立了2個用戶。數據庫

create user abc@localhost identified by '123456';
create user abc@Localhost identified by '123456';

上面兩條命令仍是同一個用戶同一個主機。ide

受權用戶與查看用戶權限

查看權限
mysql> show grants for abc@localhost;
+-----------------------------------------+
| Grants for abc@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO `abc`@`localhost` |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql> show create user root@localhost;
'''''省略1W字
受權用戶。
  1. mysql的受權用戶由兩部分組成,用戶名和登陸主機。
  • 表達用戶的語法爲'username'@'hostname'
  • 單引號不是必須的,可是若是其中包含特殊字符則是必須的
  • ''@'localhost'表明匿名登陸的用戶
  • hostname可使用ipv4和ipv6的主機,::1表明ipv6的主機。
  • hostname字段運行使用%匹配字符,好比'%s'表明全部的主機,'%.node.com'表明來自node.com這個域名下的全部主機。''192.168.1.%'表示這個192.168.1的全部網段,也能夠寫成'192.168.10%'

具體含義參考下表:函數

image

修改權限後生效
  • 執行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能夠跳過全部的系統權限表而容許全部的用戶登陸,旨在特殊狀況下臨時使用。

使用mysql

鏈接mysql
  1. mysql -uroot -p mysql
  2. mysql --user=root --password=xxx mysql
建立mysql用戶並受權

建立mysql用戶由兩種方式,ui

  1. 經過create user/grant命令
  2. 經過insert語句直接操做Mysql系統權限表。

例一:this

mysql> create user 'abc1'@localhost identified by '123456' ;
mysql> grant all privileges on *.* to 'abc1'@'localhost' with grant option;

例二:日誌

mysql> create user 'abc2'@'%' identified by '123456';
mysql> grant all privileges on *.* to 'abc2'@'%' with grant option;

例三:

mysql> create user 'abc3'@'localhost' identified by '123456';
mysql> grant reload,process on *.* to 'abc3'@'localhost';
mysql> grant select(id) on test.tmp to abc3@localhost;

例四:

mysql> create user 'custom'@'example1.node.com' identified by '123456';
Query OK, 0 rows affected (0.12 sec)
mysql> grant select,insert,update,delete,create,drop on test.tmp to custom@'example1.node.com' ;
回收用戶權限

經過revoke來回收用戶權限,語法以下:

revoke 權限名 on 庫名.表名 from 用戶名@主機名

例子一:

mysql> show grants for custom@'example1.node.com';
+----------------------------------------------------------------------------------------------------+
| Grants for custom@example1.node.com                                                                |
+----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `custom`@`example1.node.com`                                                 |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON `test`.`tmp` TO `custom`@`example1.node.com` |
+----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> revoke delete on test.tmp from  custom@'example1.node.com';   #剔除delete權限
Query OK, 0 rows affected (0.10 sec)

mysql> show grants for custom@'example1.node.com';
+--------------------------------------------------------------------------------------------+
| Grants for custom@example1.node.com                                                        |
+--------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `custom`@`example1.node.com`                                         |
| GRANT SELECT, INSERT, UPDATE, CREATE, DROP ON `test`.`tmp` TO `custom`@`example1.node.com` |   # delete權限消除啦!
+--------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
刪除用戶

經過drop來刪除用戶。語法以下

drop user 用戶名@主機名

例子1

mysql> drop user 'custom'@'example1.node.com';
Query OK, 0 rows affected (0.02 sec)
設置mysql用戶資源限制
  • max_user_connections限制全部用戶在同一實際鏈接mysql實例的數量。經過設置max_user_connections能夠限制全部用戶在同一實際鏈接Mysql的實例的數量,可是此參數沒法對每一個用戶區別對待,因此Mysql提供了每一個用戶的資源限制管理。
  • max_queries_per_hour,一個用戶在一個小時內能夠執行查詢的次數(基本包含了全部的語句)。
  • max_update_per_hour,一個用戶在一個小時內能夠執行修改的次數(僅僅包含修改數據庫或者表的語句)
  • max_connections_per_hour,一個用戶在一個小時內能夠鏈接mysql的時間。
  • max_user_connections ,一個用戶在同一個時間鏈接mysql實例的數量。

若是不想對某個用戶進行限制了,直接把對應的值改成0便可。

ps:

  1. 從5.0.3版本開始,對用戶'user'@'%.example.com'的資源限制是指全部經過example.com域名主機鏈接user用戶的鏈接,而不是分別從host1.example.com和host2.example.com的主機過來的鏈接。
  2. 當針對某個用戶的max_user_connections非0時,則忽略全局系統參數max_user_connections,反之則全局系統參數生效。
開始設置用戶資源限制。
  • 建立用戶時進行限制。
mysql> create user 'abc4'@'localhost' identified by '123456' with max_queries_per_hour 20
    -> max_updates_per_hour 10
    -> max_connections_per_hour 3
    -> max_user_connections 2;
  • 更改用戶的資源限制。
    更改後能夠經過show create user來查看詳細信息。
mysql> alter user 'abc4'@'localhost' with MAX_QUERIES_PER_HOUR 3;
設置mysql用戶的密碼
  • alter user 'abc4'@'localhost' identified by 'abc4';
  • 使用grant和set password在mysql8.0新版很差使了。
設置mysql用戶密碼過時策略

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

  • default_password_lifetime=180 設置180天過時
  • default_password_lifetime=0 設置0天過時

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

  • alter user 'abc1'@'localhost' password expire interval 90 day; 90天過時時間
  • alter user 'abc3'@'localhost' password expire default; 默認過時策略
  • alter user 'abc1'@'localhost' password expire never; 密碼不過時

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

  • alter user 'abc1'@'localhost' password expire;
    設置完成後,咱們切換用戶登陸試試看效果
[root@linux-node2 ~]# mysqladmin -uabc3 -hlocalhost password '123456' -p
mysql> select 1+2;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

修改密碼後看看效果

mysql> alter user user() identified by '123456';
Query OK, 0 rows affected (0.21 sec)

# 切換到另外一個終端,使用剛纔abc3用戶的鏈接

mysql> select 1+2
    -> ;
+-----+
| 1+2 |
+-----+
|   3 |
+-----+
1 row in set (0.08 sec)
mysql 用戶鎖定

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

  • create user的時候鎖定
create user abc5@localhost identified by '123456' account lock;
  • alter user的時候鎖定
mysql> alter user 'abc2'@localhost account lock;
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
請注意,若是報上面的錯誤(錯誤代碼爲1819),請檢查這個用戶是否存在。
mysql> alter user 'abc3'@localhost account lock;  # 存在就會更改爲功
Query OK, 0 rows affected (0.09 sec)
相關文章
相關標籤/搜索