1. 程式人生 > 其它 >MySQL-使用者與許可權管理

MySQL-使用者與許可權管理

管理MySQL使用者賬號

使用者與許可權管理

許可權控制

許可權控制資料字典

mysql.user表

記錄允許連線到伺服器的使用者帳號資訊

mysql.db

記錄各個帳號在各個資料庫上的操作許可權

mysql.tables_priv

記錄資料表級的操作許可權

mysql.columns_priv

記錄資料列級的操作許可權

mysql.host

配合db許可權表對給定主機上資料庫級操作許可權作更細緻的控制。這個許可權表不受GRANT和REVOKE語句的影響。

許可權驗證過程

自頂向下逐層下查的方式驗證使用者的許可權

  1. MySQL Server 啟動時,將上面的許可權表資訊載入到記憶體中
  2. 先檢查mysql.user表中的全域性許可權,如果滿足條件,則執行操作
  3. 若失敗,再檢查mysql.db表中是否有滿足條件的許可權,如果滿足,則執行操作
  4. 若失敗,再則檢查mysql.table_priv和mysql.columns_priv(如果是儲存過程操作則檢查mysql.procs_priv),如果滿足,則執行操作
  5. 如果以上檢查均失敗,則系統拒絕執行操作

許可權資訊

許可權 許可權級別 許可權說明
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;