萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 權限系統全解析:授權表結構、權限分類、GRANT/REVOKE 實戰與用戶管理

權限系統架構:四張授權表

MySQL 權限存儲在 mysql 系統庫四張表中,層層遞進:

表名作用域關鍵列(大小寫敏感性)
user全局(服務器級)Host(Y), User(Y), Password(Y), 全局權限列(N)
db數據庫級Host(N), User(Y), Db(Y), 權限列(N)
tables_priv表級Host(N), User(Y), Db(Y), Table_name(Y), Column_name(N)
columns_priv列級Host(N), User(Y), Db(Y), Table_name(Y), Column_name(N)

匹配順序:user → db → tables_priv → columns_priv,首次匹配生效,後續不再檢查。

權限分類與適用範圍

1. 數據操作權限(DML/DDL)

權限列名作用域說明
SELECTSelect_priv表/列查詢數據
INSERTInsert_priv表/列插入數據
UPDATEUpdate_priv表/列修改數據
DELETEDelete_priv表刪除數據
INDEXIndex_priv表建/刪索引
ALTERAlter_priv表修改表結構
CREATECreate_priv庫/表/索引創建對象
DROPDrop_priv庫/表刪除對象
REFERENCESReferences_priv庫/表外鍵引用(現版本未啟用)

2. 管理權限(高危,謹慎授予)

權限列名作用域風險說明
FILEFile_priv服務器文件讀寫服務器文件,極高危,可讀 /etc/passwd、寫 webshell
GRANTGrant_priv庫/表授權給他人,含遞授權
PROCESSProcess_priv服務器查看/殺死所有線程(含他人)
RELOADReload_priv服務器FLUSH 操作、刷新權限/日志
SHUTDOWNShutdown_priv服務器關閉服務器
SUPERSuper_priv服務器超級權限:殺線程、修改全局變量、CHANGE MASTER、PURGE BINLOG 等
REPLICATION SLAVERepl_slave_priv服務器從庫連接主庫讀 Binlog
REPLICATION CLIENTRepl_client_priv服務器SHOW MASTER/SLAVE STATUS

GRANT 實戰範例

1. 創建用戶並授權(推薦 5.7+ 語法)

-- 僅創建用戶
CREATE USER 'app_user'@'10.0.1.%' IDENTIFIED BY 'StrongPass#123';

-- 授予特定庫所有表的 讀/寫/索引 權限
GRANT SELECT, INSERT, UPDATE, DELETE, INDEX 
ON `app_db`.* TO 'app_user'@'10.0.1.%';

-- 授予僅讀權限(只讀賬號)
GRANT SELECT ON `app_db`.* TO 'readonly'@'10.0.1.%';

-- 生效
FLUSH PRIVILEGES;

2. 通配符主機與密碼策略

-- 允許任意 IP(極不推薦生產使用)
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'ComplexPass!';

-- 僅允許特定網段
GRANT ALL ON *.* TO 'admin'@'192.168.10.%' IDENTIFIED BY 'ComplexPass!';

-- 密碼過期策略(5.7+)
ALTER USER 'app_user'@'10.0.1.%' PASSWORD EXPIRE INTERVAL 90 DAY;

3. 查看用戶權限

SHOW GRANTS FOR 'app_user'@'10.0.1.%';
-- 輸出示例:
-- GRANT USAGE ON *.* TO `app_user`@`10.0.1.%`
-- GRANT SELECT, INSERT, UPDATE, DELETE, INDEX ON `app_db`.* TO `app_user`@`10.0.1.%`

REVOKE 回收權限

-- 回收特定庫權限
REVOKE ALL ON `app_db`.* FROM 'app_user'@'10.0.1.%';

-- 回收全局權限
REVOKE RELOAD, PROCESS ON *.* FROM 'admin'@'%';

-- 徹底刪除用戶(5.7+)
DROP USER 'app_user'@'10.0.1.%';

注意:REVOKE ALL 僅回收權限,不刪除用戶記錄(殘留在 mysql.user)。

權限管理黃金法則

  1. 最小權限原則:業務賬號僅授 SELECT/INSERT/UPDATE/DELETE,禁止 DDL/管理權限。
  2. 網段限制:Host 欄位盡量具體到 /24 網段,禁用 %。
  3. 分層賬號:管理員(SUPER)、開發(DDL+DML)、只讀(SELECT)、備份(SELECT+LOCK TABLES+REPLICATION CLIENT)、監控(PROCESS+REPLICATION CLIENT)。
  4. 定期審計:SELECT User, Host FROM mysql.user WHERE User != 'mysql.sys'; 清理僵屍賬號。
  5. 密碼複雜度:啟用 validate_password 插件,強制長度、混合字符、過期輪換。

常見錯誤與排查

  • ERROR 1045 (28000): Access denied → 檢查 Host 匹配(IP vs 域名)、密碼、skip-name-resolve 影響。
  • ERROR 1142 (42000): SELECT command denied → 權限不足,SHOW GRANTS 核對。
  • ERROR 1227 (42000): Access denied; you need SUPER privilege → 操作需 SUPER,如 SET GLOBAL、KILL 他人線程。
copyright © 萬盛學電腦網 all rights reserved