MySQL-使用者與許可權管理
使用者與許可權管理
許可權控制
許可權控制資料字典
mysql.user表
記錄允許連線到伺服器的使用者帳號資訊
mysql.db
記錄各個帳號在各個資料庫上的操作許可權
mysql.tables_priv
記錄資料表級的操作許可權
mysql.columns_priv
記錄資料列級的操作許可權
mysql.host
配合db許可權表對給定主機上資料庫級操作許可權作更細緻的控制。這個許可權表不受GRANT和REVOKE語句的影響。
許可權驗證過程
自頂向下逐層下查的方式驗證使用者的許可權
- MySQL Server 啟動時,將上面的許可權表資訊載入到記憶體中
- 先檢查mysql.user表中的全域性許可權,如果滿足條件,則執行操作
- 若失敗,再檢查mysql.db表中是否有滿足條件的許可權,如果滿足,則執行操作
- 若失敗,再則檢查mysql.table_priv和mysql.columns_priv(如果是儲存過程操作則檢查mysql.procs_priv),如果滿足,則執行操作
- 如果以上檢查均失敗,則系統拒絕執行操作
許可權資訊
許可權 | 許可權級別 | 許可權說明 |
---|---|---|
CREATE | 資料庫、表或索引 | 建立資料庫、表或索引許可權 |
DROP | 資料庫或表 | 刪除資料庫或表許可權 |
GRANT OPTION | 資料庫、表或儲存的程式 | 賦予許可權選項 |
REFERENCES | 資料庫或表 | |
ALTER | 表 | 更改表,比如新增欄位、索引等 |
DELETE | 表 | 刪除資料許可權 |
INDEX | 表 | 索引許可權 |
INSERT | 表 | 插入許可權 |
SELECT | 表 | 查詢許可權 |
UPDATE | 表 | 更新許可權 |
CREATE VIEW | 檢視 | 建立檢視許可權 |
SHOW VIEW | 檢視 | 檢視檢視許可權 |
ALTER ROUTINE | 儲存過程 | 更改儲存過程許可權 |
CREATE ROUTINE | 儲存過程 | 建立儲存過程許可權 |
EXECUTE | 儲存過程 | 執行儲存過程許可權 |
FILE | 伺服器主機上的檔案訪問 | 檔案訪問許可權 |
CREATE TEMPORARY TABLES | 伺服器管理 | 建立臨時表許可權 |
LOCK TABLES | 伺服器管理 | 鎖表許可權 |
CREATE USER | 伺服器管理 | 建立使用者許可權 |
PROCESS | 伺服器管理 | 檢視程序許可權 |
RELOAD | 伺服器管理 | 執行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的許可權 |
REPLICATION CLIENT | 伺服器管理 | 複製許可權 |
REPLICATION SLAVE | 伺服器管理 | 複製許可權 |
SHOW DATABASES | 伺服器管理 | 檢視資料庫許可權 |
SHUTDOWN | 伺服器管理 | 關閉資料庫許可權 |
SUPER | 伺服器管理 | 執行kill執行緒許可權 |
使用者管理
使用者的組成
MySQL的授權使用者由兩部分組成: 使用者名稱和登入主機名
,其格式為:'username'@'hostname'
。單引號不是必須的,若包含有特殊字元,則必須使用單引號包圍起來。
hostname 項內容
- 允許使用
%
和_
兩個萬用字元。%
:表示匹配所有_
:表示匹配單個字元
- 本機地址
- localhost 代表本機
- 127.0.0.1 代表ipv4本機地址
- ::1 代表ipv6的本機地址
建立賬戶
CREATE USER 'biu'@'localhost' IDENTIFIED BY '_password_';
刪除使用者
drop user 'biu'@'localhost';
許可權管理
重新整理許可權
對許可權表user、db、host等做了update或者delete更新的時候,需要執行FLUSH PRIVILEGES命令來重新整理記憶體中許可權資料。
flush privileges;
檢視使用者許可權
-- 檢視當前使用者的許可權
show grants;
-- 檢視指定使用者的許可權
show grants for 'biu'@'localhost';
授權使用者系統許可權
grant all privileges on *.* to 'biu'@'localhost';
回收使用者許可權
revoke PROCESS ON *.* from 'biu'@'localhost';
revoke delete on *.* from 'biu'@'localhost';
賬戶密碼管理
更改密碼
ALTER USER 'biu'@'localhost' IDENTIFIED BY '_password_';
直接更改當前賬戶(非匿名)
ALTER USER USER() IDENTIFIED BY '_password_';
SET PASSWORD = PASSWORD('_password_');
命令列更改帳戶密碼
mysqladmin -u _user_name_ -h _host_name_ -p "_password_"
使用mysqladmin設定密碼應該被認為是不安全的。
複製使用者密碼限制
使用MySQL複製,需要注意 CHANGE MASTER TO 語句限制 32 個字元;如果密碼太長會被截斷。
密碼過期
# 手動使帳戶密碼失效
ALTER USER 'biu'@'localhost' PASSWORD EXPIRE;
密碼過期策略
default_password_lifetime = 180
預設為 0 ,永不過期
要求每90天更改一次密碼
CREATE USER 'biu'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'biu'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
禁用密碼有效期
CREATE USER 'biu'@'localhost' PASSWORD EXPIRE NEVER;
ALTER USER 'biu'@'localhost' PASSWORD EXPIRE NEVER;
密碼重用限制【8.0】
- 要禁止重複使用最近6個密碼或365天以內的密碼,請在伺服器my.cnf檔案中新增以下行 :
[mysqld]
password_history=6
password_reuse_interval=365
或
SET GLOBAL password_history = 6;
SET GLOBAL password_reuse_interval = 365;
- 在允許重複使用之前,至少需要更改5次密碼:
CREATE USER 'biu'@'localhost' PASSWORD HISTORY 5;
ALTER USER 'biu'@'localhost' PASSWORD HISTORY 5;
- 要將兩種型別的重用限制結合使用
CREATE USER 'biu'@'localhost' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 365 DAY;
ALTER USER 'biu'@'localhost' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 365 DAY;
密碼修改驗證【8.0.13】
可以設定在當前使用者修改自己密碼時候需要輸入原密碼,由引數 password_require_current
控制,預設不需要
-- 修改方式
ALTER USER USER() IDENTIFIED BY '_auth_string_' REPLACE '_current_auth_string_';
ALTER USER 'biu'@'localhost' IDENTIFIED BY '_auth_string_' REPLACE '_current_auth_string_';
支援雙密碼【8.0.14】
從MySQL 8.0.14開始,允許使用者帳戶具有雙重密碼,分別指定為主要和次要密碼。
可以無縫的進行更改密碼,而不用停止應用。
示例:
1.在主上修改帳號的密碼,設定新密碼
ALTER USER 'appuser1'@'host1.example.com' IDENTIFIED BY '_password_b_' RETAIN CURRENT PASSWORD;
2.等待密碼複製到從庫
3.修改應用程式的密碼,使用新的密碼進行連線
4.刪除舊密碼
ALTER USER 'appuser1'@'host1.example.com' DISCARD OLD PASSWORD;
RETAIN CURRENT PASSWORD : 保留帳戶的當前密碼作為其輔助密碼。客戶端使用新舊密碼都可以連線。
如果使用 alter user 或 set password 設定新密碼為空,則舊密碼也會變為空
設定輔助密碼需要許可權APPLICATION_PASSWORD_ADMIN
生成隨機密碼【8.0.18】
mysql> CREATE USER 'y1'@'localhost' IDENTIFIED BY RANDOM PASSWORD,'y2'@'%' IDENTIFIED BY RANDOM PASSWORD;
+------+-----------+----------------------+
| user | host | generated password |
+------+-----------+----------------------+
| y1 | localhost | :ir5:D]*cbi}V3aP68/r |
| y2 | % | i2Zi/T+HpEw%MK:j{E5r |
+------+-----------+----------------------+
2 rows in set (0.01 sec)
# 修改為隨機密碼
mysql> ALTER USER 'y1'@'localhost' IDENTIFIED BY RANDOM PASSWORD, 'y2'@'%' IDENTIFIED BY RANDOM PASSWORD;
生成的密碼長度預設為 20 ,長度由引數
generated_random_password_length
控制[5 - 255]
登入失敗跟蹤和臨時帳戶鎖定【8.0.19】
對賬戶設定登陸失敗次數和鎖定時間
CREATE USER 'u1'@'localhost' IDENTIFIED BY '_password_' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3;
設定賬戶資源限制
可以對賬戶進行如下限制:
- 帳戶每小時可發出的查詢數量
- 帳戶每小時可以釋出的更新次數
- 帳戶每小時可以連線到伺服器的次數
- 帳戶同時連線到伺服器的數量
-- 設定資源限制
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;
-- 刪除限制
mysql> ALTER USER 'francis'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0;