Java開發最容易犯的幾種錯誤
Mysql許可權管理也是通過mysql表來管理的
本文基於mysql8
-
身份驗證:
- 優先從mysql.user中判斷ip、使用者名稱、密碼是否存在,存在即通過驗證。
-
許可權認證:
- 按照mysql.user、db、tables_priv、columns_priv、procs_priv順序驗證,如果對應許可權值為Y,表示擁有該許可權
1. MySQL 許可權級別
-
全域性性的管理許可權:作用於整個MySQL例項級別 (user表)
- User表:存放使用者賬戶資訊以及全域性級別(所有資料庫)許可權,決定了來自哪些主機的哪些使用者可以訪問資料庫例項,如果`有全域性許可權則意味著對所有資料庫都有此許可權
-
資料庫級別的許可權: 作用於某個指定的資料庫上或者所有的資料庫上 (db表)
* Db表:存放資料庫級別
的許可權,決定了來自哪些主機的哪些使用者可以訪問此資料庫 -
資料庫物件級別的許可權:作用於指定的資料庫物件上(表、檢視等)或者所有的資料庫物件上(tables_priv、columns_priv、procs_priv)
- Tables_priv表:
存放表級別的許可權
,決定了來自哪些主機的哪些使用者可以訪問資料庫的這個表 - Columns_priv表:
存放列級別的許可權
,決定了來自哪些主機的哪些使用者可以訪問資料庫表的這個欄位 - Procs_priv表:
存放儲存過程和函式
級別的許可權
- Tables_priv表:
許可權存在mysql上述表中,待MySQL例項啟動後就載入到記憶體中
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許可權是建立一個使用者之後的預設許可權,其本身代表連線登入許可權
3. MySQL許可權表結構說明
以user表為例,其他表類似。
注意: 這裡是以host、user為主鍵,所以在建立使用者以及賦許可權的時候要特別小心
CREATE USER 'test12345'@'%' IDENTIFIED BY '123456';
CREATE USER 'test12345'@'*' IDENTIFIED BY '123456';
上面兩條語句會建立兩個使用者
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' |
4. 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網段的主機
# 有理論之後,下面的命令執行完可以在終端執行測試一下
# mysql8經測試,必須先建立使用者之後再賦予許可權,賦予許可權時,能再加IDENTIFIED BY,建立使用者和賦予許可權語句的host、user必須相同
## 賦予使用者許可權簡單命令##################################################
select user,host from mysql.user; # 查詢mysql使用者資訊
show grants for root@'localhost'; #檢視已經授權給使用者的許可權資訊
show create user root@'localhost'; #檢視使用者的其他非授權資訊
CREATE USER 'test'@'localhost' IDENTIFIED BY '123456'; #建立使用者,這個時候還沒有許可權 192.168.148.132
GRANT ALL PRIVILEGES ON *.* TO 'test'@'localhost' WITH GRANT OPTION; #賦予許可權,這裡賦予了所有許可權,會直接在user表新增相關許可權資訊,這裡不能遠端連線
CREATE USER 'test'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION; #和上述兩個語句的區別是,這裡支援遠端訪問,上述語句只能本地訪問
## 回收 mysql 許可權#####################################################
CREATE USER 'hsm'@'%' IDENTIFIED BY '123456'; #建立使用者
grant select on Test.User to hsm@'%'; #賦予查詢的許可權
show grants for hsm@'%'; # 查詢許可權資訊
GRANT USAGE ON *.* TO `hsm`@`%`
GRANT SELECT ON `Test`.`User` TO `hsm`@`%`
revoke select on Test.User from hsm@'%'; #回收查詢許可權,再次查詢,會發現沒有了select許可權
## 刪除使用者許可權 #########################################################
drop user hsm@'%' # 刪除使用者
flush privileges; #重新整理許可權
rename user 'hsm'@'*' to 'hsm'@'%'; # 重新命名許可權
修改使用者許可權說明
- 執行Grant,revoke,set password,rename user命令修改許可權之後, MySQL會自動將修改後的許可權資訊同步載入到系統記憶體中
- 如果執行insert/update/delete操作上述的系統許可權表之後,則必須再執行重新整理許可權命令才能同步到系統記憶體中,重新整理許可權命令包括:
flush privileges
/mysqladmin flush-privileges / mysqladmin reload - 如果是修改tables和columns級別的許可權,則客戶端的下次操作新許可權就會生效
- 如果是修改database級別的許可權,則新許可權在客戶端執行use database命令後生效
- 如果是修改global級別的許可權,則需要重新建立連線新許可權才能生效
- 如果是修改global級別的許可權,則需要重新建立連線新許可權才能生效 (例如修改密碼)
GRANT命令使用說明
- ALL PRIVILEGES 是表示所有許可權,你也可以使用select、update等許可權。
- ON 用來指定許可權針對哪些庫和表。 *.* 中前面的號用來指定資料庫名,後面的號用來指定表名。
- TO 表示將許可權賦予某個使用者。
- WITH GRANT OPTION 這個選項表示該使用者可以將自己擁有的許可權授權給別人
- 可以使用GRANT重複給使用者新增許可權,許可權疊加,比如你先給使用者新增一個select許可權,然後又給使用者新增一個insert許可權,那麼該使用者就同時擁有了select和insert許可權。
5. 其他命令
設定MySQL使用者資源限制
- 通過設定全域性變數max_user_connections可以限制所有使用者在同一時間連線MySQL例項的數量,但此引數無法對每個使用者區別對待,所以MySQL提供了對每個使用者的資源限制管理
- MAX_QUERIES_PER_HOUR:一個使用者在一個小時內可以執行查詢的次數(基本包含所有語句)
- MAX_UPDATES_PER_HOUR:一個使用者在一個小時內可以執行修改的次數(僅包含修改資料庫或表的語句)
- MAX_CONNECTIONS_PER_HOUR:一個使用者在一個小時內可以連線MySQL的時間
- MAX_USER_CONNECTIONS:一個使用者可以在
同一時間連線MySQL例項的數量
修改 mysql 使用者密碼
alter user test12345@'*' IDENTIFIED BY '1234567'; # 修改密碼為1234567
設定MySQL使用者密碼過期策略
設定系統引數default_password_lifetime作用於所有的使用者賬戶
- default_password_lifetime=180 設定180天過期
- default_password_lifetime=0 設定密碼不過期
ALTER USER 'hsm'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'hsm'@'%' PASSWORD EXPIRE NEVER; #密碼不過期
ALTER USER 'hsm'@'%' PASSWORD EXPIRE DEFAULT; #預設過期策略
ALTER USER 'hsm'@'%' PASSWORD EXPIRE; # 手動強制某個使用者密碼過期
mysql 使用者 lock
通過執行create user/alter user命令中帶account lock/unlock子句設定使用者的lock狀態
create user abc2@localhost identified by 'mysql' account lock; #建立使用者並鎖定使用者
alter user abc2@'localhost' account unlock; # 解鎖使用者
5. 許可權例子
- 只授予能滿足需要的最小許可權,防止使用者幹壞事。比如使用者只是需要查詢,那就只給select許可權就可以了,不要給使用者賦予update、insert或者delete許可權。
- 建立使用者的時候限制使用者的登入主機,一般是限制成指定IP或者內網IP段。
- 初始化資料庫的時候刪除沒有密碼的使用者。安裝完資料庫的時候會自動建立一些使用者,這些使用者預設沒有密碼。
- 為每個使用者設定滿足密碼複雜度的密碼。
- 定期清理不需要的使用者。回收許可權或者刪除使用者。
-
建立一個使用者,對資料庫只有可讀許可權
CREATE USER 'readonly'@'%' IDENTIFIED BY 'readonly'; #建立使用者readonly,%表示可以遠端連線 GRANT select ON *.* TO 'readonly'@'%'; #賦予許可權,這裡賦予了所有許可權,會直接在user表新增相關許可權資訊,這裡不能遠端連線
-
建立一個使用者,只賦予使用者某幾個資料庫的許可權
CREATE USER 'order_all'@'%' IDENTIFIED BY 'order_all'; #建立使用者order,可以檢視訂單表所有許可權 GRANT ALL PRIVILEGES ON Test.* TO 'order_all'@'%'; #賦予許可權,Test庫的全部許可權 GRANT ALL PRIVILEGES ON mypower.* TO 'order_all'@'%'; #賦予許可權,mypower庫的全部許可權
-
建立一個使用者,只賦予使用者某幾個表的許可權
CREATE USER 'table'@'%' IDENTIFIED BY 'table'; #建立使用者order,可以檢視訂單表所有許可權 GRANT ALL PRIVILEGES ON Test.user TO 'table'@'%'; #賦予許可權,Test庫user表的全部許可權 GRANT ALL PRIVILEGES ON Test.Test TO 'table'@'%'; #賦予許可權,Test庫Test表的全部許可權